소개
Docker 는 컨테이너 환경에서 애플리케이션을 구축, 배포 및 실행하는 강력한 플랫폼입니다. Docker 컨테이너 간의 통신을 관리하고 테스트하는 방법을 이해하는 것은 강력하고 확장 가능한 애플리케이션을 구축하는 데 필수적입니다. 이 튜토리얼에서는 사용자 정의 Docker 네트워크를 생성하고 동일한 네트워크에서 컨테이너 간의 통신을 테스트하는 과정을 안내합니다.
Docker 는 컨테이너 환경에서 애플리케이션을 구축, 배포 및 실행하는 강력한 플랫폼입니다. Docker 컨테이너 간의 통신을 관리하고 테스트하는 방법을 이해하는 것은 강력하고 확장 가능한 애플리케이션을 구축하는 데 필수적입니다. 이 튜토리얼에서는 사용자 정의 Docker 네트워크를 생성하고 동일한 네트워크에서 컨테이너 간의 통신을 테스트하는 과정을 안내합니다.
Docker 는 컨테이너가 서로 그리고 외부 세계와 통신할 수 있도록 내장 네트워킹 시스템을 제공합니다. Docker 는 다음과 같은 여러 유형의 네트워크를 지원합니다.
Docker 의 기본 네트워크 유형은 브리지 네트워크입니다. 새 컨테이너를 시작하면 다른 네트워크를 지정하지 않는 한 자동으로 기본 브리지 네트워크에 연결됩니다. 동일한 브리지 네트워크에 있는 컨테이너는 컨테이너 이름 또는 IP 주소를 사용하여 서로 통신할 수 있습니다.
호스트 네트워크를 사용하면 컨테이너가 Docker 네트워크를 우회하여 호스트의 네트워크 스택을 직접 사용할 수 있습니다. 이는 성능에 민감한 애플리케이션이나 호스트 특정 네트워크 리소스에 액세스해야 할 때 유용합니다.
오버레이 네트워크는 여러 Docker 데몬을 연결하여 Swarm 서비스가 서로 통신할 수 있도록 합니다. 오버레이 네트워크는 일반적으로 Docker Swarm 환경에서 사용됩니다.
기본 네트워크 외에도 사용자 정의 네트워크를 만들 수 있습니다. 사용자 정의 네트워크를 통해 컨테이너를 서로 분리하고 통신 방식을 제어할 수 있습니다. 이는 더 복잡하고 다층 애플리케이션을 구축하는 데 유용합니다.
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 을 실행해 보겠습니다.
## 첫 번째 컨테이너에 진입
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 통신도 테스트할 수 있습니다. 예를 들어, 한 컨테이너에서 간단한 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 컨테이너 간의 연결성을 테스트하고, 동일한 사용자 정의 네트워크 내에서 애플리케이션이 원활하게 상호 작용할 수 있도록 하는 지식과 기술을 갖추게 될 것입니다.