Docker 18上的Docker子网问题

时间:2018-09-26 15:27:44

标签: docker docker-container docker-network

我在使用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子网中,并为您提供跟踪和每个命令的答案(如果我重现错误的原因)。

0 个答案:

没有答案