[Docker] 네트워크

whatSup CheatSheet·2022년 9월 30일
0

Container

목록 보기
5/9
post-thumbnail
post-custom-banner

도커와 네트워크

  • 네트워크란?
    • 컴퓨터 네트워크 또는 컴퓨터망은 노드들이 자원을 공유할 수 있게 하는 통신망 장치입니다.
    • 즉, 분산되어 있는 컴퓨터를 통신망으로 연결한 것을 말합니다.
  • 도커의 네트워크
    • 도커의 네트워크는 주로 호스트 머신에서 컨테이너 간 또는 콘테이너와 외부 간 자원을 공유할 수 있게 하는 통신망 장치를 의미합니다.

도커 네트워크 구조

  • 도커의 네트워크 구조는 위와 같이 구성되어 있습니다.
    • eth0(host) : 호스트가 사용하는 네트워크 인터페이스를 의미합니다.
      • (참고) 우분투 특정 버전 이후부터는 하드웨어 장치에 따라 유동적으로 이름이 변경되도록 바뀌었습니다
    • docker0 : 도커 설치 시 자동으로 생성되는 네트워크 인터페이스입니다.
    • veth : 도커 컨테이너를 생성하면 내부적으로 docker0과 연결되는 네트워크 인터페이스가 생성됩니다.
  • 다음 명령어로 리눅스에서 네트워크 설정 정보를 확인할 수 있습니다.
ip addr

# 패키지가 없다면 다음 명령어로 설치 후 입력
# apt install iproute2

  • 도커 컨테이너를 생성하면, 컨테이너는 호스트 서버와 Network namespace가 격리되어 있습니다.
    • 컨테이너 내부에는 가상 NIC(Network Interface Controller)(eth0)가 생성되며 Host의 가상 NIC인 veth와 연결되어 있습니다.
    • vethdocker0이라는 브릿지 네트워크를 통해 하나의 Host IP로부터 NAPT(Network Address Port Translation)을 이용하여 각 컨테이너와 상호작용하게 됩니다.
    • 도커 컨테이너 생성 시 IP 주소는 172.17.0.2 부터 시작합니다.

도커 네트워크 종류

  • 도커에는 다음과 같이 여러 종류의 네트워크가 있습니다.

bridge

  • 기본(default) 네트워크 드라이버입니다.
  • 브리지 네트워크는 동일한 Docker 데몬 호스트에서 실행되는 컨테이너에 사용됩니다.

host

  • 컨테이너를 host 네트워크와 격리시키지 않으며, 컨테이너는 호스트의 네트워킹 네임스페이스를 공유합니다.
  • 이를 통해 호스트의 포트를 이용하여 바로 서비스할 수 있습니다.

overlay

  • 여러 Docker 데몬을 함께 연결하고 스웜 서비스가 서로 통신할 수 있도록 합니다.
    • 스웜이란 도커의 Container Ochestartion 시스템을 의미합니다.

none

  • 컨테이너의 네트워크를 사용하지 않도록 설정합니다.
  • 해당하는 컨테이너는 외부와 통신이 단절됩니다.

macvlan

  • 컨테이너에 MAC 주소를 할당하여 네트워크에서 물리적 장치로 직접 연결할 수 있습니다.
  • Docker 데몬은 MAC 주소로 트래픽을 라우팅합니다.

네트워크 기본 명령어

network 목록 가져오기

  • 다음 명령어로 network 목록을 가져올 수 있습니다.
docker network ls

# 출력 내용
NETWORK ID     NAME      DRIVER    SCOPE
0fe2eaa0e0a3   bridge    bridge    local
39c2ab652d4c   host      host      local
0c81514b4490   none      null      local

# 도커 데몬이 실행되면 위와 같이 `bridge`, `host`, `none`이 기본적으로 생성됩니다.
# 컨테이너를 생성하면, 기본적으로 default `bridge`에 연결됩니다.

네트워크 정보 확인하기

  • 다음 명령어로 network에 대한 자세한 정보를 확인할 수 있습니다.
# network에 대한 자세한 정보 확인
# 이름, 생성 시각, 드라이버 종류, 연결되어 있는 컨테이너 등
docker network inspect <네트워크 이름>

# 컨테이너 inspect에서도 연결되어 있는 네트워크를 확인할 수 있습니다.
docker inspect <컨테이너 이름>

네트워크 생성

  • 다음 명령어를 입력해 새로운 bridge 네트워크를 생성합니다.
docker network create my-bridge

네트워크 연결

  • 컨테이너 생성 시 --net 옵션의 값을 통해 네트워크 종류(이름)을 설정할 수 있습니다.
docker run -itd --name test-container --net my-bridge ubuntu:18.04
  • 혹은 다음 명령어로 새로운 네트워크에 연결할 수 있습니다.
docker network connect bridge test-container

  • 도커 내부에서 ip addr 혹은 ifconfig를 확인하면 새로운 IP 대역이 할당된 것을 확인할 수 있습니다.

네트워크 제거

  • (연결된 컨테이너가 없는 상태에서) 다음 명령어로 네트워크를 제거할 수 있습니다.
docker network rm my-bridge

네트워크 연결 해제

  • 다음 명령어로 네트워크에서 연결을 해제할 수 있습니다.
docker network disconnect bridge test-container

네트워크 테스트

  • 두 우분투 서버를 같은 네트워크에 연결한 후 테스트를 진행합니다.
docker network inspect bridge

# 네트워크 정보 출력
"Containers": {
            "28c2b7576d54b55fbcddcb30d3a82074b244ad634154e085231aeb104ec477aa": {
                "Name": "test",
                "EndpointID": "987e6468a7c4eb22d7c977c6767df4e94965ba446a76ef22fa7f31755de94795",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "e310aacbcbbe6ec2b1f528ca8020bbb278acbb36539b1c572b0878b728eba063": {
                "Name": "test-container",
                "EndpointID": "016e1862bb13b93c321b90b51a94816682a21318bcf418de0eec3ecef9ff63f4",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            }
        },
  • 한 서버에서 다른 서버로 ping을 날려보겠습니다.
docker exec test-container ping -c 1 172.17.0.2

# 다음과 같이 출력되며 정상적으로 연결되어 있음을 확인할 수 있습니다.
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.113 ms

--- 172.17.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.113/0.113/0.113/0.000 ms

Reference

profile
AI Engineer : Lv 0
post-custom-banner

0개의 댓글