Network Namespace
컨테이너가 어떻게 네트워킹을 구성하고, 호스트 부터 외부 인터넷까지 통신 되는지 이해가 너무 안되서 정리.도커가 구성하는 방법을 알려면 리눅스의 네트워크 네임스페이스 개념부터 알아
jjoyling.tistory.com
이전 글에서 network namepsace 를 이용한 방식으로 도커는 컨테이너로 환경을 격리하면서 네트워크도 격리한다.
앞에 내용에 이어서 컨테이너 네트워크 구성 방식을 정리하려 함.
1. none
# docker run --network none nginx
none 네트워크는 도커 컨테이너가 아무 네트워크에도 연결되어 있지 않다. 어떤 방법으로도 컨테이너에 연결할 수 없다.
2. Host
docker run --network host nginx
호스트 네트워크를 그대로 사용함. 웹 어플리케이션을 배포하면, 해당 호스트 IP:80 으로 접속하면 컨테이너에 접속할 수 있다.
하지만 다른 컨테이너를 띄웠을 때 동일한 포트를 사용할 수 없다. 왜냐면 호스트 네트워크의 포트를 동시에 사용하려 하기 때문에 포트 충돌이 일어나게 된다.
3. bridge
호스트 내부에 사설 네트워크가 생성된다. 이전 글에서 작성했던 network namespace 개념을 이용한다.
# docker network ls
// bridge 라는 이름으로 사설 네트워크가 생성됨 (docker0)
// == ip link add docker0 type birdge
# ip netns
ab3165c10a92b
// 네트워크 네임스페이스가 생성되어 있음
docker0 는 172.17.0.1/24 의 IP 를 할당받기 때문에 해당 브릿지 네트워크에 ip 는 해당 대역으로 할당 된다.
생성된 네트워크 네임스페이스를 통해 bridge 네트워크에 연결된다.
이에 대한 자세한 내용은 네트워크 네임스페이스 글에서 정리하였음.
즉 docker0 라는 bridge network 에 컨테이너들이 연결된다.
# curl http://172.17.0.3:80
호스트에서 해당 컨테이너IP:Port 로 통신하면 정상적으로 nginx 메세지가 출력되지만 외부 네트워크는 해당 bridge network 를 찾을 수 없다.
그렇기 때문에 컨테이너를 실행할 때 포트 매핑을 해준다.
# docker run -p 8080:80 nginx
이렇게하면 host:8080 으로 통신을 시도하면 bridge network 내부의 80 포트로 매핑되어 외부에서 통신이 가능하다.
컨테이너는 포트를 매핑하면 iptables 를 통해 작업한다.
iptables \
-t nat \
-A DOCKER \
-j DNAT \
--dport 8080 \
--to-destination 172.17.0.3:80
'DevOps > ✏️ Cloud' 카테고리의 다른 글
Kubernetes DNS ( coreDNS ) (0) | 2025.05.19 |
---|---|
CNI (Container Network Interface) (0) | 2025.05.19 |
Network Namespace (1) | 2025.05.15 |
drain, cordon, uncordon 명령 (0) | 2025.03.27 |
Multi-Container (init Container) (0) | 2025.03.26 |