CKA 강의 중 도커 네트워크 관련 내용이 있어 정리했다.
# example
docker run --network none nginx
컨테이너가 어떤 네트워크도 연결되지 않은 상태
여러 컨테이너가 생성되어있어도 none 네트워크이면 서로 연결 x
docker run --network host nginx
컨테이너가 호스트 네트워크와 연결된 것
예를 들어, 컨테이너를 80 포트로 서비스 할 경우 호스트의 80 포트로 접속 가능(포트 매핑 필요 없이)
docker run nginx
호스트와 컨테이너에 연결되는 내부 사설 네트워크가 생성되는 방식
브릿지 네트워크에 연결되는 각 장치는 사설 네트워크 아이피를 가지게 됨
도커가 호스트에 설치되면 bridge라는 사설 네트워크를 기본값으로 생성함
~/Doc/C/9.Networking docker network ls
NETWORK ID NAME DRIVER SCOPE
53589998420d bridge bridge local
d2469630f3f2 host host local
e5e36d5a8201 none null local
docker0 = bridge(network)
컨테이너가 생성될 때마다 도커는 그 컨테이너를 위한 네트워크 네임스페이스를 생성함
그럼 방금 생성된 컨테이너를 위한 네트워크 네임스페이스를 브릿지 네트워크에 어떻게 연결할까?
네임스페이스와 브릿지에 각각 1개씩 인터페이스 쌍을 생성하여 연결함
외부에 컨테이너 포트를 오픈하기 위해 포트 매핑 또는 포트 퍼블리싱 작업이 필요함
# example
docker run -p 8080:80 nginx
어떻게 이게 가능할까? NAT 규칙을 만들어서 구현한다.
NAT 규칙을 생성하고 목적지를 설정함
# PREROUTING
iptables \
-t nat \
-A PREROUTING \
-j DNAT \
--dport 8080 \
--to-destination 172.17.0.3:80
# docker
iptables \
-t nat \
-A DOCKER \
-j DNAT \
--dport 8080 \
--to-destination 172.17.0.3:80
위의 iptables 명령어를 사용하면 아래와 같은 결과