컨테이너를 다루다 보면 하나가 아닌 여러 개의 프로그램을 연동해 사용해야 하는 경우가 있다.
예를 들어, 간단한 웹사이트를 만드는 데에도 워드프레스 + php 런타임 + apache + mysql 콤보가 필요하다.
이러한 프로그램들을 하나의 컨테이너에 때려넣을 수도 있지만, 그러면 프로그램을 격리해 관리한다는 도커의 목적이 퇴색된다.
따라서 각각의 프로그램을 별도의 컨테이너에 보관하는 것이 바람직한데, 앞서 말했듯이 컨테이너는 격리되어 있기 때문에 프로그램 간 연동이 안된다는 문제가 있다.
컨테이너는 가상 ip 주소를 할당받는다. 컨테이너 안에서 ifconfig 명령어를 사용한 후 출력되는 목록 중에서 eth0(도커의 NAT IP) 부분이 컨테이너가 할당받은 가상 ip 주소이다.
따라서 이 가상 ip를 통해 접근하면 다른 컨테이너와 통신할 수 있다. 예를 들어, B 컨테이너의 ip가 172.17.0.3이라면 A 컨테이너는 이 ip를 써서 B 컨테이너에 접근할 수 있다. 그러나 도커 엔진은 컨테이너가 시작할 때마다 가상 ip를 재할당하므로 매번 변경되는 컨테이너의 ip로 접근하기는 어렵다.
—link 옵션
—link 옵션은 컨테이너에 별명(alias)를 붙인 후 그 컨테이너에 ip가 아닌 별명으로 접근하게 해주는 설정이다. —link 옵션을 사용할 때 —link에 입력된 컨테이너가 실행 중이지 않거나 존재하지 않는다면 —link를 적용한 컨테이너 또한 실행할 수 없다는 점을 주의해야 한다.
이처럼 —link 옵션은 컨테이너 간에 이름으로 서로를 찾을 수 있게 도와주지만, 현재 deprecated 된 옵션이며 추후 삭제될 수 있다. 따라서 얌전히 후술할 도커 네트워크를 쓰는 편이 좋다.
도커 네트워크 구조
도커는 컨테이너끼리 연결할 수 있는 가상 네트워크를 제공한다. 이를 도커 네트워크라고 한다.
토커는 컨테이너를 생성할 때마다 veth(virtual eth)라는 가상 네트워크 인터페이스를 생성한다. docker0이라는 브릿지는 각 veth 인터페이스와 바인딩되어 호스트의 eth0 인터페이스와 이어주는 역할을 한다. 즉, 컨테이너와 호스트의 네트워크는 아래의 그림과 같은 구조를 띈다.

아무런 설정을 하지 않고 컨테이너를 생성하면 컨테이너는 자동으로 docker0을 사용한다.
docker0 브릿지 이외에도 사용자의 선택에 따라 여러 네트워크 드라이브를 사용할 수 있다.
- 브리지 bridge
- 호스트 host
- 논 none
- 컨테이너 container
- 오버레이 overlay
사용자 정의 네트워크는 컨테이너에 유동적으로 연결하고 분리할 수 있다.
#분리
docker network disconnect <네트워크 이름> <컨테이너 이름>
#연결
docker network connect <컨테이너 이름> <네트워크 이름>네트워크의 서브넷, 게이트웨이, ip 할당 범위 등을 임의로 설정하려면 네트워크를 생성할 때 아래와 같이 —subnet, —ip-range, —gateway 옵션을 추가한다. 단, —subnet과 —ip-range는 같은 대역이여야 한다.
ex)
docker network create --driver=<network type> --subnet=172.72.0.0/16 --ip-range=172.72.0.0/24 --gateway=172.72.0.1 <network_name>
브리지 네트워크
브리지 네트워크는 docker0이 아닌 사용자 정의 브릿지를 새로 생성해 각 컨테이너에 연결하는 네트워크 구조이다.
컨테이너는 연결된 브릿지를 통해 외부와 통신할 수 있다.
아래와 같은 명령어를 통해 생성한다.
docker network create --driver=<네트워크 타입. 브리지 네트워크를 만들고 싶다면 bridge가 들어간다.> <만들고자 하는 네트워크 이름>
호스트 네트워크
docker run에 --net host 인자를 붙이면 컨테이너의 네트워크를 호스트로 설정할 수 있다.
네트워크를 호스트로 설정하면 호스트의 네트워크 환경을 그대로 쓸 수 있다.
즉, 별도의 포트 포워딩 없이 외부와 통신할 수 있다.
논 네트워크
docker run에 --net none 인자를 붙이면 컨테이너의 네트워크를 논으로 설정할 수 있다.
논 none은 말 그대로 아무런 네트워크를 쓰지 않는 것을 뜻한다. 논 네트워크로 컨테이너를 설정하면 해당 컨테이너는 외부와 단절된다.
컨테이너 네트워크
docker run에 --net container:<다른 컨테이너의 id>와 인자를 붙이면 해당 컨테이너 네트워크의 네임스페이스 환경을 공유할 수 있다. 공유되는 속성은 내부 ip, 네트워크 인터페이스의 맥(MAC) 주소 등이다.
참고자료
그림과_실습으로_배우는_도커_쿠버네티스
#참고도서/시작하세요_도커_쿠버네티스