docker network create 명령어를 사용하여 컨테이너 네트워크 관리 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker network create 명령어를 사용하여 컨테이너 네트워크를 효과적으로 관리하는 방법을 배우게 됩니다. 다양한 네트워크 유형과 구성을 탐구하여 컨테이너가 서로 및 외부 세계와 어떻게 통신하는지 이해할 것입니다.

구체적으로, 기본적인 bridge 네트워크를 생성하고, 특정 서브넷과 게이트웨이로 bridge 네트워크를 사용자 정의하며, 멀티 호스트 통신 시나리오를 위해 attachable 및 internal overlay 네트워크를 설정하는 실습 경험을 얻게 됩니다. 이 랩을 마치면 Docker 컨테이너를 위한 다양한 네트워크 토폴로지를 설계하고 구현하는 방법에 대한 확실한 이해를 갖게 될 것입니다.

기본 bridge 네트워크 생성

이 단계에서는 Docker 에서 기본 bridge 네트워크를 생성하는 방법을 배우겠습니다. Bridge 네트워크는 컨테이너의 기본 네트워크 유형입니다. 동일한 bridge 네트워크에 연결된 컨테이너는 서로 통신할 수 있지만, 다른 bridge 네트워크의 컨테이너 및 호스트 머신의 네트워크와는 격리됩니다.

먼저, 기존 Docker 네트워크를 나열하여 기본 네트워크를 확인해 보겠습니다.

docker network ls

bridge, host, none과 같은 몇 가지 기본 네트워크가 표시됩니다. bridge 네트워크가 우리가 작업할 네트워크입니다.

이제 새로운 bridge 네트워크를 생성해 보겠습니다. 이름을 my-bridge-network로 지정합니다.

docker network create my-bridge-network

이 명령어는 기본 설정으로 새로운 bridge 네트워크를 생성합니다. Docker 는 이 네트워크에 자동으로 서브넷과 게이트웨이를 할당합니다.

네트워크가 성공적으로 생성되었는지 확인하려면 Docker 네트워크를 다시 나열합니다.

docker network ls

이제 목록에 my-bridge-network가 표시되어야 합니다.

다음으로, 새로 생성된 네트워크를 검사하여 Docker 가 할당한 서브넷 및 게이트웨이를 포함한 세부 정보를 확인해 보겠습니다.

docker network inspect my-bridge-network

이 명령의 출력은 ID, 드라이버 ( bridge여야 함) 및 IPAM 섹션 아래의 서브넷 및 게이트웨이와 같은 네트워크에 대한 자세한 정보를 제공합니다.

이제 컨테이너를 실행하고 새 네트워크에 연결해 보겠습니다. 이 예제에서는 alpine 이미지를 사용합니다. 로컬에 alpine 이미지가 없는 경우 Docker 가 자동으로 가져옵니다.

docker run -d --name container1 --network my-bridge-network alpine sleep infinity

이 명령어는 container1이라는 컨테이너를 detached 모드 (-d) 로 실행하고, my-bridge-network에 연결 (--network my-bridge-network) 하며, sleep infinity 명령을 실행하여 계속 실행되도록 합니다.

컨테이너가 실행 중이고 올바른 네트워크에 연결되었는지 확인하려면 컨테이너를 검사할 수 있습니다.

docker inspect container1

출력에서 Networks 섹션을 찾습니다. my-bridge-network가 해당 네트워크 내에서 컨테이너에 할당된 IP 주소와 함께 나열되어야 합니다.

마지막으로, 다른 컨테이너를 실행하고 동일한 네트워크에 연결하여 컨테이너 간의 통신을 시연해 보겠습니다.

docker run -d --name container2 --network my-bridge-network alpine sleep infinity

이제 container1container2가 모두 my-bridge-network에 연결되었습니다. 네트워크 내에서 컨테이너 이름 또는 IP 주소를 사용하여 서로 통신할 수 있어야 합니다.

