동일한 사용자 정의 네트워크에서 컨테이너 간 통신 테스트 방법

DockerBeginner
지금 연습하기

소개

Docker 는 컨테이너 환경에서 애플리케이션을 구축, 배포 및 실행하는 강력한 플랫폼입니다. Docker 컨테이너 간의 통신을 관리하고 테스트하는 방법을 이해하는 것은 강력하고 확장 가능한 애플리케이션을 구축하는 데 필수적입니다. 이 튜토리얼에서는 사용자 정의 Docker 네트워크를 생성하고 동일한 네트워크에서 컨테이너 간의 통신을 테스트하는 과정을 안내합니다.

Docker 네트워크 이해

Docker 는 컨테이너가 서로 그리고 외부 세계와 통신할 수 있도록 내장 네트워킹 시스템을 제공합니다. Docker 는 다음과 같은 여러 유형의 네트워크를 지원합니다.

브리지 네트워크

Docker 의 기본 네트워크 유형은 브리지 네트워크입니다. 새 컨테이너를 시작하면 다른 네트워크를 지정하지 않는 한 자동으로 기본 브리지 네트워크에 연결됩니다. 동일한 브리지 네트워크에 있는 컨테이너는 컨테이너 이름 또는 IP 주소를 사용하여 서로 통신할 수 있습니다.

graph LR A[호스트] -- 브리지 네트워크 --> B[컨테이너 1] A[호스트] -- 브리지 네트워크 --> C[컨테이너 2] B[컨테이너 1] -- 브리지 네트워크 --> C[컨테이너 2]

호스트 네트워크

호스트 네트워크를 사용하면 컨테이너가 Docker 네트워크를 우회하여 호스트의 네트워크 스택을 직접 사용할 수 있습니다. 이는 성능에 민감한 애플리케이션이나 호스트 특정 네트워크 리소스에 액세스해야 할 때 유용합니다.

오버레이 네트워크

오버레이 네트워크는 여러 Docker 데몬을 연결하여 Swarm 서비스가 서로 통신할 수 있도록 합니다. 오버레이 네트워크는 일반적으로 Docker Swarm 환경에서 사용됩니다.

사용자 정의 네트워크

기본 네트워크 외에도 사용자 정의 네트워크를 만들 수 있습니다. 사용자 정의 네트워크를 통해 컨테이너를 서로 분리하고 통신 방식을 제어할 수 있습니다. 이는 더 복잡하고 다층 애플리케이션을 구축하는 데 유용합니다.

graph LR A[호스트] -- 사용자 정의 네트워크 --> B[컨테이너 1] A[호스트] -- 사용자 정의 네트워크 --> C[컨테이너 2] B[컨테이너 1] -- 사용자 정의 네트워크 --> C[컨테이너 2]

Docker 의 네트워킹 기능을 이해하는 것은 컨테이너화된 애플리케이션을 구축하고 관리하는 데 필수적입니다. 다음 섹션에서는 사용자 정의 네트워크를 생성하고 해당 네트워크에서 컨테이너 간의 통신을 테스트하는 방법을 살펴볼 것입니다.

사용자 정의 네트워크 생성

Docker 에서 사용자 정의 네트워크를 생성하려면 docker network create 명령어를 사용할 수 있습니다. 이 명령어를 통해 네트워크 드라이버, 서브넷 및 기타 구성 옵션을 지정할 수 있습니다.

사용자 정의 브리지 네트워크 생성

my-network라는 사용자 정의 브리지 네트워크를 생성해 보겠습니다.

docker network create my-network

docker network ls 명령어를 사용하여 네트워크 생성을 확인할 수 있습니다.

NETWORK ID     NAME         DRIVER    SCOPE
a1b2c3d4e5f6   my-network   bridge    local

사용자 정의 네트워크에 컨테이너 연결

이제 두 개의 컨테이너를 시작하고 my-network 사용자 정의 네트워크에 연결해 보겠습니다.

## 컨테이너 1 시작
docker run -d --name container1 --network my-network ubuntu:22.04 sleep infinity

