Докер не будет связываться с адресом; говорит, что он используется, но это не так - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь привязать два порта из контейнера докера к неиспользуемому в данный момент IP-адресу на одном из интерфейсов хост-машины.

Я пытаюсь запустить контейнер (который основан на изображении centos / systemd) следующим образом:

sudo docker run --privileged -d -p 172.19.5.1:22:22 -p 172.19.5.1:5432:5432 --name test --hostname test -v /sys/fs/cgroup:/sys/fs/cgroup:ro --net cdnet image_name

и сообщение об ошибке: Error starting userland proxy: listen tcp 172.19.5.1:22: bind: address already in use.

Из настроек сети видно, что этот адрес должен быть полностью действительным:

[
    {
        "Name": "cdnet",
        "Id": "c7f58c7f7765b7ee85ffd7638d98c1f73d0abf2393635d26d9634ac94e1c05e9",
        "Created": "2018-04-27T20:40:44.542040471Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.19.0.0/16",
                    "Gateway": "172.19.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

и для хорошей цели я создал IP на главном сетевом интерфейсе моей машины:

6: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 9000 qdisc noqueue state UP qlen 1000
    link/ether 0c:c4:7a:8e:f4:f2 brd ff:ff:ff:ff:ff:ff
    inet 69.241.118.34/30 brd 69.241.118.35 scope global bond0
       valid_lft forever preferred_lft forever
    inet 69.241.118.0/30 scope global bond0
       valid_lft forever preferred_lft forever
    inet 69.241.118.4/30 scope global bond0
       valid_lft forever preferred_lft forever
    inet 172.19.5.1/25 scope global bond0
       valid_lft forever preferred_lft forever
    inet 69.241.118.1/30 scope global secondary bond0
       valid_lft forever preferred_lft forever
    inet 69.241.118.2/30 scope global secondary bond0
       valid_lft forever preferred_lft forever
    inet 69.241.118.3/30 scope global secondary bond0
       valid_lft forever preferred_lft forever
    inet6 2001:558:fee8:17a:ec4:7aff:fe8e:f4f2/64 scope global deprecated mngtmpaddr dynamic 
       valid_lft 1974996sec preferred_lft 0sec
    inet6 2001:558:fee8:17a::2/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::ec4:7aff:fe8e:f4f2/64 scope link 
       valid_lft forever preferred_lft forever

У меня нет других работающих контейнеров (sudo docker ps -aq ничего не возвращает), и я точно знаю, что никакой другой процесс не использует этот адрес - вот мой вывод для sudo netstat -anlp (без раздела сокетов домена Unix):

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:199           0.0.0.0:*               LISTEN      1406/snmpd          
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      1/systemd           
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN      1763/dnsmasq        
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1397/sshd           
tcp        0      0 0.0.0.0:1691            0.0.0.0:*               LISTEN      31215/perl          
tcp        0      0 0.0.0.0:5662            0.0.0.0:*               LISTEN      31215/perl          
tcp6       0      0 :::111                  :::*                    LISTEN      1/systemd           
tcp6       0      0 :::22                   :::*                    LISTEN      1397/sshd           
tcp6       0    920 <IP REDACTED>:22 <IP REDACTED> ESTABLISHED 22357/sshd: <USERNAME REDACTED> 
tcp6       0      0 <IP REDACTED>:22 <IP REDACTED> ESTABLISHED 22099/sshd: <USERNAME REDACTED> 
udp        0      0 0.0.0.0:53763           0.0.0.0:*                           1406/snmpd          
udp        0      0 0.0.0.0:57647           0.0.0.0:*                           1406/snmpd          
udp        0      0 192.168.122.1:53        0.0.0.0:*                           1763/dnsmasq        
udp        0      0 0.0.0.0:67              0.0.0.0:*                           1763/dnsmasq        
udp        0      0 0.0.0.0:111             0.0.0.0:*                           17684/rpcbind       
udp        0      0 0.0.0.0:161             0.0.0.0:*                           1406/snmpd          
udp        0      0 0.0.0.0:162             0.0.0.0:*                           2589/snmptrapd      
udp        0      0 0.0.0.0:892             0.0.0.0:*                           17684/rpcbind       
udp        0      0 0.0.0.0:35179           0.0.0.0:*                           1406/snmpd          
udp6       0      0 :::111                  :::*                                17684/rpcbind       
udp6       0      0 :::892                  :::*                                17684/rpcbind

(Разумеется, ни один отредактированный IP-адрес не является тем, к которому я пытаюсь привязаться; это настоящие внешние IPv6-адреса меня и машины.)

Все результаты публикации портов док-контейнера, которые я могу найти в своих поисках, просто пытаются привязать порт к localhost, и я действительно не могу понять, почему это происходит. Система представляет собой CentOS Linux версии 7.4.1708 (Core), Docker версии 17.05.0-ce, сборка 89658be

ПРИМЕЧАНИЕ: я пробовал как с EXPOSE 22 5432, так и без него в Dockerfile, и я пробовал разные IP-адреса (которые вы можете увидеть в выводе ip addr выше).

1 Ответ

0 голосов
/ 28 апреля 2018

0.0.0.0 означает «все интерфейсы ipv4», так что да, он уже используется в этой строке вашего вывода:

tcp      0    0 0.0.0.0:22      0.0.0.0:*       LISTEN    1397/sshd           
...