Я столкнулся с проблемой при использовании докера.Используемая версия: 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 start / stop или docker restart например:
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 pull mysql
docker pull mysql
5 create 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 start mysql
docker start mysql
7 pull httpd
docker pull httpd
8 create 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 start httpd
docker start httpd
10 подключение http к сети
docker network connect mynetwork httpd
11 pull tomcat
docker pull tomcat
12 create 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 start tomcat
docker start tomcat
это когда мы проверяем из контейнера httpdнапример, соединение с tomcat, которое кажется, что пинг не отвечает.
По своему журналу я понял, что несколько раз ошибочно запускаю докер, подключив агент mynetwork, несколько раз, даже если агент уже подключен к сети.В этом случае я получил сообщение, что агент уже подключен к сети.Может ли это действие подразумевать такое поведение?
Я добавлю проверку после каждого перезапуска и запуска контейнера, чтобы убедиться, что контейнер находится в подсетевой подсистеме док-станции, и дам вам трассировку и ответ для каждой команды, если я воспроизведу ошибку, поскольку она ошибочна.