Docker Container не может подключиться к Интернету

У меня есть экземпляры Docker Containers на AWS EC2, контейнеры Docker подключены через сеть Docker, которая реплицируется через кластер etcd. Но все контейнеры не могут подключаться снаружи. Например, если я пингую или скручиваю хост, пакеты теряются на 100%. Сеть etcd обменивается данными через частный IP-адрес AWS.

Вот моя информация о докере:

root@ip-10-0-127-34:/home# docker info
Containers: 3
 Running: 3
 Paused: 0
 Stopped: 0
Images: 9
Server Version: 17.05.0-ce
Storage Driver: devicemapper
 Pool Name: docker-202:1-2050903-pool
 Pool Blocksize: 65.54kB
 Base Device Size: 10.74GB
 Backing Filesystem: xfs
 Data file: /dev/loop0
 Metadata file: /dev/loop1
 Data Space Used: 4.554GB
 Data Space Total: 107.4GB
 Data Space Available: 102.8GB
 Metadata Space Used:sattler 6.922MB
 Metadata Space Total: 2.147GB
 Metadata Space Available: 2.141GB
 Thin Pool Minimum Free Space: 3.221GB
 Udev Sync Supported: true
 Deferred Removal Enabled: false
 Deferred Deletion Enabled: false
 Deferred Deleted Device Count: 0
 Data loop file: /var/lib/docker/devicemapper/devicemapper/data
 Metadata loop file: /var/lib/docker/devicemapper/devicemapper/metadata
 Library Version: 1.02.110 (2015-10-30)
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins: 
 Volume: local
 Network: bridge host macvlan null overlay
Swarm: inactive
Runtimes: runc
Default Runtime: runc
Init Binary: docker-init
containerd version: 9048e5e50717ea4497b757314bad98ea3763c145
runc version: 9c2d8d184e5da67c95d601382adf14862e4f2228
init version: 949e6fa
Security Options:
 apparmor
 seccomp
  Profile: default
Kernel Version: 4.4.0-1028-aws
Operating System: Ubuntu 16.04.3 LTS
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 7.303GiB
Name: ip-10-0-127-34
ID: JFQO:C56I:VM22:UDKJ:QDKD:HUDT:KL3X:JCSR:WAPG:66JL:S4RM:4ENN
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: false
Cluster Store: etcd://127.0.0.1:2379
Cluster Advertise: 10.0.127.34:2376
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

WARNING: devicemapper: usage of loopback devices is strongly discouraged for production use.
         Use `--storage-opt dm.thinpooldev` to specify a custom block storage device.
WARNING: No swap limit support