통신을 테스트하기 위해 container1 내부에서 container2를 ping 하는 명령을 실행할 수 있습니다. 먼저, ping 명령을 사용하기 위해 alpine 컨테이너에 iputils 패키지를 설치해야 합니다.

docker exec container1 apk add --no-cache iputils
docker exec container2 apk add --no-cache iputils

이제 container1에서 container2를 ping 합니다.

docker exec container1 ping -c 3 container2

성공적인 ping 응답이 표시되어 동일한 bridge 네트워크의 두 컨테이너가 통신할 수 있음을 나타냅니다.

사용자 정의 서브넷 및 게이트웨이를 갖는 bridge 네트워크 생성

이전 단계에서는 기본 설정으로 bridge 네트워크를 생성했습니다. Docker 는 자동으로 서브넷과 게이트웨이를 할당했습니다. 이 단계에서는 bridge 네트워크를 생성하고 자체 서브넷과 게이트웨이를 지정하는 방법을 배우겠습니다. 이렇게 하면 컨테이너의 네트워크 구성에 대한 더 많은 제어 권한을 얻을 수 있습니다.

먼저, 이전 단계에서 생성된 컨테이너와 네트워크를 제거하여 처음부터 시작해 보겠습니다.

docker stop container1 container2
docker rm container1 container2
docker network rm my-bridge-network

이제 custom-bridge-network라는 새 bridge 네트워크를 생성하고 --subnet--gateway 플래그를 사용하여 사용자 정의 서브넷과 게이트웨이를 지정해 보겠습니다. 서브넷 172.20.0.0/16 및 게이트웨이 172.20.0.1을 사용합니다.

docker network create \
  --driver bridge \
  --subnet 172.20.0.0/16 \
  --gateway 172.20.0.1 \
  custom-bridge-network

--driver bridge 플래그는 bridge 드라이버를 명시적으로 지정하지만, 이는 기본값입니다. --subnet 플래그는 네트워크의 IP 주소 범위를 정의하고, --gateway 플래그는 이 네트워크에 연결된 컨테이너의 게이트웨이 IP 주소를 설정합니다.

지정된 서브넷 및 게이트웨이로 네트워크가 생성되었는지 확인하려면 네트워크를 검사합니다.

docker network inspect custom-bridge-network

출력에서 IPAM 섹션을 확인합니다. 제공한 값 (172.20.0.0/16172.20.0.1) 과 일치하는 SubnetGateway 필드를 볼 수 있습니다.

이제 컨테이너를 실행하고 새 네트워크에 연결해 보겠습니다. 다시 alpine 이미지를 사용합니다.

docker run -d --name custom-container1 --network custom-bridge-network alpine sleep infinity

이 명령어는 custom-container1이라는 컨테이너를 실행하고 custom-bridge-network에 연결합니다. Docker 는 지정된 서브넷 (172.20.0.0/16) 에서 이 컨테이너에 IP 주소를 할당합니다.

사용자 정의 네트워크 내에서 컨테이너의 IP 주소를 확인하려면 컨테이너를 검사합니다.

docker inspect custom-container1

출력에서 custom-bridge-network에 대한 Networks 섹션 아래에서 172.20.0.0/16 범위 내에 있는 IpAddress를 볼 수 있습니다.

동일한 네트워크에서 다른 컨테이너를 실행해 보겠습니다.

docker run -d --name custom-container2 --network custom-bridge-network alpine sleep infinity

이제 custom-container1custom-container2가 모두 custom-bridge-network에 있으며 통신할 수 있어야 합니다.

이전 단계와 마찬가지로 ping 하려면 iputils가 필요합니다.

docker exec custom-container1 apk add --no-cache iputils
docker exec custom-container2 apk add --no-cache iputils

custom-container1에서 custom-container2를 ping 하여 통신을 테스트합니다.

docker exec custom-container1 ping -c 3 custom-container2

