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


97

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

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

컨테이너를 시작하는 데 사용한 명령은 무엇입니까? 또한 docker ps컨테이너가 실행 중일 때 의 출력을 게시하십시오 .
다니엘 t.

sshd가 실제로 컨테이너에서 실행되고 있는지 확인할 수 있습니까? 를 실행 docker exec -ti 201bde6c839a /bin/bash하고 들어가면 ps aux andnetstat -taln
Daniel t

내 Docker 호스트에서 모든 Docker 포트는 IPv6에서 수신하고 있으며 컨테이너의 ssh에 연결하는 데 문제가 없습니다.
다니엘 t.

@Danielt. 정보를 추가했습니다. exec를 사용하여 SSH를 사용할 수 있지만 Mac에서 호스트 포트 40122를 사용하여 외부에서 컨테이너로 직접 SSH를 수행 할 수 없습니다
user3214546 2015

이 문제가 발생할 수 있습니다. github.com/docker/docker/issues/2174 , 해결되었는지 확실하지 않습니다. ssh를 통해 연결하려는 방법과 발생하는 오류를 공유 할 수도 있습니까?
다니엘 t.

답변:


72

@ 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. 실행 하여 확인할 수 있습니다 .


4
이것은 실제로 큰 문제입니다. Azure와 같은 공용 클라우드는 IPV6을 잘 사용하지 않습니다. 예를 들어 공용 Azure로드 밸런서는 백엔드로 IPV4를 시도합니다.
Thomas Decaux 2015 년

1
Azure에 "Docker VM 확장"을 설치하고 Ubuntu 14.04 LTS를 사용해야 할 수 있습니다. 그러나 ipv6에는 네트워크가 아닌 로컬 호스트에만 있기 때문에 문제가 없다고 생각합니다.
Michael

당신 말이 맞아, 문제가 내 설정에 있었다 (IPV6을 사용하지 않도록하는 것은 좋은 아이디어 ^^ 없음)
토마스 Decaux

1
@bigdong 당신은 ipv6를 원합니다.
Michael

1
@Michael 당신은 내 시간 절약입니다. :)
lv0gun9

6

설정 net.ipv6.conf.all.forwarding=1하면 문제가 해결됩니다.

이것은 라이브 시스템에서 다음을 사용하여 수행 할 수 있습니다. sudo sysctl -w net.ipv6.conf.all.forwarding=1


이 답변에는 한 가지 장점이 있습니다. 즉, docker 데몬을 다시 시작하지 않고도 문제를 "수정"할 수 있습니다 (아래의 docker 구성 변경에 대한 답변). 상단에 관해서는 선택된 답변 : 실제로이 sysctl net.ipv6.bindv6only=0구성을 변경해도 도움이되지 않았습니다.
pkoperek


0

컨테이너 포트가 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에서 나를 위해 작동합니다.


1
이것은 데비안에서 작동합니까? / etc / default / docker가 아니어야합니까?
Dimitri Kopriwa

1
@BigDong 댓글 주셔서 감사합니다. 저는 OS와 같은 RedHat을 사용하고 있으므로 경로가 OS마다 약간 다르므로 답변에 귀하의 의견을 반영하려고 노력했습니다
Sylvain

-1

SELinux를 비활성화 한 후 도커 컨테이너에 액세스 할 수있었습니다.

SELinux를 일시적으로 비활성화하려면 #sudo setenforce 0

내 Docker 컨테이너가 Centos-7에서 실행 중이었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.