Проблема подсети Docker на Docker 18
Я столкнулся с проблемой во время моего использования докера. Используемая версия: Docker версия 18.06.1-ce, сборка e68fc7a на Ubuntu 16.04 LTS.
Я использую подсеть, которая предоставляет 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 network inspect mynetwork
Тогда, потому что нам нужно остановить / запустить и перезапустить определенный контейнер после изменения конфигурации на tomcat или http и развертывания war. с помощью примера запуска / остановки docker или команды перезапуска docker:
docker restart httpd
Проблема заключается в том, что иногда ни один контейнер в подсети не может обмениваться данными, и даже команда ping не отвечает, хотя имя правильно разрешено и IP-адрес в порядке.
Единственный способ решить эту проблему - перезапустить службу 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 создать кот
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 начало кот
docker start tomcat
это когда мы проверяем из контейнера httpd, например, соединение с tomcat, кажется, что пинг не отвечает.
Что касается моего журнала, я понимаю, что неправильно запускаю несколько раз, когда докер подключает агент mynetwork, несколько раз, даже если агент уже подключен к сети. В этом случае я получил сообщение, что агент уже подключен к сети. Может ли это действие подразумевать такое поведение?
Я добавлю проверку после каждого перезапуска и запуска контейнера, чтобы убедиться, что контейнер находится в подсетевой подсистеме док-станции, и дам вам трассировку и ответ для каждой команды, если я воспроизведу ошибку, как ее причину.