programing

포트 바인딩에 도커에서 IPv4를 사용하도록 설정

jooyons 2023. 8. 13. 09:42
반응형

포트 바인딩에 도커에서 IPv4를 사용하도록 설정

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

도커 호스트는 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

@prefix-t가 코멘트에서 지적했듯이, github.com/docker/docker/issues/2174 는 에서 IPv6에 대한 바인딩만 보여주는 것에 관한 것입니다.netstat하지만 그것은 문제가 아닙니다.Github 문제가 다음과 같이 언급합니다.

프록시를 설정할 때 Docker가 루프백 주소 '127.0.0.1'을 요청하면 Linux는 이 주소가 IPv6(::0)에 존재하는 주소임을 인식하고 두 주소 모두에서 열립니다(공식적으로는 IPv6 소켓임).netstat를 실행하면 이 메시지가 표시되고 IPv6임을 알 수 있지만 IPv4에서 수신 중입니다.만약 당신이 당신의 설정을 조금만 가지고 놀았다면, 당신은 net.tw6.twv6만 = 1로 설정함으로써 Linux가 하는 이 속임수를 비활성화했을 것입니다.

즉, IPv6으로만 보기 때문에 net.ipv6.bindv6만 설정된 IPv6만 바인딩하도록 설정하지 않는 한 IPv4에서 통신할 수 있습니다.net.ipv6.bindv6만 0이어야 합니다. 실행할 수 있습니다.sysctl net.ipv6.bindv6only확인할 수 있습니다.

2021 업데이트:

현재 도커는 기본적으로 IPv4 및 IPv6 모두에 바인딩됩니다.

도커가 포트 바인딩에 IPv4를 사용하도록 명시적으로 설정하려면(예: IPv4 포트에서만 바인딩) 추가0.0.0.0:의 항구 앞에.-p/--publish다음과 같은 옵션:

$ docker run --publish "0.0.0.0:80:80" --publish "0.0.0.0:443:443" --detach nginx

작업을 완료하면 다음과 같은 결과가 나타납니다.

$ docker ps

CONTAINER ID   IMAGE   COMMAND                  CREATED          STATUS         PORTS                                      NAMES
2459bd225751   nginx   "/docker-entrypoint.…"   4 seconds ago    Up 2 seconds   0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   jovial_yonath

netstat 결과는 다음과 같습니다.

$ sudo netstat -tulnp

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State    PID/Program name
tcp        0      0 0.0.0.0:443   0.0.0.0:*       LISTEN   22676/docker-proxy
tcp        0      0 0.0.0.0:80    0.0.0.0:*       LISTEN   22698/docker-proxy

또는curl물론 작동하는지 확인하기 위해 장치에 연결합니다.

"0.0.0.0"을 추가하지 않으면 두 IP 버전 모두에 바인딩됩니다.PORTS읽을 것0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp보안, 콘솔 스팸 또는 예측 가능성의 이유로 바람직하지 않을 수 있습니다.

설정net.ipv6.conf.all.forwarding=1문제를 해결할 것입니다.

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

문제 해결:

사용하다docker run -it -p 80:80 --name nginx --net=host -d nginx

이 문제는 나중에 해결할 호스트와 브리지 네트워크를 사용하는 대신 VM과 관련된 문제입니다.

tcp     0    0 0.0.0.0:80            0.0.0.0:*             LISTEN      - 
tcp6    0    0 :::80                 :::*                  LISTEN      -  

기본적으로 도커는 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 Debians도 마찬가지입니다.
  • 네트워크 설정 편집
    • DOKER_NETWORK_OPTIONS=-ip=xx.xx.xx.xx 추가
    • xx.xx.xx.xx는 실제 ipv4(0.0.0이 아님)입니다.
  • 도커 데몬 다시 시작

도커 1.9.1에서 작동합니다.

포 센트OS 사용자,

센트에 대해서도 같은 문제가 있습니다.OS7과 net.ipv4.ip_forward를 1로 설정하면 문제가 해결됩니다.도커 네트워킹 사용 안 함: 경고: IPv4 전달 사용 안 함을 참조하십시오. 자세한 내용은 네트워킹이 작동하지 않습니다.

생성된 네트워크에 대해 --attachable 플래그를 제거하려고 합니다.

작동하지 않음

docker network create --attachable --driver overlay --subnet=10.0.3.0/24 --gateway=10.0.3.1 dev

작동하지만 sudo netstat -tulnp4에서 확인해도 수신 대기 IPv4 포트가 여전히 표시되지 않습니다.

docker network create --attachable --driver overlay --subnet=10.0.3.0/24 --gateway=10.0.3.1 dev

언급URL : https://stackoverflow.com/questions/29957143/make-docker-use-ipv4-for-port-binding

반응형