Я пытаюсь привязать два порта из контейнера докера к неиспользуемому в данный момент 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
выше).