Docker Network들에 대해 실습과 함께 알아보자!(Bridge, Host, None)

NewNewDaddy·2025년 1월 11일
1

DOCKER-KUBERNETES

목록 보기
11/11
post-thumbnail

0. INTRO

  • Docker Container는 제 개인적인 느낌으로는 '원할 때 빌려 쓰고 반납할 수 있는 가벼운 리눅스 서버'라고 생각하면 되고, Docker 명령어들은 그 리눅스 서버 즉, 컨테이너들을 관리해주는 명령어라고 생각하면 이해가 쉽습니다.
  • 컨테이너들도 특정 IP 대역 내에서 각각 독립적인 IP 주소를 가지며, Docker Network는 이러한 Docker 관련 네트워크를 세부적으로 관리하는 중요한 개념입니다.
  • 이번 글에서는 Docker 네트워크의 종류와 각 네트워크별 차이를 실습을 통해 알아보았습니다. (참고로, Overlay Network는 Docker Swarm 모드에서 사용되기 때문에 이번 글에서는 생략하였습니다.)

🔹 1. Bridge 네트워크

  • Bridge 네트워크는 Docker의 기본 네트워크로 'Docker0' 라는 가상의 네트워크를 생성하여 같은 네트워크 망 안에 있는 컨테이너들을 연결하게 됩니다.
  • 물론 Bridge 타입으로 사용자가 지정한 격리된 네트워크 환경을 새롭게 만들 수도 있으며, 동일한 네트워크 안에 있는 컨테이너들끼리는 서로 자유롭게 통신이 가능합니다.

▪ 1-1) 네트워크 목록 확인

docker network ls

---
NETWORK ID     NAME              DRIVER    SCOPE
eed9d298c9cd   bridge            bridge    local
5cedcb62cb1b   host              host      local
77664d387571   none              null      local

▪ 1-2) 컨테이너의 네트워크 및 IP 주소 확인

docker inspect [컨테이너 ID]

---
...
            "Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "eed9d298c9cd85abf1ec1eea1f5ec952d585ca680c28059258e8d8d2183a2f79",
                    "EndpointID": "7354ffd83d800907354d215623fb2b26dfe8ebabb2f82424a35dd314caa979cf",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.2",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

▪ 1-3) Bridge 네트워크 생성

  • subnet 범위와 gateway 주소를 지정하여 생성할 수도 있고, 지정하지 않으면 자동으로 정해집니다.
docker network create \
  --subnet=10.10.10.0/24 \
  --gateway=10.10.10.1 \
  new_bridge
  • docker network ls 명령어로 조회시 위에서 생성한 new_bridge 네트워크가 추가된 것을 확인할 수 있습니다.
NETWORK ID     NAME              DRIVER    SCOPE
eed9d298c9cd   bridge            bridge    local
0aeb18a85fe5   new_bridge        bridge    local
5cedcb62cb1b   host              host      local
77664d387571   none              null      local

▪ 1-4) 각 네트워크에 컨테이너 생성

  • 기본 bridge 네트워크와 위에서 생성한 my_bridge 네트워크에 각각 컨테이너를 생성해보는 실습입니다. 실습에 사용되는 hyunsoolee0506/nginx_network 이미지는 ping 명령어 사용이 가능하도록 기존의 nginx 이미지를 약간 커스텀한 이미지입니다.
  • default 네트워크 컨테이너
docker run -d \
  --name default1 \
  hyunsoolee0506/nginx_network
  • my_bridge 네트워크 컨테이너
docker run -d \
  --name my1 \
  --network my_bridge
  hyunsoolee0506/nginx_network
  • 위에서 생성한 default1 컨테이너와 my1 컨테이너는 서로 다른 네트워크에 생성되어 있기 때문에 서로 통신이 불가능합니다.

▪ 1-5) 컨테이너에 네트워크 연결

  • docker network connect 명령어를 통해 컨테이너에 특정 네트워크를 연결시킬 수 있습니다.
  • default1 컨테이너에 my_bridge 컨테이너를 연결하면 default1 컨테이너와 my1 컨테이너는 통신이 가능해집니다.
docker network connect [네트워크 이름] [컨테이너 이름]
docker network connect my_bridge default1

  • 네트워크 연결을 해제하려면 disconnect 명령을 사용하면 됩니다.
docker network disconnect [네트워크 이름] [컨테이너 이름]
docker network disconnect my_bridge default1

