포트 바인딩에 도커에서 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
'programing' 카테고리의 다른 글
| aws에서 서버리스 배포 시 자동으로 기능 실행 (0) | 2023.08.13 |
|---|---|
| MariaDB10.4 - W10 머신, 슬레이브 1개 + 일반 독립형 DB 몇 개 - 방법? (0) | 2023.08.13 |
| PowerShell: 문자열을 N자로 제한하는 방법은 무엇입니까? (0) | 2023.08.13 |
| 사파리에만 스타일을 적용할 수 있는 방법이 있습니까? (0) | 2023.08.13 |
| 종료된 컨테이너의 로그를 확인하는 도커 (0) | 2023.08.13 |