Подтвердить что ты не робот

Нет доступа к интернету в докере

Я не могу связаться с внешней сетью из контейнеров-контейнеров.

Рассмотрим следующий файл для создания докере:

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"]
}
4b9b3361

Ответ 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 указал на комментарий, это решение потеряет разделение сети между хостом и контейнерами.