컨테이너간 통신
컨테이너는 외부 애플리케이션 혹은 호스트 머신과는 자유롭게 통신할 수 있지만, 컨테이너 간에는 기본적으로 서로 통신할 수 없다. 컨테이너끼리 통신할 수 있도록 하기 위해서는 컨테이너 내부에 네트워크를 만든 후 통신할 컨테이너들이 같은 네트워크에 속해 있도록 해야 한다. 지금부터 이 방법을 알아보자.
Docker의 네트워크 드라이버 종류와 bridge 드라이버
Docker는 다양한 네트워크 드라이버를 지원한다. 대표적으로 bridge, host, none 드라이버가 있으며 이 외에도 overlay, macvlan 같은 드라이버가 있다. 하지만, 대부분의 경우는 bridge를 사용해 통신하며 이곳에서는 bridge 드라이버를 사용하는 방법에 대해 다룬다.
bridge 드라이버는 Docker의 기본 네트워크 드라이버로, 독립적인 컨테이너 간 통신을 가능하게 하며, 컨테이너를 동일한 bridge 네트워크에 연결하면 서로 통신할 수 있다.
컨테이너 간 통신 설정하기
네트워크 생성 및 확인
"docker network create [네트워크 이름]"을 통해 네트워크를 생성할 수 있다. 예를 들어 다음 명령어를 통해 app-network라는 이름의 네트워크를 만들 수 있다.
docker network create app-network
생성된 네트워크는 docker network ls 명령어를 통해 확인 가능하다.
컨테이너가 특정 네트워크에 속하도록 만들기
컨테이너가 특정 네트워크에 속하도록 만들려면 docker run 시 "--network [네트워크 이름]" 옵션을 주면 된다. 예를 들어 mongodb 이미지를 실행할 때 mongodb가 app-network에 속하도록 하려면 다음과 같이 작성해 실행하면 된다.
docker run --name mongodb -v mongodbdata:/data/db --rm -d --network app-network mongo
컨테이너 간 통신하기
같은 네트워크(app-network_에 속한 웹 애플리케이션 컨테이너에서 위에서 만든 mongodb 컨테이너에 연결한다고 하자. 그러면 위에서 --name 프로퍼티에 mongodb를 설정했으므로 호스트 이름을 넣는 부분에 mongodb 를 넣으면 된다.
mongodb://[유저이름]:[비밀번호]@[호스트 이름]:27017/[데이터 베이스 이름]
즉, 다음과 같은 모양이 된다.
mongodb://[유저이름]:[비밀번호]@mongodb:27017/[데이터 베이스 이름]
기존에는 로컬에서 통신하면 저 부분이 다음과 같은 모양이었다.
mongodb://[유저이름]:[비밀번호]@localhost:27017/[데이터 베이스 이름]
Spring Boot 애플리케이션에서는 spring.data.mongodb.host에 이미지 이름을 설정하면 된다.
spring.data.mongodb.host=mongodb
spring.data.mongodb.port=27017
spring.data.mongodb.database=[데이터 베이스 이름]
spring.data.mongodb.username=[유저 이름]
spring.data.mongodb.password=[비밀 번호]
이렇게 하면 통신이 성공한다.
Docker Compose 사용 시 컨테이너 간 통신
Docker Compose를 사용하면 같은 yml 파일 내부에 있는 컨테이너들 간에는 네트워크가 자동으로 생성된다. 따라서 별도로 네트워크를 설정해주지 않아도 된다.
version: '3.8'
services:
mongodb:
image: mongo:latest
container_name: mongodb
ports:
- "27017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: [유저 이름]
MONGO_INITDB_ROOT_PASSWORD: [비밀번호]
app:
image: my-spring-app:latest
depends_on:
- mongodb
environment:
SPRING_DATA_MONGODB_HOST: mongodb
SPRING_DATA_MONGODB_PORT: 27017
SPRING_DATA_MONGODB_DATABASE: [데이터베이스 이름]
SPRING_DATA_MONGODB_USERNAME: [유저 이름]
SPRING_DATA_MONGODB_PASSWORD: [비밀번호]
networks:
app-network:
driver: bridge
다만 yml 파일 외부의 컨테이너와 통신해야 하는 경우에는 network를 사용해 네트워크를 명시적으로 설정해주면 된다.
version: '3.8'
services:
mongodb:
image: mongo:latest
container_name: mongodb
ports:
- "27017:27017"
environment:
MONGO_INITDB_ROOT_USERNAME: [유저 이름]
MONGO_INITDB_ROOT_PASSWORD: [비밀번호]
networks:
- app-network
app:
image: my-spring-app:latest
depends_on:
- mongodb
environment:
SPRING_DATA_MONGODB_HOST: mongodb
SPRING_DATA_MONGODB_PORT: 27017
SPRING_DATA_MONGODB_DATABASE: [데이터베이스 이름]
SPRING_DATA_MONGODB_USERNAME: [유저 이름]
SPRING_DATA_MONGODB_PASSWORD: [비밀번호]
networks:
- app-network
networks:
app-network:
driver: bridge
'Docker' 카테고리의 다른 글
[Docker] Dockerfile내부, .env 파일 혹은 터미널을 사용해 환경 변수 설정하는 방법 한 번에 정리하기 (0) | 2025.01.30 |
---|---|
[Docker] .dockerignore 사용해 컨테이너에 복사되지 말아야 할 파일 정의하기 (0) | 2025.01.29 |
[Docker] Bind Mount 통해 호스트 머신의 경로를 컨테이너 경로와 연결하기 (0) | 2025.01.28 |
[Docker] Named Volume 이란 무엇인가? 사용 방법과 특징 정리 (0) | 2025.01.27 |
[Docker] Anonymous Volume(익명 볼륨) 한 번에 정리하기 (0) | 2025.01.26 |