개발 ON
  • [Network | Docker] 네트워크
    2024년 07월 03일 23시 12분 11초에 업로드 된 글입니다.
    작성자: 이주여이

    컨테이너의 eth0 인터페이스는 호스트의 veth … 인터페이스(도커 컨테이너 시작 시 생성)와 연결되며 veth 인터페이스는 docker0 브리지와 바인딩되기 때문에 외부 통신이 가능하다.

     

    이해하기 위해 직접 확인해보자.

     

    [root@localhost ~]# docker ps
    CONTAINER ID   IMAGE                   COMMAND                  CREATED        STATUS        PORTS                                                  NAMES
    b97d76ab0c2d   mysql:5.7               "docker-entrypoint.s…"   3 hours ago    Up 3 hours    33060/tcp, 0.0.0.0:3308->3306/tcp, :::3308->3306/tcp   mysql
    3d3ebab72926   rockylinux/rockylinux   "/usr/sbin/init"         19 hours ago   Up 12 hours   0.0.0.0:8081->80/tcp, :::8081->80/tcp                  rockylinux

    현재 실행 중인 컨테이너를 출력한다. 전체 컨테이너를 출력하려면 -a 옵션을 붙여주면 된다. 나는 rockylinux로 들어갈 것이다.

     

    [root@localhost ~]# docker exec -it rockylinux /bin/bash
    • exec - 현재 실행 중인 컨테이너에 새로운 명령을 부여한다.
    • -i - 터미널 입력을 받을 수 있다.
    • -t - 가상 터미널을 할당한다.
    • rockylinux - 컨테이너 생성 시 지정한 컨테이너 이름
    • /bin/bash - 컨테이너 내에서 실행할 명령어로 지금은 bash shell을 실행한다.

     

    이후 해당 컨테이너에 bash shell로 접속 후 네트워크 인터페이스 정보를 확인한다.

    [root@3d3ebab72926 /]# ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.0.4  netmask 255.255.0.0  broadcast 172.17.255.255
            ether 02:42:ac:11:00:04  txqueuelen 0  (Ethernet)
            RX packets 1496  bytes 15634237 (14.9 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 953  bytes 71539 (69.8 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

     

    컨테이너 내부에서 ifconfig를 통해 출력된 결과와 그림을 같이 비교하면 1. 도커 컨테이너의 네트워크 인터페이스에는 eth0과 lo 네트워크 인터페이스가 존재한다. 그리고 2. 컨테이너의 eth0 인터페이스는 호스트의 veth … 인터페이스(도커 컨테이너 시작 시 생성)와 연결되어 있으며 3. veth 인터페이스는 docker0 브리지와 바인딩되기 때문에 외부 통신이 가능한 것이다.

     

    veth는 컨테이너 1개 당 하나씩 생성되는 네트워크 인터페이스인데 위에서 설명하기를 veth 인터페이스는 docker0 브리지와 바인딩된다고 설명했다.

     

    [root@localhost ~]# ifconfig
    docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
            inet6 fe80::42:8eff:fefe:2f30  prefixlen 64  scopeid 0x20<link>
            ether 02:42:8e:fe:2f:30  txqueuelen 0  (Ethernet)
            RX packets 5951  bytes 1743562 (1.6 MiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 8329  bytes 96413755 (91.9 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 1  bytes 576 (576.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 1  bytes 576 (576.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    veth3109825: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet6 fe80::78e6:85ff:fe27:4d11  prefixlen 64  scopeid 0x20<link>
            ether 7a:e6:85:27:4d:11  txqueuelen 0  (Ethernet)
            RX packets 953  bytes 71539 (69.8 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 1497  bytes 15634307 (14.9 MiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    vethb9d211c: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet6 fe80::24a2:9ff:fedd:cbb8  prefixlen 64  scopeid 0x20<link>
            ether 26:a2:09:dd:cb:b8  txqueuelen 0  (Ethernet)
            RX packets 481  bytes 260087 (253.9 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 599  bytes 64745 (63.2 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    ifconfig를 통해 네트워크 인터페이스를 확인하면 컨테이너 개수 만큼 veth 인터페이스가 생성되어 있는 것을 확인할 수 있다. docker0 브리지 또한 존재한다.

     

    이제 브리지 네트워크를 구성 & 관리할 수 있는 brctl 명령어를 통해 veth 인터페이스와 docker0 브리지가 연결되어있는지 확인한다.

     

    [root@localhost ~]# brctl show docker0
    bridge name     bridge id               STP enabled     interfaces
    docker0         8000.02428efe2f30       no              veth3109825
                                                            vethb9d211
    댓글