## 컨테이너 2 시작
docker run -d --name container2 --network my-network ubuntu:22.04 sleep infinity

docker network inspect 명령어를 사용하여 네트워크를 검사하고 연결된 컨테이너를 확인할 수 있습니다.

[
  {
    "Name": "my-network",
    "Id": "a1b2c3d4e5f6",
    "Created": "2023-04-18T12:34:56.789Z",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": {},
      "Config": [
        {
          "Subnet": "172.18.0.0/16"
        }
      ]
    },
    "Internal": false,
    "Attachable": false,
    "Ingress": false,
    "ConfigFrom": {
      "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {
      "container1_id": {
        "Name": "container1",
        "EndpointID": "container1_endpoint_id",
        "MacAddress": "02:42:ac:12:00:02",
        "IPv4Address": "172.18.0.2/16",
        "IPv6Address": ""
      },
      "container2_id": {
        "Name": "container2",
        "EndpointID": "container2_endpoint_id",
        "MacAddress": "02:42:ac:12:00:03",
        "IPv4Address": "172.18.0.3/16",
        "IPv6Address": ""
      }
    },
    "Options": {},
    "Labels": {}
  }
]

이제 사용자 정의 네트워크를 생성하고 컨테이너를 연결했으므로 다음 섹션에서 컨테이너 간의 통신을 테스트할 수 있습니다.

컨테이너 간 통신 테스트

이제 사용자 정의 네트워크를 생성하고 컨테이너를 연결했으므로 컨테이너 간 통신을 테스트할 수 있습니다.

컨테이너 간 Ping

먼저 한 컨테이너에서 다른 컨테이너로 Ping 을 실행해 보겠습니다.

## 첫 번째 컨테이너에 진입
docker exec -it container1 bash

## 이름으로 두 번째 컨테이너에 Ping
ping -c 4 container2

출력 결과는 컨테이너가 컨테이너 이름을 사용하여 서로 통신할 수 있음을 보여줄 것입니다.

PING container2 (172.18.0.3) 56(84) bytes of data.
64 bytes from container2.my-network (172.18.0.3): icmp_seq=1 ttl=64 time=0.065 ms
64 bytes from container2.my-network (172.18.0.3): icmp_seq=2 ttl=64 time=0.057 ms
64 bytes from container2.my-network (172.18.0.3): icmp_seq=3 ttl=64 time=0.057 ms
64 bytes from container2.my-network (172.18.0.3): icmp_seq=4 ttl=64 time=0.057 ms

--- container2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3ms
rtt min/avg/max/mdev = 0.057/0.059/0.065/0.003 ms

TCP 통신 테스트

컨테이너 간 TCP 통신도 테스트할 수 있습니다. 예를 들어, 한 컨테이너에서 간단한 HTTP 서버를 실행하고 다른 컨테이너에서 접근할 수 있습니다.

## container1에서 간단한 HTTP 서버 시작
docker exec -it container1 bash
python3 -m http.server 8000

## 다른 터미널에서 container2에서 HTTP 서버 접근
docker exec -it container2 bash
curl http://container1:8000

두 번째 터미널의 출력은 첫 번째 컨테이너에서 실행 중인 HTTP 서버의 내용을 보여줄 것입니다.

동일한 사용자 정의 네트워크에서 컨테이너 간 통신을 테스트함으로써 컨테이너화된 애플리케이션 구성 요소가 서로 제대로 상호 작용할 수 있음을 확인할 수 있습니다. 이는 복잡하고 다중 서비스 애플리케이션을 구축하고 배포하는 데 필수적입니다.

요약

이 Docker 튜토리얼에서는 사용자 정의 네트워크를 생성하고, 해당 네트워크에서 컨테이너를 시작하며, 컨테이너 간 통신을 확인하는 방법을 배웁니다. 이 가이드를 마치면 Docker 컨테이너 간의 연결성을 테스트하고, 동일한 사용자 정의 네트워크 내에서 애플리케이션이 원활하게 상호 작용할 수 있도록 하는 지식과 기술을 갖추게 될 것입니다.