본문 바로가기
Framework and Tool/Docker

Docker network

by ocwokocw 2023. 6. 12.

출처: 시작하세요! 도커/쿠버네티스 - 도커 네트워크

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

출처: https://docs.docker.com/network/network-tutorial-standalone/

Docker network 구조

Docker network 구조를 간단한 그림으로 나타내면 아래와 같다.

  • veth: Docker는 container를 생성할때마다 IP를 부여한다. 하지만 해당 IP는 docker가 설치된 host 에서만 사용가능하므로 외부와 연결해줘야 하는데 이를 위해 veth 라는 network interface를 container 마다 생성한다.
  • docker0: 각 veth를 host의 eth0와 이어주는 역할을 하는 bridge 이다.
  • eth0: 공인 IP 또는 내부 IP가 할당되어 실제 외부와 통신 가능한 Host network interface 이다.

Centos에서는 위에서 기술한 network interface를 확인할 수 있지만 Mac 이라면 eth0은 en0으로, docker0은 bridge0으로 나타난다.


Docker network type

Bridge network

위에서 설명한 docker0과 비슷한 사용자 정의 bridge network를 생성한다. Container는 bridge network를 통해 외부와 통신할 수 있다.

% docker network create --driver bridge mybridge
4c99c399e720a17c74fef1e0e08176657f42f9cd17202ffa4863b8bb02cb76cc

% docker network ls
NETWORK ID     NAME            DRIVER    SCOPE
1475c92e1f74   bridge          bridge    local
c6600ef17ddf   host            host      local
...
4c99c399e720   mybridge        bridge    local
22f0011da319   none            null      local

% docker run -it --name mynetwork --net mybridge ubuntu:14.04
root@2370013ed88d:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:12:00:02
          inet addr:172.18.0.2  Bcast:172.18.255.255  Mask:255.255.0.0
...

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
...

위의 과정을 하나씩 살펴보자. 

  • docker network create --type bridge 로 사용자 정의 bridge network를 생성했다. 
  • docker run option에서 --net mybridge로 container가 mybridge network를 사용하도록 지정하여 실행했다.
  • container 내부에서 ifconfig로 정보 출력한 결과 inet addr: 172.18.0.2 를 반환했다.

default bridge 와 사용자 정의 bridge를 docker inspect를 통해 살펴보면 Subnet과 해당 network를 사용하는 container 정보를 알 수 있다. 추가로 mynetwork2 container를 생성하고 mybridge network를 사용하도록 해보자.

% docker run -itd --name mynetwork2 --net mybridge ubuntu:14.04
031e78ee0138f516ed22724033f8e2368cd3df13248221864757fd1aeb8936f1

% docker inspect mybridge
[
    {
        "Name": "mybridge",
...
        "Containers": {
            "031e78ee0138f516ed22724033f8e2368cd3df13248221864757fd1aeb8936f1": {
                "Name": "mynetwork2",
                "EndpointID": "91b78d4c89d634093b602efb428e04d2e7d56cf5a9574d8fa91698637b057b8e",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "2370013ed88dee2569a5be5a7eee9b3d37dd442797ce8d2a97e99a04743aa172": {
                "Name": "mynetwork",
                "EndpointID": "3496ac14e90620c09cc8cecfb3d0a13dc2233b93590e4438fa24b06c5c2dec3f",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
...

현재 구성된 정보 mybridge: [mynetwork(172.18.0.2), mynetwork2(172.18.0.3)]와 같다. mynetwork container 내에서 ping test를 해보자.

% docker exec -it mynetwork /bin/bash
root@2370013ed88d:/# ping -c 2 google.com
PING google.com (172.217.161.206) 56(84) bytes of data.
64 bytes from kix07s03-in-f14.1e100.net (172.217.161.206): icmp_seq=1 ttl=37 time=38.6 ms
64 bytes from kix07s03-in-f14.1e100.net (172.217.161.206): icmp_seq=2 ttl=37 time=39.3 ms

root@2370013ed88d:/# ping -c 2 172.18.0.3
PING 172.18.0.3 (172.18.0.3) 56(84) bytes of data.
64 bytes from 172.18.0.3: icmp_seq=1 ttl=64 time=0.380 ms
64 bytes from 172.18.0.3: icmp_seq=2 ttl=64 time=0.266 ms

root@2370013ed88d:/# ping -c 2 mynetwork2
PING mynetwork2 (172.18.0.3) 56(84) bytes of data.
64 bytes from mynetwork2.mybridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.062 ms
64 bytes from mynetwork2.mybridge (172.18.0.3): icmp_seq=2 ttl=64 time=0.391 ms

외부인 google.com과 다른 container의 IP, name으로 ping을 날릴 수 있는것을 확인할 수 있다.

Host network

Host 의 network 환경을 그대로 사용할 수 있는 유형도 존재한다. 말 그대로 Host network 환경을 그대로 사용하기 때문에 사용자 정의 network를 생성하지 않고 생성된 network를 그대로 사용한다.

% docker run -it --net host --name network_host ubuntu:14.04

root@docker-desktop:/# ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:6b:43:12:4e
          inet addr:172.17.0.1  Bcast:172.17.255.255  Mask:255.255.0.0
...

eth0      Link encap:Ethernet  HWaddr 02:50:00:00:00:01
          inet addr:192.168.65.3  Bcast:192.168.65.255  Mask:255.255.255.0
          inet6 addr: fe80::50:ff:fe00:1/64 Scope:Link
...          

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
...

host network 모드를 사용하면 컨테이너 내부 App도 별도 포트포워딩없이 사용이 가능하다.

 

None network

None network를 특별한 network를 사용하겠다는 의미가 아니라 어떤 network도 사용하지 않는다는 의미이다. 그래서 실제로 container를 생성하고 ifconfig로 결과를 보면 localhost 밖에 조회되지 않는다.

% docker run -it --name network_none --net none ubuntu:14.04

root@677540216a96:/# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0

 

Container network

--net option으로 container:[다른 container]와 같이 입력하면 network namespace를 공유한다.

% docker run -itd --name network_cont1 ubuntu:14.04
77e2e937b6bec08106b10cd80543ffce8e69c6ba6809b6b69eba8d6a749b6e65

% docker run -itd --name network_cont2 --net container:network_cont1 ubuntu:14.04
80f784961fad29437f972712b928adc3322e6bea73f7fdf75e00c51847df5dbb

% docker exec network_cont1 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
...

% docker exec network_cont2 ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
...

위의 예제에서 생성된 network_cont1, network_cont2는 HWaddr과 inet addr이 모두 같게 설정된것을 확인할 수 있다.

'Framework and Tool > Docker' 카테고리의 다른 글

Docker resource constraints  (0) 2023.06.18
Docker logging  (0) 2023.06.17
Docker volume  (0) 2023.06.11
Container application example  (0) 2023.06.10
Container port  (0) 2023.06.10

댓글