기술 블로그(Alex)

  • Github Page
    • jekyll
  • Docker
    • guide
    • container
  • 이모저모

Docker Network

Dec 21, 2018

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
© Alexonepath. All rights reserved. Powered by GitHub Pages.