컨테이너는 독립적인 내부 네트워크와 IP를 보유하며,
docker inspect 실행 결과의 NetworkSettings 영역에서 상세 정보를 확인할 수 있다. 호스트 환경에서 컨테이너 내부 애플리케이션에 접근하려면 docker run 명령어의 -P 또는 -p 옵션으로 포트 매핑을 설정해야 한다. 매핑된 포트 정보는 docker port 명령어나 docker ps의 PORTS 열에서 확인 가능하다.
-p, --publish value 호스트로 컨테이너 포트 게시 (기본값 [])
-P, --publish-all 노출된 모든 포트를 임의 포트에 게시
임의 포트 자동 매핑
-P(대문자) 옵션을 사용하면 Docker가 컨테이너의 노출된 포트 중 하나를 호스트의 임의 포트와 연결한다. 임의 포트 범위는 운영체제 설정에 따라 다르며, CentOS 7에서는 /proc/sys/net/ipv4/ip_local_port_range 파일에서 확인할 수 있다.
[admin@centos-node ~]$ docker run -d --name random-web -P docker.io/nginx
a7f3c8e2b1d904f5a8e2c1d3b4f5a6e7c8d9f0a1b2c3d4e5f6a7b8c9d0e1f2
[admin@centos-node ~]$
[admin@centos-node ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a7f3c8e2b1d9 docker.io/nginx "nginx -g 'daemon off" 7 seconds ago Up 5 seconds 0.0.0.0:32774->80/tcp, 0.0.0.0:32773->443/tcp random-web
[admin@centos-node ~]$
[admin@centos-node ~]$ cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
[admin@centos-node ~]$
이 상태에서 브라우저로 호스트IP:32774에 접속하면 Nginx 기본 페이지가 표시되며, docker logs 명령으로 접근 기록을 확인할 수 있다.
[admin@centos-node ~]$ docker logs -f random-web
192.168.10.45 - - [15/Jun/2023:14:28:33 +0000] "GET / HTTP/1.1" 200 615 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.0"
192.168.10.45 - - [15/Jun/2023:14:28:33 +0000] "GET /favicon.ico HTTP/1.1" 404 153 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.0"
^C
[admin@centos-node ~]$
고정 포트 직접 매핑
-p(소문자) 옵션을 통해 호스트의 특정 포트를 컨테이너 포트와 명시적으로 연결할 수 있다. 여러 번 반복 사용하여 다중 포트 매핑도 가능하다.
- 전체 인터페이스 바인딩:
호스트포트:컨테이너포트형식으로 모든 네트워크 인터페이스에 바인딩한다. 보안상 특별한 이유가 없으면 권장하지 않는다. - 특정 주소 지정 바인딩:
IP주소:호스트포트:컨테이너포트형식으로 특정 IP의 특정 포트만 연결한다. - 특정 주소 임의 포트 바인딩:
IP주소::컨테이너포트형식으로 특정 IP의 임의 포트를 할당받아 연결한다.
[admin@centos-node ~]$ docker run -d --name fixed-port-1 -p 8080:80 docker.io/nginx
e4d7f3a2c1b0a9f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4c3b2a1f0e9d8c7b6a5
[admin@centos-node ~]$ docker port fixed-port-1
80/tcp -> 0.0.0.0:8080
[admin@centos-node ~]$
[admin@centos-node ~]$ docker run -d --name fixed-port-2 -p 192.168.10.45:8443:443 docker.io/nginx
b3c2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2e1d0c9b8a7f6e5d4c3
[admin@centos-node ~]$ docker port fixed-port-2
443/tcp -> 192.168.10.45:8443
[admin@centos-node ~]$
[admin@centos-node ~]$ docker run -d --name fixed-port-3 -p 192.168.10.45::80 docker.io/nginx
f2e1d0c9b8a7f6e5d4c3b2a1f0e9d8c7b6a5f4e3d2c1b0a9f8e7d6c5b4a3f2
[admin@centos-node ~]$ docker port fixed-port-3
80/tcp -> 192.168.10.45:32775
[admin@centos-node ~]$
[admin@centos-node ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2e1d0c9b8a7 docker.io/nginx "nginx -g 'daemon off" 12 seconds ago Up 11 seconds 443/tcp, 192.168.10.45:32775->80/tcp fixed-port-3
b3c2a1f0e9d8 docker.io/nginx "nginx -g 'daemon off" 48 seconds ago Up 47 seconds 80/tcp, 192.168.10.45:8443->443/tcp fixed-port-2
e4d7f3a2c1b0 docker.io/nginx "nginx -g 'daemon off" About a minute ago Up About a minute 443/tcp, 0.0.0.0:8080->80/tcp fixed-port-1
[admin@centos-node ~]$
UDP 프로토콜 명시
프로토콜을 도로 지정하지 않으면 TCP가 기본값이며, UDP 포트를 매핑하려면 포트 번호 뒤에 /udp를 추가한다.
[admin@centos-node ~]$ docker run -d --name udp-service -p 127.0.0.1:162:162/udp docker.io/nginx
d9c8b7a6f5e4d3c2b1a0f9e8d7c6b5a4f3e2d1c0b9a8f7e6d5c4b3a2f1e0d9
[admin@centos-node ~]$
[admin@centos-node ~]$ docker port udp-service
162/udp -> 127.0.0.1:162
[admin@centos-node ~]$