Докер проверяет сеть:

     {
    "Name": "df-global",
    "Id": "59aef8ccc5d7464ee715428783b9b03ba7737d298f41cc30a21f4856e75b92c1",
    "Created": "2017-08-14T09:51:31.650109966Z",
    "Scope": "global",
    "Driver": "overlay",
    "EnableIPv6": false,
    "IPAM": {
        "Driver": "default",
        "Options": {},
        "Config": [
            {
                "Subnet": "192.168.1.0/14"
            }
        ]
    },
    "Internal": false,
    "Attachable": false,
    "Ingress": false,
    "Containers": {

     "ep-f257d697653d801395f9154d086a6290694d6ded7aefe827c67dcd10808023eb": {
            "Name": "elasticsearch-data-1",
            "EndpointID": "f257d697653d801395f9154d086a6290694d6ded7aefe827c67dcd10808023eb",
            "MacAddress": "02:42:c0:a8:00:0b",
            "IPv4Address": "192.168.0.11/14",
            "IPv6Address": ""
        },
        "ep-f5c1be7a768802154b58b33e67a3f009df1d4f1336297df9f914be9a720bd8ce": {
            "Name": "postgresql-vg_internal01-prod",
            "EndpointID": "f5c1be7a768802154b58b33e67a3f009df1d4f1336297df9f914be9a720bd8ce",
            "MacAddress": "02:42:c0:a8:00:02",
            "IPv4Address": "192.168.0.2/14",
            "IPv6Address": ""

Та же проблема описана здесь: 9960" rel="nofollow noreferrer">https://forums.docker.com/t/ping-between-containers-on-other-docker-host-but-connected-by-overlay-networ-fails/9960 но ответа нет


person ghovat    schedule 13.08.2017    source источник


Ответы (4)


Я по-прежнему мог ping 172.17.2.1, и все же это был единственный IP-адрес, с которым я мог связаться из контейнера. Оказывается, кто-то/что-то очистил брандмауэр iptables и заменил каждую цепочку в каждой таблице правилами ACCEPT по умолчанию! Все правила docker nat и forwarding отсутствовали. Быстрая перезагрузка решила проблему.

Временным решением было использование параметра командной строки docker --network 'host'.

person user3338098    schedule 01.02.2019

Запустить на хост-машине:

sudo ip addr show docker0 

Вы получите результат, который включает в себя:

inet 172.17.2.1/16 scope global docker0

Хост докера имеет IP-адрес 172.17.2.1 на сетевом интерфейсе docker0.

Затем запустите контейнер:

docker run --rm -it ubuntu:trusty bash 

и беги

ip addr show eth0

вывод будет включать:

inet 172.17.1.29/16 scope global eth0

Ваш контейнер имеет IP-адрес 172.17.1.29. Теперь смотрим на таблицу маршрутизации: запускаем:

route

вывод будет включать:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         172.17.2.1     0.0.0.0         UG    0      0        0 eth0

Это означает, что IP-адрес узла докера 172.17.2.1 установлен в качестве маршрута по умолчанию и доступен из вашего контейнера.

попробуйте пропинговать сейчас IP-адрес вашего хост-компьютера:

root@e21b5c211a0c:/# ping 172.17.2.1
PING 172.17.2.1 (172.17.2.1) 56(84) bytes of data.
64 bytes from 172.17.2.1: icmp_seq=1 ttl=64 time=0.071 ms
64 bytes from 172.17.2.1: icmp_seq=2 ttl=64 time=0.211 ms
64 bytes from 172.17.2.1: icmp_seq=3 ttl=64 time=0.166 ms 

Если это сработает, скорее всего, вы сможете пропинговать любой общедоступный IP-адрес.

Надеюсь, это поможет!

person Shashi Bhushan    schedule 13.08.2017
comment
Спасибо за Ваш ответ. Если я попытаюсь пропинговать локальный хост, я получу пакет, потерянный на 100%, и информацию о том, что целевой хост недоступен root@be845f307ee6:/# ping 172.17.2.1 PING 172.17.2.1 (172.17.2.1) 56(84) bytes of data. From 172.17.0.3 icmp_seq=1 Destination Host Unreachable From 172.17.0.3 icmp_seq=2 Destination Host Unreachable From 172.17.0.3 icmp_seq=3 Destination Host Unreachable ^C --- 172.17.2.1 ping statistics --- 5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4022ms pipe 3 - person ghovat; 14.08.2017
comment
Попробуйте другой ответ .. если все еще не повезло .. я помогу вам сделать ваши таблицы маршрутов и исправить сеть, чтобы иметь возможность пинговать хост - person Shashi Bhushan; 14.08.2017
comment
Я изменил Docker Network на docker network create -d overlay --subnet 192.168.1.0/14 df-global Теперь я могу скручивать или пинговать google.com и сайты снаружи, но если я попытаюсь подключиться или пропинговать другие контейнеры в сеть я потерял пакет. Например, ping db01-prod, который является док-контейнером. И я вижу контейнер, если я проверяю сеть докеров ИМЯ - person ghovat; 14.08.2017
comment
Эти контейнеры являются частью одного кластера ?? - person Shashi Bhushan; 14.08.2017
comment
да, если я проверю сеть, вы обнаружите, что они добавили это в вопрос - person ghovat; 14.08.2017
comment
что, вероятно, вы можете сделать, так это создать сеть и подключить все свои контейнеры к вашей сети. - person Shashi Bhushan; 14.08.2017
comment
Контейнеры уже существуют в сети. Итак, с помощью $ docker inspect NETWORK я вижу все сети. Но если я пропингую IP-адрес контейнера или имя контейнера, я потеряю пакет. - person ghovat; 14.08.2017
comment
Давайте продолжим это обсуждение в чате. - person Shashi Bhushan; 14.08.2017

Однако есть альтернатива ... если вы не хотите возиться с сетевыми маршрутами ... поэтому при запуске вашего контейнера попробуйте Docker поддерживает привязку файлов с хоста к контейнеру. Вы можете привязать сокет управления Docker.

docker run -v /var/run/docker.sock:/var/run/docker.sock ...usual code here...

Надеюсь, это поможет!

person Shashi Bhushan    schedule 14.08.2017
comment
Я изменил Docker Network на docker network create -d overlay --subnet 192.168.1.0/14 df-global Теперь я могу скручивать или пинговать google.com и сайты снаружи, но если я попытаюсь подключиться или пропинговать другие контейнеры в сеть я потерял пакет. Например, ping db01-prod, который является док-контейнером. И я вижу контейнер, если я проверяю сеть докеров ИМЯ - person ghovat; 14.08.2017

Чтобы разрешить контейнерам общаться друг с другом: создайте сеть

docker network create <your-network-name>

затем подключите все свои контейнеры к вновь созданной сети.

docker network connect <your-network-name> <containers>

Надеюсь, это поможет!

person Shashi Bhushan    schedule 14.08.2017
comment
Привет, спасибо за ответ. С помощью этого я создал сеть $ docker network create -d overlay --subnet 192.168.1.0/14 df-global и подключил все контейнеры. В сети докеров проверьте NETWORK в начальном вопросе, вы увидите подключенные контейнеры, но если я запущу один из контейнеров и попытаюсь пропинговать один из других контейнеров, которые находятся в сети, я получу потерю пакета 100%, и они не могут общаться . Ни если я не попробую имя контейнера или IP-адрес контейнера из проверки докеров - person ghovat; 14.08.2017