我在使用Docker时遇到问题。 使用的版本:Docker版本18.06.1-ce,在Ubuntu 16.04 LTS上构建e68fc7a。
我正在使用提供docker的子网,以便在同一子网中使用docker容器名称的容器之间进行通信。 目前,我已经看到一种关于容器之间通信的不道德行为。
这是由自动化程序运行的有问题的场景:
我使用命令创建网络:
docker network create --driver=bridge --subnet=172.20.0.0/16 --gateway=172.20.0.1 mynetwork
以创建桥接网络。 然后我用参数
创建几个容器httpd,mysql,tomcat(官方图片)--network=mynetwork
为了允许容器之间使用其名称进行通信。
创建后,我可以使用命令
看到所有包含在我的子网docker中docker network inspect mynetwork
然后,因为在更改tomcat或http上的配置并部署war之后,我们需要停止/启动并重新启动某些容器。 使用docker start / stop或docker restart命令 例子:
docker restart httpd
问题在于,尽管名称正确解析且ip正常,但有时子网中的任何容器都无法通信,甚至ping命令也没有响应。
解决此问题的唯一方法是使用
重新启动docker服务systemctl restart docker
以便能够检索容器之间的正确通信,直到下次问题再次发生为止。
您能给我关于这种行为和Docker子网的线索吗?
我昨天添加了一个码头工人,检查我的网络,以查看每次停止/启动或重启后是否已将容器正确添加到网络中
这里有更多有关暗示该行为的操作的详细信息。我设置了部署以及导致这种情况的所有操作的踪迹:
1创建一个代理容器,该容器可以调用网络中的所有容器
docker run -d --name agent myagent
创建2个网络
docker network create -o com.docker.network.bridge.name=mynetwork --drive=bridge --subnet=172.20.0.0/16 --gateway=172.20.0.1 mynetwork
3连接我的代理人
docker network connect my network agent
4拉MySQL
docker pull mysql
5创建mysql
docker create --name mysql --restart always --ip 172.20.0.50 --network= mynetwork -v /root/test/mysql/lib/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=muiligA mysql
6启动mysql
docker start mysql
7拉httpd
docker pull httpd
8创建http
docker create --name httpd --restart always -p 80:80 -p 443:443 -v /root/test/httpd/conf/vhosts:/usr/local/apache2/conf/vhosts -v /root/test/httpd/htdocs:/usr/local/apache2/htdocs -v /root/test/letsencrypt:/etc/letsencrypt httpd
9开始httpd
docker start httpd
10将http连接到网络
docker network connect mynetwork httpd
11拉雄猫
docker pull tomcat
12创建tomcat
docker create --name tomcat --restart always --network=mynetwork --ip 172.20.0.10 -v /root/test/tomcat/webapps:/usr/local/tomcat/webapps -v /root/test/tomcat/conf:/usr/local/tomcat/conf/applicaton -v /root/test/logs:/usr/local/logs tomcat
13启动Tomcat
docker start tomcat
例如,当我们从httpd容器中检查与tomcat的连接时,ping似乎没有响应。
关于日志,我意识到我多次错误地启动了docker连接mynetwork代理,即使该代理已经连接到网络,也多次启动。在这种情况下,我得到的消息是该代理已经连接到网络。这个动作可以暗示这种行为吗?
我将在每次重新启动和启动容器之后添加检查,以确保该容器位于docker子网中,并为您提供跟踪和每个命令的答案(如果我重现错误的原因)。