도커 호스트가 있고 내부에는 컨테이너가 하나 있습니다.
Docker 호스트는 IPv4가 아닌 IPv6 인터페이스에서만 포트를 바인딩합니다.
이것은 출력입니다
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 -
이제 컨테이너의 포트 22와 연결할 호스트에 40122 포트가 있습니다.
해당 컨테이너에 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
답변
@ daniel-t가 주석에서 지적했듯이 github.com/docker/docker/issues/2174 는에서 IPv6에 대한 바인딩 만 표시하는 것에 관한 netstat
것이지만 이는 문제가 아닙니다. github 문제는 다음과 같이 말합니다.
프록시를 설정할 때 Docker는 루프백 주소 ‘127.0.0.1’을 요청하고 Linux는 이것이 IPv6에 존재하는 주소 (:: 0)이고 두 주소 모두에서 열립니다 (그러나 공식적으로는 IPv6 소켓 임). netstat를 실행하면이를보고 IPv6임을 알려줍니다.하지만 여전히 IPv4에서 수신 대기 중입니다. 설정을 약간 사용했다면 net.ipv6.bindv6only = 1로 설정하여 Linux가 수행하는이 트릭을 비활성화했을 수 있습니다.
즉, IPv6로만 표시되기 때문에 net.ipv6.bindv6only 설정으로 IPv6에서만 바인딩하도록 IPv6를 설정하지 않는 한 IPv4에서 계속 통신 할 수 있습니다. 명확하게하기 위해 net.ipv6.bindv6only는 0이어야합니다 sysctl net.ipv6.bindv6only
. 실행 하여 확인할 수 있습니다 .
답변
설정 net.ipv6.conf.all.forwarding=1
하면 문제가 해결됩니다.
이것은 라이브 시스템에서 다음을 사용하여 수행 할 수 있습니다.
sudo sysctl -w net.ipv6.conf.all.forwarding=1
답변
기본적으로 docker는 IPv4 및 IPv6 연결 모두에 사용할 수있는 AF_INET6 소켓을 사용합니다. 이로 인해 netstat는 수신 주소에 대한 IPv6 주소를보고합니다.
답변
컨테이너 포트가 ipv4 주소에 바인딩되도록하려면 다음을 수행하십시오.
- 설정 파일 찾기
- / etc / sysconfig / docker-network on RedHat 유사
- / etc / default / docker-network on Debian ans alike
- 네트워크 설정 편집
- DOCKER_NETWORK_OPTIONS = -ip = xx.xx.xx.xx 추가
- xx.xx.xx.xx는 실제 ipv4 (0.0.0.0이 아님)입니다.
- 도커 데몬 다시 시작
도커 1.9.1에서 나를 위해 작동합니다.
답변
SELinux를 비활성화 한 후 도커 컨테이너에 액세스 할 수있었습니다.
SELinux를 일시적으로 비활성화하려면 #sudo setenforce 0
내 Docker 컨테이너가 Centos-7에서 실행 중이었습니다.