У меня есть докер-хост, а внутри - один контейнер.
Хост докера привязывает порт только к интерфейсу IPv6, а не к IPv4.
Это результат
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:55082 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN -
tcp6 0 0 :::80 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 :::40280 :::* LISTEN -
tcp6 0 0 :::5432 :::* LISTEN -
tcp6 0 0 :::40122 :::* LISTEN -
tcp6 0 0 :::36378 :::* LISTEN -
tcp6 0 0 :::40543 :::* LISTEN -
tcp6 0 0 :::111 :::* LISTEN -
Теперь у меня есть порт 40122 на хосте для связи с портом 22 на контейнере.
Я хочу подключиться к этому контейнеру по SSH, но не могу, поскольку он привязан только к IPv6
Это моя версия докера Docker version 1.5.0, build a8a31ef
docker ps
201bde6c839a myapp:latest "supervisord -n" 3 weeks ago Up 2 hours 0.0.0.0:40122->22/tcp, 0.0.0.0:40280->80/tcp, 0.0.0.0:40543->443/tcp myapp
Я побежал, используя docker run -d -P -p 40122:22
netstat -tlna
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:3031 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::6379 :::* LISTEN
ps aux
root 1 0.0 0.8 52440 16668 ? Ss 00:53 0:03 /usr/bin/python /usr/bin/supervisord -n
root 49 0.0 0.1 17980 3048 ? S 01:32 0:00 bash
root 64 0.0 0.1 46632 2712 ? S 01:32 0:00 su -l vagrant
vagrant 65 0.0 0.1 21308 3760 ? S 01:32 0:00 -su
root 288 0.0 0.1 17980 3088 ? S 02:01 0:00 bash
root 304 0.0 0.1 46632 2720 ? S 02:01 0:00 su -l vagrant
vagrant 305 0.0 0.1 21304 3804 ? S 02:01 0:00 -su
vagrant 308 0.0 3.7 429616 75840 ? Sl+ 02:01 0:05 python ./manage.py shell_plus
root 654 0.0 0.4 47596 9848 ? S 03:12 0:01 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root 655 0.0 0.3 90280 7732 ? S 03:12 0:00 nginx: master process /usr/sbin/nginx
www-data 656 0.0 0.1 90600 3624 ? S 03:12 0:00 nginx: worker process
www-data 657 0.0 0.1 90600 3624 ? S 03:12 0:00 nginx: worker process
www-data 658 0.0 0.1 90600 3624 ? S 03:12 0:00 nginx: worker process
www-data 659 0.0 0.2 90940 4500 ? S 03:12 0:00 nginx: worker process
root 660 0.0 0.2 61372 5332 ? S 03:12 0:00 /usr/sbin/sshd -D
root 669 0.0 0.4 37004 8892 ? Sl 03:12 0:01 redis-server *:6379
root 856 8.0 2.8 388720 57792 ? Sl 04:07 0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root 857 8.0 2.8 388720 57792 ? Sl 04:07 0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root 858 8.0 2.8 388720 57792 ? Sl 04:07 0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
root 859 8.0 2.8 388720 57792 ? Sl 04:07 0:18 /usr/local/bin/uwsgi --die-on-term --ini /var/www/conf/uwsgi.ini
vagrant 889 0.0 0.1 18692 2508 ? R+ 04:11 0:00 ps aux
docker ps
когда контейнер работает.docker exec -ti 201bde6c839a /bin/bash
, как только вы войдете, опубликуйте результатps aux
иnetstat -taln
Ответы:
Как указывает @ daniel-t в комментарии: github.com/docker/docker/issues/2174 показывает привязку только к IPv6
netstat
, но это не проблема. Как говорится в этой проблеме на github:Другими словами, только потому, что вы видите его только как IPv6, он все еще может взаимодействовать по IPv4, если только у вас не настроен IPv6 для привязки только к IPv6 с параметром net.ipv6.bindv6only. Чтобы было ясно, net.ipv6.bindv6only должен быть 0 - вы можете запустить
sysctl net.ipv6.bindv6only
для проверки.источник
Настройка
net.ipv6.conf.all.forwarding=1
устранит проблему.Это можно сделать в живой системе, используя
sudo sysctl -w net.ipv6.conf.all.forwarding=1
источник
sysctl net.ipv6.bindv6only=0
так, что изменение этой конфигурации не помогло.По умолчанию docker использует сокеты AF_INET6, которые можно использовать как для соединений IPv4, так и для IPv6. Это заставляет netstat сообщать IPv6-адрес для адреса прослушивания.
Из RedHat https://access.redhat.com/solutions/3114021
источник
Если вы хотите, чтобы порты вашего контейнера привязывались к вашему IPv4-адресу, просто:
у меня работает на докере 1.9.1
источник
РЕШЕНИЕ ВОПРОСА :
ИСПОЛЬЗОВАТЬ
docker run -it -p 80:80 --name nginx --net=host -d nginx
это проблема, с которой мы сталкиваемся с виртуальной машиной некоторое время, вместо того, чтобы использовать мостовую сеть, попробуйте выбрать хост, который будет работать для вас
источник
Я смог получить доступ к контейнеру докеров после отключения SELinux
Чтобы временно отключить SELinux
#sudo setenforce 0
Мои докер-контейнеры работали на Centos-7
источник