1. Nginx 컨테이너 생성 (포트 매핑 미설정)
[root@localhost ~]# docker run --name nginx_container -d nginx
7be3673a4c0f8f7ffe79a7b11ab86c4327dacaf734ed574e88e28c1db2243716
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7be3673a4c0f nginx "nginx -g 'daemon ..." 5 seconds ago Up 4 seconds 80/tcp nginx_container
2. 컨테이너 네트워크 정보 확인
[root@localhost ~]# docker network inspect bridge
{
"Containers": {
"7be3673a4c0f8f7ffe79a7b11ab86c4327dacaf734ed574e88e28c1db2243716": {
"Name": "nginx_container",
"IPv4Address": "172.17.0.2/16"
}
}
}
3. 컨테이너 IP 및 포트 테스트
[root@localhost ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.073 ms
[root@localhost ~]# curl -I 172.17.0.2
HTTP/1.1 200 OK
결론: 기본적으로 컨테이너 내 서비스 포트는 호스트 내부에서만 접근 가능합니다.
4. 명시적 포트 매핑 설정
[root@localhost ~]# docker rm -f nginx_container
[root@localhost ~]# docker run --name nginx_container -d -p 80:80 nginx
f1166a72ab910b425cf32b91ababde2a5b6a4fda6db08852bf7a99d925d4985f
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f1166a72ab91 nginx "nginx -g 'daemon ..." 3 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp nginx_container
고정 IP 바인딩 설정:
/etc/docker/daemon.json 파일에 다음과 같이 추가할 수 있습니다:
{
"host": "0.0.0.0"
}
5. 자동 포트 할당 설정
[root@localhost ~]# docker rm -f nginx_container
[root@localhost ~]# docker run --name nginx_container -d -P nginx
8f9df2a803766862d08709b77054d35e890ca72c0ea17770dac8b3815278d35b
[root@localhost ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8f9df2a80376 nginx "nginx -g 'daemon ..." 5 seconds ago Up 5 seconds 0.0.0.0:10000->80/tcp nginx_container
외부 접근 시 주의 사항: 호스트 IP 주소와 포트 번호를 반드시 확인해야 합니다.
6. -P 및 -p 파라미터 비교
-P 파라미터:
랜덤 포트 범위(ip_local_port_range)에 따라 호스트 포트를 자동 할당합니다.
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_local_port_range
10000 65000
-p 파라미터: 명시적으로 호스트 포트와 컨테이너 포트를 지정할 수 있으며, 포트 범위도 지원합니다.
포트 매핑 형식 예시:
- 192.168.1.100:8080:80
- 8080:80
- :80
네트워크 규칙:
두 방식 모두 iptables의 nat 테이블에 규칙을 추가합니다.
-p 80:80 사용 시:
iptables -t nat -vnL | grep :80
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 to:172.17.0.2:80
-P 사용 시:
iptables -t nat -vnL | grep :80
0 0 DNAT tcp -- !docker0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:10000 to:172.17.0.2:80