Нет доступа к интернету в докере
Я не могу связаться с внешней сетью из контейнеров-контейнеров.
Рассмотрим следующий файл для создания докере:
version: '2'
services:
nginx:
image: nginx
Используя простой docker run -it nginx bash
, мне удается достичь внешних IP-адресов или IP-адресов (ping www.google.com
).
С другой стороны, если я использую docker-compose и присоединяюсь к контейнеру, я не могу получить внешние IP-адреса/DNS.
Информация о докере:
Containers: 0
Running: 0
Paused: 0
Stopped: 0
Images: 1
Server Version: 1.12.1
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 7
Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: bridge null host overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Security Options: apparmor seccomp
Kernel Version: 4.4.0-38-generic
Operating System: Ubuntu 16.04.1 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 3.859 GiB
Name: ***
ID: ****
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
WARNING: No swap limit support
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
Insecure Registries:
127.0.0.0/8
docker-compose 1.8.1, build 878cff1
Файл daemon.json:
{
"iptables" : false,
"dns" : ["8.8.8.8","8.8.4.4"]
}
Ответы
Ответ 1
В прошлый раз, когда у меня была такая проблема, я решил ее так:
https://github.com/docker/docker/issues/866#issuecomment-19218300
pkill docker
iptables -t nat -F
ifconfig docker0 down
brctl delbr docker0
docker -d
Это заставит Docker воссоздать мост и переустановить все сетевые правила.
Что касается причин, почему это происходит, у меня нет хороших ответов. Но я недавно проследил проблему до journald
. Когда я перезапускаю journald
(например, потому что я изменил его конфигурацию), разрешение DNS внутри контейнеров docker-compose последовательно/воспроизводимо нарушается. Я не знаю, почему именно, я могу только сказать, что это надежный способ для меня воспроизвести его на RHEL.
РЕДАКТИРОВАТЬ Команда docker -d
может не работать для вас в зависимости от используемой версии докера, но не беспокойтесь об этом, вы можете пропустить эту команду.
Ответ 2
Изображение nginx
, которое вы вытаскиваете, по умолчанию не установлено ping
. Поэтому, если вы действительно используете ping для проверки своего соединения, вы должны сначала установить его.
Я создал настраиваемый файл Docker для его установки:
FROM nginx:latest
RUN apt update && apt -y install iputils-ping
Затем я построил его локально и помечен как mynginx
.
Затем я изменил docker-compose.yml
на использование пользовательского образа mynginx
:
version: '2'
services:
nginx:
image: mynginx
Наконец, я уволил docker-compose up
и сделал в нем докер-exec, и протестировал ping. Все работало отлично. Я также сделал docker run -ti ...
, и он сработал.
Что меня беспокоит в вопросе, так как docker run
может предоставить вам контейнер с другим поведением, чем если бы он был создан docker-compose up
.
Более ясная информация о том, как вы проверяете доступ в Интернет, будет полезной.
Ответ 3
Проверьте /etc/default/docker
чтобы убедиться, что в нем нет следующей строки:
DOCKER_OPTS="--iptables=false"
Также проверьте /etc/docker/daemon.json
чтобы убедиться, что у него нет следующего ключа:
{
"iptables":false
}
Мы добавили это на один сервер, чтобы UFW работал с докером. Затем мы перешли на внешний брандмауэр. Много лет искали причину, по которой внешняя сеть не работала, потому что она была удалена из нашего руководства по развертыванию. Надеюсь, это поможет кому-то еще.
Ответ 4
Докеры-контейнеры имеют доступ к Интернету по умолчанию.
Вот как я решил проблему на прошлой неделе: контейнер докеров может получить доступ только к интернету с сетевым хостом
Или вы просто разрешите контейнер в режиме хоста:
version: '2'
service:
nginx:
image: nginx
network_mode: host
Но поскольку @peedee указал на комментарий, это решение потеряет разделение сети между хостом и контейнерами.