[ubuntu] Docker가 포트 바인딩에 IPv4를 사용하도록 설정

도커 호스트가 있고 내부에는 컨테이너가 하나 있습니다.

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 주소를보고합니다.

RedHat에서
https://access.redhat.com/solutions/3114021


답변

컨테이너 포트가 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에서 실행 중이었습니다.


답변