docker日常维护中遇到的问题整理

1、不断的推送相同的版本镜像会造成tag为的垃圾镜像产生,执行以下脚本删除tag为镜像:
docker rmi -f $(docker images | awk '// {print $3}')
2、docker+swarm+etcd集群通过docker-compose启动微服务,偶尔会出现微服务无法启动,提示已经有相同名称的微服务启动,不能重复启动,这里是因为某些微服务被强制删除,但是内有在overlay网络中删除,导致启动不起来,而且overlay自定义网络也无法删除,这里主要是etcd缓存服务器缓存的数据,需要清空etcd数据,然后重启就能够启动微服务了。

启动微服务错误提示:ERROR: for discovery Cannot start service discovery: Error response from daemon: service endpoint with name docker_discovery_1 already exists
删除自定义网络错误提示:Error response from daemon: Error response from daemon: network my-net has active endpoints
分析原因:这样的结果是swarm集群中host节点拉取相同版本镜像的时机不对造成的;例如当前host1节点上有一个镜像test:1.0,而且这个镜像已经在my-net中启动过,如果你现在停掉镜像test:1.0启动的容器,而不删除该容器,接着重新拉取内容有更新但是版本号没变的新镜像test:1.0,新版的镜像就会部分覆盖老版镜像,这个时候如果你执行docker images指令的话,会发现有一个tag为的test镜像,做完这一切你再删除my-net中的容器启动,会发现上面提到的错误,删除网络也会失败;这里应该是my-net中保存的是老版镜像对应的容器数据,但是老版镜像的某些东西被新版镜像覆盖,无法找到了,所以就被卡到这里了,启动不起来新的,删除不了老的。

3、查看某一个docker容器中运行的线程数以及对应的状态,具体可以参考官网,在linux下执行以下命令:

#查看当前启动的容器
docker ps
#定义某一个需要查看的某一容器的PID变量(其中ContainerID为docker ps查看中显示的容器ID)
PID=$(docker inspect --format {{.State.Pid}} ContainerID)
#查看该容器中运行的线程信息
top -Hp $PID
#如果是部署的Java Web服务,可以用下面的命令查看jvm的配置
nsenter --target $PID --mount --uts --ipc --net --pid
jmap -heap 1

4、docker-17.03.0-ce版本相对于docker-1.13.1的一个细节性变化造成的影响

在docker-1.13.1容器中获取服务器IP,得到的结果是容器所在服务器节点的IP
在docker-17.03.0-ce容器中获取的IP,是docker容器在overlay网络中分配的IP
所以如果对使用服务所在节点IP有要求的地方(例如,数据库限制某些网段的IP才能访问)一定要注意了

5、在Docker微服务集群部署并运行的过程中,有可能需要单独重启某一个微服务A以部署最新版本,如果频繁做类似操作,有可能导致微服务B无法访问微服务A所在的容器,也就是说B无法通过网络访问A,甚至无法用B所在容器去Ping通A所在容器,我做了几种尝试,重启微服务B、重启微服务A、重启服务发现微服务貌似都不行,最后尝试反过来Ping一下——用A所在的容器去Ping B所在的容器,结果通信就恢复了——B又可以Ping通A了

你可能感兴趣的:(docker日常维护中遇到的问题整理)