이야기박스

Network Containers 본문

Computer & Data/Orchestration

Network Containers

박스님 2022. 10. 23. 17:30
반응형

Overview

Docker container에서 네트워크 구성을 어떻게 확인하는지? 그리고 새로운 네트워크 환경은 어떻게 만드는지?

도커를 업무 환경에서 본격적으로 사용하려면 필요한 지식들이죠. 오늘은 이 부분에 관련하여 포스팅을 작성하려고 합니다. 포스팅 내용은 아래 공식 도커 문서를 활용하여 작성하였습니다.

 

https://docs.docker.com/engine/tutorials/networkingcontainers/

 

Network containers

 

docs.docker.com

 

Container Network

호스트 OS에서 도커 컨테이너를 생성하면 위와 같은 구조로 생성됩니다. 

 

Network Driver

도커는 기본으로 `overlay`, `bridge` 라는 두 가지 네트워크 드라이버를 제공합니다. 물론 사용자가 원하는 커스텀 네트워크 환경을 구성할 수도 있습니다.

$ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
e5ba45239e25   bridge    bridge    local
a413aef518bf   host      host      local
ece25f410169   none      null      local

 

컨테이너는 생성시 우리가 따로 어떤 선언을 해주지 않으면 `bridge` 네트워크로 들어가게 됩니다.

예시로 `ubuntu` 이미지를 생성해보도록 하겠습니다.

$ docker run -itd --name=networktest ubuntu
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
d6cb415e2683: Pull complete
Digest: sha256:35fb073f9e56eb84041b0745cb714eff0f7b225ea9e024f703cab56aaa5c7720
Status: Downloaded newer image for ubuntu:latest
efd0fa0b727a6793ab0b8b227ba1c158299a1390c551529794ec04dc09059686

 

위에서 생성한 `ubuntu` 이미지가 `bridge` 네트워크에 포함된 모습은 아래 명령어로 확인할 수 있습니다.

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "e5ba45239e2530ba8145fb2289dc9663f16729d4825344a06d66841b6e1f8468",
        "Created": "2022-10-23T06:36:38.540405542Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "efd0fa0b727a6793ab0b8b227ba1c158299a1390c551529794ec04dc09059686": {
                "Name": "networktest",
                "EndpointID": "b9cde99c2dab097237a7c5a2934f9ab852502b66bb0b1393264a22ab3fb03cdc",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

 

생성하였던 `ubuntu` 이미지를 네트워크에서 제외시키려면 아래 명령어를 사용하면 됩니다.

$ docker network disconnect bridge networktest

 

Custom Network

저만의 고유한 네트워크를 만들어보도록 하겠습니다.

$ docker network create -d bridge storyparks
c5b9935a00780b25cc418adbecb17cbd27931c955ca0d47e3b65915258ea95e1

`-d` 옵션을 통하여 어떤 네트워크 드라이버에서 기반한 네트워크인지 선언을 해줄 수 있습니다.

 

$ docker network ls
NETWORK ID     NAME         DRIVER    SCOPE
e5ba45239e25   bridge       bridge    local
a413aef518bf   host         host      local
ece25f410169   none         null      local
c5b9935a0078   storyparks   bridge    local

 

그리고 아래처럼 상세 정보를 확인해볼 수 있습니다.

$ docker network inspect storyparks
[
    {
        "Name": "storyparks",
        "Id": "c5b9935a00780b25cc418adbecb17cbd27931c955ca0d47e3b65915258ea95e1",
        "Created": "2022-10-23T08:11:13.292614673Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",
                    "Gateway": "172.18.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

 

Why divide the network?

IPAM을 확인해보면 왜 나누는지 알 수 있습니다. 특정 IP 대역을 할당해주고 싶은 경우, 네트워크 관리 용이성을 위해서 우리는 네트워크 레벨부터 나눌 수 있습니다.

  • `bridge` 네트워크 Subnet: 172.17.0.0/16
  • `storypakrs` 네트워크 Subnet: 172.18.0.0/16

 

 

Example

예시는 위에 참조로 걸어둔 공식 문서를 참조해보시면 좋을 것 같습니다. 저는 귀찮아서 따로 적지는 않았습니다.

요약하면 아래와 같습니다.

 

테스트 네트워크로 my_birdge, docker0 (default bridge) 두 가지를 사용합니다.

`docker0` 네트워크와 `my_bridge` 네트워크에 web 컨테이너를 하나씩 생성하고 `my_bridge` 네트워크에 또다시 db 컨테이너를 생성합니다.

 

결론은 아래와 같습니다.

  • `docker0` web 컨테이너 --> `my_bridge` db 컨테이너: 연결 실패
  • `my_bridge` web 컨테이너 --> `my_bridge` db 컨테이너: 연결 성공

 

테스트 로그는 아래에 첨부합니다.

더보기

# 연결 실패

$ 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

 

# 연결 성공

$ 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

 

 

Review

많은 회사의 Prod 환경에선 도커만을 활용하기보다, 쿠버네티스와 함께 사용할 것이라 생각됩니다. 그럼에도 쿠버네티스의 네트워크 구성 기반에도 이러한 도커 네트워크 기술이 깔려있죠. 알아두어야 하는 지식이라 생각됩니다.

반응형