🔹 2. Host 네트워크

  • Host 네트워크는 컨테이너가 별도의 IP를 할당받지 않고, Docker가 실행되는 서버(Host)의 네트워크를 그대로 공유하여 사용하는 형태입니다.
  • Host의 네트워크를 사용하기 때문에 컨테이너 생성시 별도의 port forwarding을 해주지 않아도 서비스 되는 컨테이너의 포트를 통해 바로 접속이 가능합니다.
  • NAT 방식을 사용하지 않기 때문에 해당 방식을 사용하는 Bridge 네트워크에 비해 성능적으로 우수합니다. 하지만, 보안적으로 취약할 수 있으며 포트 충돌의 위험성도 가지고 있습니다.

▪ 2-1) Nginx 컨테이너 생성 실습

  • Nginx 컨테이너는 기본적으로 80 포트가 expose 되어 있기 때문에 서비스에 접속하기 위해서는 일반적으로 -p 80:80 이런식으로 port forwarding을 해주지만, host 네트워크를 사용하면 해당 옵션 없이 서비스에 접속이 가능합니다.
  • 여기서 유의해야 할 점은 Host 네트워크 실습은 반드시 Linux 서버 환경에서만 가능합니다.(Windows나 Mac에서는 안됨!) 따라서 이번 실습은 Google Cloud Platform에서 Ubuntu OS의 Compute Engine을 한 대 빌려서 진행하였습니다.
docker run -d \
  --name nginx_host \
  --network host \
  nginx
  • 접속 : [Compute Engine 외부 IP]:80

▪ 2-2) Jupyter Lab 컨테이너 생성 실습

  • jupyter/base-notebook 이미지는 8888 포트가 expose 되어있어 -p 8888:8888 옵션과 함께 컨테이너를 생성하지만, Host 네트워크를 사용하는 상황에서는 역시 해당 옵션 없이 8888 포트의 서비스로 접속이 가능합니다.
docker run -d \
  --name jupyter_host \
  --network host \
  jupyter/base-notebook
  • 접속 : [Compute Engine 외부 IP]:8888

🔹 3. None 네트워크

  • None 네트워크는 컨테이너가 아무런 네트워크를 사용하지 않도록 하는 옵션입니다.
  • 기본적으로 컨테이너가 생성되면 가상의 네트워크 인터페이스도 같이 생겨서 IP가 부여되게 되는데 None 네트워크 상태의 컨테이너는 이런 네트워크 인터페이스나 IP 설정이 없는 상태로 실행되어 외부와 완전히 격리되게 됩니다.
  • Inbound, Outbound 트래픽이 모두 차단된 상태로 외부 네트워크나 다른 컨테이너와의 통신이 불가능하지만 exec 명령어를 통해 컨테이너 내부 터미널로의 접근은 가능하여 네트워크 없이 독립적으로 실행되어야 하는 작업이나 테스트용으로 적합합니다.

▪ 3-1) None 네트워크 컨테이너 생성 실습

  • 실습에 사용할 hyunsoolee0506/file-generator 이미지는 컨테이너 생성시 내부에서 5초에 한 번씩 timestamp를 특정 파일에 기록하는 python 프로그램이 작동됩니다.
docker run -d \
  --name none_cnt \
  --network none \
  hyunsoolee0506/file-generator
  • 로그 확인
docker exec -it none_cnt cat write_timestamp.txt 

---
This file was created at 2025-01-10_15-41-33
This file was created at 2025-01-10_15-41-38
This file was created at 2025-01-10_15-41-43
This file was created at 2025-01-10_15-41-48
This file was created at 2025-01-10_15-41-53
This file was created at 2025-01-10_15-41-58
This file was created at 2025-01-10_15-42-03
...

🔹 4. OUTRO

  • Docker Network 주요 종류인 Bridge, Host, None 네트워크에 대해 각각 실습을 통해 알아보았습니다. 일반적으로 Bridge 네트워크가 가장 많이 사용되는데, Docker에서 이러한 네트워크의 구성과 흐름을 이해하면 컨테이너 간 통신이나 외부 서비스에서 컨테이너로 접속이 필요한 상황에서도 혼란 없이 문제를 해결할 수 있을 거라 생각합니다.

Docker Network 별 특징 정리

profile
데이터 엔지니어의 작업공간 / #PYTHON #CLOUD #SPARK #AWS #GCP #NCLOUD

0개의 댓글