Я только что столкнулся с этим. Запустив любой контейнер с docker run -it <image> bash
, я мог делать все, что было связано с сетью, что мне было нужно, но подключение к контейнеру, запущенному через docker-compose с docker exec -it <conatiner> bash
, ничего не могло запустить. Даже apt-get
выйдет из строя из-за временного сбоя в ошибке разрешения имен.
Я обнаружил, что добавление network_mode: "bridge"
к каждой службе позволит включить внешнюю сеть в каждом контейнере за счет подключения всего к сети докеров по умолчанию. Однако я хотел сохранить стек изолированным, поэтому выбрал альтернативное решение.
Я запустил docker inspect network bridge
, чтобы просмотреть сеть по умолчанию, и то же самое с моей сетью стека. Единственными существенными различиями, которые я обнаружил, была разница в подсети / шлюзе (что, я считаю, вполне ожидаемо, однако перечисленные IP-адреса различались значительно, 192. * против 172. *), и что сеть по умолчанию имел несколько опций, которых не было в стековой сети:
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
Мне удалось изолировать его от "com.docker.network.bridge.default_bridge": "true"
, однако это нарушило сеть для контейнеров вне стека, до такой степени, что мне в конечном итоге пришлось полностью удалить и переустановить докер. Я предполагаю, что демон докера путается с двумя сетями, отмеченными как стандартные, и не может разрешить его даже после удаления сети стека.
Одна вещь, которую я заметил после этого, заключалась в том, что подсеть и выход были просто отключены от адаптера по умолчанию. Я подтвердил, что удаление вышеуказанного параметра вернуло подсеть и шлюз к тому, что я видел изначально, что он и сделал. Затем я использовал эту сетевую конфигурацию в своем файле создания:
networks:
default:
driver: "bridge"
ipam:
driver: default
config:
- subnet: X.X.0.0/16
Где первое значение подсети было таким же, как у адаптера моста по умолчанию, а второе значение было плюс один. И это, по крайней мере, заставило все работать нормально, за исключением того, что адаптер по умолчанию все еще сломан.
Интересно, что когда я переустановил докер, чтобы попытаться восстановить сеть по умолчанию, я в основном выполнил следующее после просмотра docker составляет сетевую документацию для внешней сети.
sudo snap remove docker
sudo sysctl net.ipv4.conf.all.forwarding=1
sudo iptables -P FORWARD ACCEPT
sudo snap install docker
И последующий docker-compose up -d
с удаленными сетевыми настройками привел к тому же IP-адресу подсети, который я определил ранее, без наличия для него конфигурации. Я считаю, что основная проблема заключается просто в том, что что-то мешало демону докера правильно найти доступную действительную подсеть, и как только это будет решено, все должно снова работать из коробки.
person
shmeeps
schedule
22.06.2021
docker exec -it <container-name> ping google.com
? Это должно сработать. - person Bernard   schedule 05.10.2016docker inspect <container-id>
для обоих контейнеров? - person Robert   schedule 11.07.2017