2 분 소요

Network containers

Network containers(Docker Documentation) 의 내용을 정리한 글입니다.


이 문서에서는 컨테이너를 네트워크로 연결하는 방법을 소개합니다.

Windows 에는 docker0 bridge 가 없습니다. Windows용 Docker Desktop에서 네트워킹이 구현되는 방식 때문에 호스트 에서 인터페이스를 볼 수 없습니다 . 이 인터페이스는 실제로 가상 머신 내에 있습니다. From: Networking features in Docker Desktop for Windows




기본 네트워크에서 컨테이너 시작하기

Docker는 네트워크 드라이버를 사용하여 컨테이너의 네트워킹을 지원합니다.

Docker는 bridgeoverlay의 두 가지 네트워크 드라이버를 기본으로 제공합니다. 네트워크 드라이버 플러그인을 작성하여 직접 드라이버를 만들 수도 있지만 이는 고급 테크닉입니다.

Docker 엔진을 설치하면 자동으로 다음 네트워크들이 기본으로 포함됩니다:

$ docker network ls

NETWORK ID          NAME                DRIVER
18a2866682b8        none                null
c288470c46f6        host                host
7b369448dccb        bridge              bridge

bridge 네트워크는 특별한 네트워크입니다. 별도로 지정하지 않는 한 Docker는 항상 이 네트워크에서 컨테이너를 시작합니다.

다음은 새 컨테이너 web을 시작한 후의 네트워크입니다:

docker run -itd --name=web ubuntu
  74695c9c...

그림 1. 기본 네트워크(docker0)에서 컨테이너 시작하기.

네트워크를 검사하면 컨테이너의 IP 주소를 쉽게 찾을 수 있습니다:

docker network inspect bridge
  [
    {
      "Name": "bridge", 
      "Id": "f7ab...
      ...
    }
  ]

컨테이너의 연결을 끊으면 컨테이너를 네트워크에서 제거할 수 있습니다:

docker network disconnect bridge networktest

네트워크에서 컨테이너 연결을 끊을 수는 있지만 bridge라는 기본 브리지 네트워크를 제거할 수는 없습니다. 네트워크는 다른 컨테이너나 다른 네트워크에서 컨테이너를 격리하는 자연스러운 방법입니다. 따라서 Docker에 익숙해지면 고유한 네트워크를 만들게 됩니다.




고유한 bridge 네트워크 만들기

고유한 bridge 네트워크(my_bridge)를 만들어보겠습니다:

docker network create -d bridge my_bridge

-d 플래그는 Docker에 새 네트워크에 bridge 드라이버를 사용하도록 지시합니다.(bridge는 플래그의 기본값입니다.) 다음 명령을 실행하여 머신의 네트워크를 리스팅합니다:

$ docker network ls
  NETWORK ID          NAME             DRIVER
  7b369448dccb        bridge           bridge
  615d565d498c        my_bridge        bridge
  18a2866682b8        none             null
  c288470c46f6        host             host

네트워크를 검사하면 아무것도 없는 것을 확인할 수 있습니다:

docker network inspect my_bridge
  [
    {
      ...
      "Containers": {},
      ...
    }
  ]




컨테이너를 네트워크에 추가하기

같이 동작하지만, 안전하게 격리된 웹 앱을 빌드하기 위해 네트워크를 만들겠습니다. 정의에 따라 네트워크는 컨테이너에 완전한 격리를 제공합니다.

컨테이너를 처음 실행할 때 컨테이너를 추가할 네트워크를 지정할 수 있습니다.

PostgreSQL 데이터베이스 컨테이너를 시작하고 --net=my_bridge 플래그를 전달하여 새 네트워크에 연결합니다:

docker run -d --net=my_bridge --name db training/postgres

그림 2. 새 네트워크(my_bridge)에서 컨테이너 시작하기.

다음 명령을 실행하여 web 의 사용자 IP를 확인합니다:

docker inspect --format='' web
172.17.0.2

실행 중인 db 컨테이너에 shell 로 접근하여, web 연결을 확인합니다:

docker container exec -it db bash

root@a205f0dd33b2:/# ping 172.17.0.2
ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
^C
--- 172.17.0.2 ping statistics ---
44 packets transmitted, 0 received, 100% packet loss, time 43185ms

두 컨테이너가 다른 네트워크에서 실행되고 있기 때문에 아직 연결할 수 없습니다. exit 를 실행하여 컨테이너를 닫습니다.

Docker 네트워킹을 사용하면 원하는 만큼 많은 네트워크에 컨테이너를 연결할 수 있습니다. 이미 실행 중인 컨테이너를 연결할 수도 있습니다.

다음 명령을 실행하여 실행 중인 web 앱을 my_bridge 에 연결하겠습니다:

docker network connect my_bridge web

그림 3. 컨테이너(web)를 네트워크(my_bridge)에 추가하기.

다시 실행 중인 db 컨테이너에 shell 로 접근하여, web 연결을 확인합니다.

이번에는 ping 명령을 사용하여 IP 주소 대신 컨테이너 이름 web 을 사용합니다:

docker container exec -it db bash

  root@a205f0dd33b2:/# ping web
  PING web (10.0.0.2) 56(84) bytes of data.
  64 bytes from web (10.0.0.2): icmp_seq=1 ttl=64 time=0.095 ms
  64 bytes from web (10.0.0.2): icmp_seq=2 ttl=64 time=0.060 ms
  64 bytes from web (10.0.0.2): icmp_seq=3 ttl=64 time=0.066 ms
  ^C
  --- web ping statistics ---
  3 packets transmitted, 3 received, 0% packet loss, time 2000ms
  rtt min/avg/max/mdev = 0.060/0.073/0.095/0.018 ms

ping은 다른 IP 주소에 연결하고 있는 것을 보여줍니다. my_bridge의 주소는 브리지 네트워크의 주소와 다릅니다.




참고자료

댓글남기기