사용자 지정 Docker 네트워크 및 컨테이너 통신을 위한 실용 가이드
Docker는 애플리케이션과 종속성을 가볍고 이식 가능한 컨테이너에 패키징할 수 있게 함으로써 애플리케이션 개발 및 배포에 혁명을 일으켰습니다. 멀티 컨테이너 애플리케이션을 관리하는 데 있어 중요한 측면은 컨테이너들이 서로 효과적이고 안전하게 통신할 수 있도록 보장하는 것입니다. Docker의 기본 네트워킹은 기능적이지만 복잡한 애플리케이션에는 종종 미흡합니다. 이 가이드에서는 사용자 지정 Docker 네트워크, 특히 브리지 네트워크를 생성 및 관리하는 방법을 자세히 살펴보고, Docker CLI와 Docker Compose를 모두 사용하여 컨테이너 서비스 간의 원활한 통신을 구성하는 방법을 보여줄 것입니다.
Docker 네트워킹을 이해하는 것은 견고하고 확장 가능하며 유지보수가 용이한 컨테이너화된 애플리케이션을 구축하는 데 기본이 됩니다. 기본 bridge 네트워크를 넘어 발전하면 네트워크 토폴로지, IP 주소 관리 및 보안에 대한 세부적인 제어 권한을 얻게 되어 보다 예측 가능하고 안정적인 애플리케이션 동작을 이끌어낼 수 있습니다. 이 문서는 사용자의 프로젝트에서 사용자 지정 네트워크를 활용하는 데 필요한 실질적인 지식과 예제를 제공할 것입니다.
사용자 지정 Docker 네트워크를 사용하는 이유?
Docker는 각기 다른 사용 사례에 적합한 여러 네트워크 드라이버를 제공합니다. 기본 bridge 네트워크는 명시적으로 다른 네트워크에 연결되지 않은 컨테이너를 위해 자동으로 생성됩니다. 편리하지만 다음과 같은 한계가 있습니다.
- 제한된 격리: 기본 브리지 네트워크에 있는 컨테이너는 IP 주소를 사용하여 서로 통신할 수 있지만, 이는 항상 직관적이거나 안전한 것은 아닙니다. 컨테이너 이름 확인은 기본적으로 지원되지 않습니다.
- IP 주소 관리: 기본 브리지 네트워크의 컨테이너에 할당된 IP 주소는 동적이며 관리하기 어려울 수 있습니다.
- 확장성 문제: 프로덕션 환경에서는 보다 제어되고 격리된 네트워크 설정이 종종 필요합니다.
사용자 지정 브리지 네트워크는 다음과 같은 상당한 이점을 제공합니다.
- 자동 DNS 확인: 동일한 사용자 지정 브리지 네트워크에 있는 컨테이너는 컨테이너 이름(또는 Docker Compose의 서비스 이름)을 통해 서로를 발견하고 통신할 수 있습니다. 이는 서비스 간 통신에 매우 중요한 변화입니다.
- 향상된 격리: 사용자 지정 네트워크는 컨테이너를 위한 전용 네트워크 세그먼트를 제공하여 보안을 강화하고 네트워크 외부 컨테이너와의 원치 않는 통신을 방지합니다.
- 향상된 IP 주소 관리: 사용자 지정 네트워크에 대한 서브넷 및 게이트웨이 구성을 정의할 수 있습니다.
- 유연성: 다른 컨테이너에 영향을 주지 않고 쉽게 컨테이너를 네트워크에 추가하거나 제거할 수 있습니다.
Docker CLI를 사용한 사용자 지정 브리지 네트워크 생성 및 관리
Docker의 명령줄 인터페이스(CLI)를 사용하면 네트워크를 직접 생성, 검사 및 관리할 수 있습니다. docker network 명령이 주요 도구입니다.
사용자 지정 브리지 네트워크 생성
새로운 사용자 지정 브리지 네트워크를 생성하려면 docker network create 명령을 사용합니다:
docker network create my-custom-network
이 명령은 bridge 드라이버(지정된 드라이버가 없으면 기본값)를 사용하여 my-custom-network라는 네트워크를 생성합니다.
네트워크 검사
다음 명령으로 모든 Docker 네트워크 및 세부 정보를 볼 수 있습니다:
docker network ls
docker network inspect my-custom-network
inspect 명령은 네트워크의 구성, 서브넷 및 연결된 컨테이너를 포함하여 네트워크에 대한 자세한 정보를 제공합니다.
컨테이너를 네트워크에 연결
새 컨테이너를 생성할 때 --network 플래그를 사용하여 사용자 지정 네트워크에 연결할 수 있습니다:
# 웹 서버 컨테이너를 시작하고 my-custom-network에 연결
docker run -d --name webserver --network my-custom-network nginx
# 데이터베이스 컨테이너를 시작하고 동일한 네트워크에 연결
docker run -d --name database --network my-custom-network postgres
이제 webserver 및 database 컨테이너는 이름으로 서로 통신할 수 있습니다. 예를 들어, webserver 컨테이너 내부에서 database의 이름을 사용하여 ping을 보내거나 postgres를 호스트 이름으로 사용하여 PostgreSQL 인스턴스에 연결할 수 있습니다.
기존 컨테이너 연결
docker network connect를 사용하여 실행 중인 컨테이너를 네트워크에 연결할 수도 있습니다:
# 'another-app'이라는 실행 중인 컨테이너가 있다고 가정합니다
docker network connect my-custom-network another-app
컨테이너 연결 해제
컨테이너를 네트워크에서 제거하려면 다음을 수행합니다:
docker network disconnect my-custom-network another-app
네트워크 제거
네트워크를 제거하려면 연결된 모든 컨테이너를 중지하고 제거하거나 연결을 해제해야 합니다. 그런 다음 다음을 사용할 수 있습니다:
docker network rm my-custom-network
Docker Compose를 통한 원활한 통신
Docker Compose는 멀티 컨테이너 Docker 애플리케이션을 정의하고 실행하는 데 매우 유용한 도구입니다. 이를 통해 단일 YAML 파일에서 애플리케이션의 서비스, 네트워크 및 볼륨을 관리할 수 있습니다. Docker Compose에서 사용자 지정 네트워크를 정의하는 것은 간단하며 모든 멀티 서비스 애플리케이션에 강력히 권장됩니다.
docker-compose.yml에서 네트워크 정의
서비스를 위한 사용자 지정 네트워크를 정의하려면 docker-compose.yml 파일의 최상위 수준에서 networks 키를 사용합니다. 그런 다음 각 서비스 정의 아래의 해당 서비스에 대해 네트워크를 지정합니다.
다음은 docker-compose.yml 파일의 예입니다.
version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"
networks:
- app-network
api:
image: my-api-image:latest
networks:
- app-network
environment:
- DB_HOST=db
db:
image: postgres:latest
environment:
POSTGRES_DB: mydatabase
POSTGRES_USER: user
POSTGRES_PASSWORD: password
networks:
- app-network
networks:
app-network:
driver: bridge
이 예시에서:
- 최상위
networks섹션을 정의했습니다. app-network는 사용자 지정 브리지 네트워크로 정의됩니다. Docker Compose는 이 네트워크가 존재하지 않으면 생성합니다.web,api,db서비스는 각 서비스 아래의networks키를 사용하여 모두app-network에 명시적으로 연결됩니다.
서비스 통신 방식
docker-compose up -d를 실행하면 Docker Compose는 app-network를 생성하고 컨테이너를 이 네트워크에 연결하여 시작합니다. 중요한 점은 Docker Compose가 이 네트워크 내에서 DNS 확인을 자동으로 구성한다는 것입니다. 이는 다음을 의미합니다.
web서비스는 호스트 이름db를 사용하여db서비스에 도달할 수 있습니다.api서비스는 호스트 이름db를 사용하여db서비스에 도달할 수 있습니다.web서비스는 호스트 이름api를 사용하여api서비스에 도달할 수 있습니다.
이러한 이름 기반 통신은 IP 주소에 의존하는 것보다 훨씬 더 강력하고 가독성이 높습니다.
네트워크 구성 사용자 지정
Docker Compose는 서브넷 및 게이트웨이 정의와 같이 네트워크를 추가로 사용자 지정할 수 있도록 허용합니다.
version: '3.8'
services:
# ... services ...
networks:
app-network:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
gateway: 172.28.0.1
이를 통해 네트워크에서 사용하는 IP 주소 공간에 대한 명시적인 제어를 제공합니다.
사용자 지정 네트워크를 위한 모범 사례
- 애플리케이션당 하나의 네트워크: 대부분의 애플리케이션의 경우 Docker Compose에서 단일 전용 사용자 지정 네트워크를 정의하면 관리 및 통신이 단순화됩니다.
- 설명적인 네트워크 이름 사용: 네트워크의 목적을 명확하게 나타내는 이름(예:
my-app-net,backend-services)을 선택하십시오. - 필요한 서비스만 연결: 통신이 필요한 서비스는 동일한 네트워크에 있어야 합니다. 상호 작용할 필요가 없는 모든 서비스를 단일 네트워크에 연결하는 것은 피하십시오.
- Docker Compose 활용: 간단한 단일 컨테이너 설정을 넘어서는 모든 작업의 경우, Docker Compose는 사용자 지정 네트워크 및 관련 서비스 관리를 크게 용이하게 합니다.
- 프로덕션에서 기본 브리지 사용 금지: 더 나은 격리, 제어 및 DNS 확인을 위해 프로덕션 환경에서는 항상 사용자 지정 브리지 네트워크 또는 다른 네트워크 드라이버(
Swarm/Kubernetes용 overlay등)를 사용하십시오.
결론
복잡하고 상호 연결된 컨테이너화된 애플리케이션을 구축하려면 사용자 지정 Docker 네트워크를 마스터하는 것이 필수적입니다. Docker CLI를 사용하거나, 더 실용적으로 Docker Compose를 사용하여 사용자 지정 브리지 네트워크를 활용하면 강력한 DNS 기반 서비스 검색을 활성화하고 네트워크 격리를 강화할 수 있습니다. 이는 더 유지보수 가능하고, 확장 가능하며, 안전한 컨테이너 배포로 이어집니다. 사용자 지정 네트워크를 활용하여 멀티 서비스 애플리케이션을 위한 Docker의 모든 잠재력을 최대한 발휘하십시오.