docker 容器在封装的时候一般只会安装程序需要的软件包。一些工具类的软件包不会安装的,这样容器会很大。也不常用,无意义。
但是这样如果容器有问题,或想查看一些信息,如网络信息、文件内容、抓包等。这样就没办法做到了。
下面说一种方法,容器共享进程、网络资源,可以用用 –pid、–ipc、–net 等参数
这样就可以查看容器的进程信息、网络、文件等事情了。
首先,运行一个容器:
1 | docker run -d -p 7080:80 nginx:latest |
运行一个nginx容器,
直接用 docker exec 进到容器里的时候, 是不能用iptables、ps、vim等命令的。
获取容器ID
1 | docker ps |
我们开始进入到容器
1 | CID=b99f5509819c |
CID 是容器 ID, 后面都用 $CID 来代替
- alpine-tools:latest 是自己做的镜像, 可以把常用的命令放在里面,如(iptables、tcpdump、vim等)
这样,容器的网络、磁盘、进程都和你启动这个容器共享了,所以就可以实时查看nginx容器里的信息。
运行ps 就可以看到nginx的进程了
1 | / # ps |
运行tcpdump 就可以实时抓包了
1 | / # tcpdump -XX -A |
但是这个时候运行 iptables 还是不行的, 提示没有权限
1 | / # iptables -n -L |
需要运行工具容器的时候提权才能行,添加 privileged 参数。 如:
1 | docker run -it --privileged --net=container:$CID --ipc=container:$CID --pid=container:$CID alpine-tools:latest |
运行 iptables 命令 (返回结果类似于这样)
1 | # iptables -t nat -nL |
如果你的容器是 -v 挂载volume 启动的话
容器启动:
1 | docker run -d -p 7080:80 nginx:latest |
可以用下面的方式查看 volume 里数据。
1 | docker run -it --privileged --net=container:$CID --ipc=container:$CID --pid=container:$CID --volumes-from $CID:ro alpine-tools:latest |
这样就可以查看 volume 里的数据了,
- 如果你的volume是NFS、ceph等网络存储,你可以这样做来吧数据备份到本地。
1 | docker run --volumes-from $CID -v $(pwd):/backup alpine-tools:latest tar cvf /backup/backup.tar /home |
另外 还有其他方式可以查看容器的方式,简单介绍一下。
nsenter 方式
nsenter 需要做的容器里的进程 PID 的,
1 | PID=$(docker inspect --format '{{.State.Pid}}' $CID) |
这样就可以进图到容器里了。
这样的你程序镜像就不用安装一下系统工具的软件包了。 有问题可以用这一种容器共享的方式来排查了。