성공적인 ping 응답이 표시되어 사용자 정의 bridge 네트워크 내의 통신을 확인합니다.

멀티 호스트 통신을 위한 attachable overlay 네트워크 생성

Bridge 네트워크는 동일한 Docker 호스트의 컨테이너 간 통신에 적합합니다. 그러나 서로 다른 Docker 호스트에서 실행되는 컨테이너 간의 통신을 위해서는 overlay 네트워크가 필요합니다. Overlay 네트워크는 Docker Swarm 에 의해 생성 및 관리됩니다.

이 단계에서는 연결 가능한 overlay 네트워크를 생성합니다. 연결 가능한 overlay 네트워크를 사용하면 독립 실행형 컨테이너 (Swarm 서비스의 일부가 아님) 가 연결하여 서로 다른 Docker 호스트에서 통신할 수 있습니다.

먼저, 이 호스트에서 Docker Swarm 을 초기화해야 합니다. 이는 overlay 네트워크를 생성하고 관리하는 데 필요합니다.

docker swarm init --advertise-addr $(hostname -I | awk '{print $1}')

이 명령어는 Swarm 을 초기화하고 advertise 주소를 호스트의 IP 주소로 설정합니다. 출력에는 현재 노드가 이제 Swarm manager 임을 보여줍니다.

이제 Swarm 이 초기화되었으므로 연결 가능한 overlay 네트워크를 생성할 수 있습니다. 이름을 my-overlay-network로 지정합니다. --attachable 플래그는 독립 실행형 컨테이너의 연결을 허용하는 데 중요합니다.

docker network create \
  --driver overlay \
  --attachable \
  my-overlay-network

--driver overlay 플래그는 overlay 네트워크를 생성하고 있음을 지정합니다. --attachable 플래그는 독립 실행형 컨테이너에 네트워크를 사용할 수 있도록 합니다.

overlay 네트워크가 생성되었는지 확인하려면 Docker 네트워크를 나열합니다.

docker network ls

목록에 my-overlay-network가 표시되어야 하며, 드라이버는 overlay여야 합니다.

이제 독립 실행형 컨테이너를 실행하고 새 overlay 네트워크에 연결해 보겠습니다. alpine 이미지를 사용합니다.

docker run -d --name overlay-container1 --network my-overlay-network alpine sleep infinity

이 명령어는 overlay-container1이라는 컨테이너를 실행하고 my-overlay-network에 연결합니다.

컨테이너가 overlay 네트워크에 연결되었는지 확인하려면 컨테이너를 검사합니다.

docker inspect overlay-container1

출력에서 Networks 섹션을 찾습니다. my-overlay-network가 나열되어야 합니다.

이것은 단일 호스트 환경이므로 멀티 호스트 통신을 완전히 시연할 수는 없습니다. 그러나 여러 Swarm 노드가 있는 경우 네트워크가 이를 허용하도록 구성됩니다.

이 단일 호스트에서 동일한 overlay 네트워크에서 다른 컨테이너를 실행해 보겠습니다.

docker run -d --name overlay-container2 --network my-overlay-network alpine sleep infinity

이제 overlay-container1overlay-container2가 모두 my-overlay-network에 있으며 통신할 수 있어야 합니다.

ping 을 위해 컨테이너에 iputils를 설치합니다.

docker exec overlay-container1 apk add --no-cache iputils
docker exec overlay-container2 apk add --no-cache iputils

overlay-container1에서 overlay-container2를 ping 하여 통신을 테스트합니다.

docker exec overlay-container1 ping -c 3 overlay-container2

성공적인 ping 응답이 표시되어 이 단일 호스트의 overlay 네트워크 내에서 통신이 확인됩니다.

내부 overlay 네트워크 생성

