도커 컨테이너는 호스트 내부에 격리된 어플리케이션 환경을 생성한다. 생성된 어플리케이션은 네트워크를 통해 내부, 외부와 통신하게 된다.
📍 전체적인 그림
컨테이너를 생성하면 기본적으로 docker0 브리지를 통해 외부와 통신할 수 있는 환경을 사용할 수 있지만 선택에 따라 여러 네트워크 드라이버를 사용할 수도 있다.
브리지(bridge), 호스트(host), 논(none), 컨테이너(container) 등
아무런 설정을 하지 않고 컨테이너를 생성하면 컨테이너는 자동으로 docker0 브리지를 사용하는데 이와 비슷하게 docker0가 아닌 사용자 정의 브리지를 새로 생성해 각 컨테이너에 연결하는 네트워크 구조이다.
즉, 기존의 docker0를 사용하는 브리지 네트워크가 아닌 새로운 브리지 타입의 네트워크를 생성할 수 있다.
아래와 같은 명령어를 통해 mybridge
라는 브리지 타입의 네트워크를 생성할 수 있다.
docker network create --driver bridge mybridge
아래와 같은 명령어를 통해 mybridge
네트워크를 사용하는 컨테이너를 생성한다.
docker run -i -t --name mynetwork_bridge \
--net mybridge ubuntu:14.04
\
-> 줄바꿈
브리지 네트워크와 달리 네트워크는 별도로 생성할 필요없이 기존의 host
라는 이름의 네트워크를 사용하고 호스트의 네트워크 환경을 그대로 쓸 수 있다.
docker run -i -t --name mynetwork_host \
--net host ubuntu:14.04
컨테이너의 호스트 이름도 무작위 16진수가 아닌 도커 엔진이 설치된 호스트 머신의 호스트 이름으로 설정된다.
ex) 호스트 모드를 쓰는 컨테이너에서 아파치 웹 서버를 구동하면 호스트 IP와 컨테이너의 아파치 웹 서버 포트인 80으로 바로 접근 가능
말 그대로 아무 네트워크도 쓰지 않는 것을 말한다.
즉, 외부와 연결이 단절된다.
docker run -i -t --name mynetwork_none \
--net none ubuntu:14.04
컨테이너 내부에서 ifconfig
를 이용해 네트워크 인터페이스를 확인하면 로컬 호스트를 나타내는 lo 외에는 존재하지 않는다.
다른 컨테이너의 네트워크 네임스페이스 환경을 공유할 수 있다.(내부 IP, 네트워크 인터페이스의 MAC 주소 등)
docker run -i -t -d --name mynetwork_container_1 \
ubuntu:14.04
docker run -i -t -d --name mynetwork_container_2 \
--net container:mynetwork_container_1 ubuntu:14.04
내부 IP를 새로 할당받지 않으며 호스트에 veth로 시작하는 가상 네트워크 인터페이스도 생성되지 않는다.
ifconfig
를 통해 확인하면 container1과 2는 eth0에 대한 정보가 같다.
호스트의 네트워크 인터페이스 카드를 가상화해 물리 네트워크 환경을 컨테이너에게 동일하게 제공한다.
따라서 컨테이너는 물리 네트워크상에서 가상의 MAC 주소를 가지며 해당 네트워크에 연결된 다른 장치와의 통신이 가능해진다.
(MacVLAN을 사용하는 컨테이너는 기본적으로 호스트와 통신이 불가능하다.)