Docker에서 컨네이너가 사용하는 네트워크 방식에 대해서 알아본다.
Docker Network 종류
- Bridge
- 기본 네트워크 드라이버이고 Docker 설치후 Network Interface를 보면 docker0가 생긴것을 볼 수 있다.
- 컨테이너에 특정한 네트워크를 설정하지 않으면 Container의 interface가 하나씩 연결된다.
- Container가 외부로 통신할 때는 docker0 interface를 거치게 된다.
- docker0 인터페이스는 host의 eth0 인터페이스와 연결된다.
- Host
- host 방식은 컨테이너 생성시 독립적인 네트워크를 갖지 않고 host의 네트워크와 함께 사용하게 된다.
- --net=host 옵션으로 컨테이너를 실행한다.
- Overlay
- Docker Swarm에 참여하는 Docker Daemon과 Swarm안의 서비스들 사이에 통신을 담당
- 물리적으로 나누어진 서버가 2대 있고 각 서버의 컨테이너끼리 통신을 하고자 하는 경우 통신을 할 수 없게된다. (포트포워딩을 통해 가능.)
- 이때 여러 서버를 하나의 네트워크로 구성해주는게 Overlay이다. (각 서버에서 실행된 컨네이너는 같은 Gateway와 IP 대역을 가지게 된다.)
- Docker Swarm을 사용하고 물리적으로 분리된 노드에 실행중인 컨테이너 사이에 통신이 필요한 경우 사용.
- macvlan
- macvlan은 bridge가 없고 host의 물리장비인 eth0 하위에 여러개의 하위 인터페이스를 만들어서 여러개의 Mac 주소를 가지게한다.
- 하위 인터페이스에 컨테이너들이 연결되면서 VLAN 환경을 구성하게 된다.
- 즉, 하나의 네트워크 인터페이스 카드를 가상화 함으로써 여러개의 MAC 주소를 생성하여 사용한다.
- macvlan 방식은 private, VEPA, Bridge, Passthru 4가지 방식이 있고, Docker에서는 Bridge 방식만 사용한다.
- Bridge 방식은 Host와는 통신이 안되지만 하위 인터페이스와는 통신이 되는 방식이다.
- 높은 처리량과 CPU 사용량이 적은 장점이 있으므로 컨테이너 사이에 통신만 필요한 경우 사용.
- none
- 모든 Netwoking을 사용하지 않는다.
- none은 Docker Swarm 서비드들에 대해서는 사용불가 하다.
- none으로 설정한 경우는 Custom 네트워크 드라이버를 만들어 사용하는 경웨 사용.
컨테이너 연결
도커가 컨테이너를 띄울때 해당 컨테이너는 내부IP를 가지게 되고, 새로 띄울때는 IP가 변경되게 된다.
예전에는 --link 옵션을 주어서 컨테이너를 연결하였으나 현재는 deprecated 상태이며, 제거될 것이다. 참고
--link 옵션을 사용하는 대신 Docker의 Network 기능을 이용하여 처리한다.
예제
# network 생성
$ docker network create ex-net
# network 확인
$ docker network ls
# network 상세정보 확인
$ docker network inspect ex-net
# 컨테이너 실행시 --network NETWORK-NAME 옵션을 추가한다.
# 아래와 같이 같은 network로 설정을 하면 컨네이터 사이에 통신이 가능하다.
$ docker run --rm --name mysql-container --network ex-net mysql
$ docker run --rm --network ex-net apache
# 만약 MySQL 컨테이너를 띄우고 소스코드 내에서 MySQL 컨네이너에 접속할때는 아래와 같이 작성한다.
# jdbc:mysql://mysql-container:3306/test
Overlay 네트워크 예제
# overlay 네트워크 생성 (docker swarm manager 노드에서 해야 한다.)
# Docker Swarm은 manager노드와 worker 노드가 존재한다.
$ docker swarm init
$ docker network create -d overlay ex-over
# 컨테이너 생성
docker service create --name myservice \
> --network ex-over \
> --replicas 3 \
> ubuntu sleep infinity