이전 단계에서는 독립 실행형 컨테이너가 연결할 수 있는 연결 가능한 overlay 네트워크를 생성했습니다. 이 단계에서는 내부 overlay 네트워크를 생성합니다. 내부 네트워크는 외부 네트워크로부터 격리되어 있으므로, 내부 네트워크의 컨테이너는 명시적으로 허용되지 않는 한 외부 세계 (Docker 호스트의 네트워크 포함) 와 통신할 수 없습니다. 이는 Swarm 내에서 격리된 서비스 네트워크를 생성하는 데 유용합니다.

먼저, 이전 단계에서 생성된 컨테이너와 네트워크를 정리해 보겠습니다.

docker stop overlay-container1 overlay-container2
docker rm overlay-container1 overlay-container2
docker network rm my-overlay-network

이제 my-internal-network라는 내부 overlay 네트워크를 생성해 보겠습니다. 이를 위해 --internal 플래그를 사용합니다.

docker network create \
  --driver overlay \
  --internal \
  my-internal-network

--internal 플래그는 이 네트워크에 연결된 컨테이너가 외부 네트워크와 통신할 수 없도록 합니다.

내부 overlay 네트워크가 생성되었는지 확인하려면 Docker 네트워크를 나열합니다.

docker network ls

목록에 my-internal-networkoverlay 드라이버와 함께 표시되어야 합니다.

이제 컨테이너를 실행하고 새 내부 네트워크에 연결해 보겠습니다. alpine 이미지를 사용합니다.

docker run -d --name internal-container1 --network my-internal-network alpine sleep infinity

이 명령어는 internal-container1이라는 컨테이너를 실행하고 my-internal-network에 연결합니다.

컨테이너가 내부 네트워크에 연결되었는지 확인하려면 컨테이너를 검사합니다.

docker inspect internal-container1

출력에서 Networks 섹션을 찾습니다. my-internal-network가 나열되어야 합니다.

동일한 내부 네트워크에서 다른 컨테이너를 실행해 보겠습니다.

docker run -d --name internal-container2 --network my-internal-network alpine sleep infinity

이제 internal-container1internal-container2가 모두 my-internal-network에 있습니다. 서로 통신할 수 있지만 외부 세계와는 통신할 수 없습니다.

ping 을 위해 컨테이너에 iputils를 설치합니다.

docker exec internal-container1 apk add --no-cache iputils
docker exec internal-container2 apk add --no-cache iputils

internal-container1에서 internal-container2를 ping 하여 통신을 테스트합니다.

docker exec internal-container1 ping -c 3 internal-container2

성공적인 ping 응답이 표시되어 내부 overlay 네트워크 내의 통신을 확인합니다.

이제 internal-container1에서 google.com과 같은 외부 주소를 ping 해 보겠습니다.

docker exec internal-container1 ping -c 3 google.com

내부 네트워크가 외부 네트워크로부터 격리되어 있으므로 이 ping 은 실패해야 합니다.

요약

이 랩에서는 docker network create 명령을 사용하여 컨테이너 네트워크를 관리하는 방법을 배웠습니다. 컨테이너의 기본 네트워크 유형인 기본적인 bridge 네트워크를 생성하는 것으로 시작하여 docker network lsdocker network inspect를 사용하여 생성 및 세부 정보를 확인했습니다. 그런 다음 새로 생성된 네트워크에 컨테이너를 연결하는 방법을 시연했습니다.

기본 bridge 네트워크를 기반으로, 네트워크의 IP 주소 지정을 더 잘 제어하기 위해 사용자 지정 서브넷과 게이트웨이를 사용하여 bridge 네트워크를 생성하는 방법을 탐구했습니다. 마지막으로, 멀티 호스트 통신을 위한 연결 가능한 overlay 네트워크와 swarm 내에서 격리된 통신을 위한 내부 overlay 네트워크를 생성하여 다양한 배포 시나리오에 대한 Docker 네트워킹의 다재다능함을 보여주는 overlay 네트워크 생성을 자세히 살펴보았습니다.