docker-compose.yml 파일을 이용해서,
backend 서버 컨테이너와 db 컨테이너를 연결하는 방법에 대해 정리해 보고자 합니다.
컨테이너 간 통신 방법 - bridge 설정
Docker 컨테이너 간 통신을 하기 위해서 각 컨테이너들은 하나의 network에 있어야 합니다.
기존에는 links를 이용해서 연결이 가능했지만, networks의 도입으로 곧 deprecated 되므로 networks를 사용합시다.
(links will be deprecated)
networks는 docker-compose 파일을 이용해 설정이 가능한데 그 방법은 아래와 같습니다.
version: '3.8'
services:
frontend:
container_name: habits_frontend
# ...
networks:
- my_network
backend:
container_name: habits_backend
# ...
networks:
- my_network
depends_on:
- mysqldb
mysqldb:
image: mysql:8.1.0
container_name: mysqldb
restart: always
build:
context: ./db
dockerfile: Dockerfile
volumes:
- mysql-data:/var/lib/mysql
ports:
- 3307:3306
env_file:
- ./db/.env
networks:
- my_network
volumes:
mysql-data:
networks:
my_network:
driver: bridge
User-defined bridge 설정
가장 하단에 networks에 my_network를 만들고 bridge network 드라이버를 사용한다고 선언해 줍니다.
Docker's User-defined bridge를 사용하는 이유
아시는 분들은 아시겠지만, docker network 드라이버의 default 값은 bridge 입니다. (docker network drivers)
그런데 우리는 왜 default-bridge가 아니라 따로 network를 bridge라고 굳이 명시해주면서
user-defined bridge(커스텀 브릿지)를 사용하는 걸까요? 그 이유는 아래와 같습니다.
1. 커스텀 브릿지는 컨테이너간의 DNS를 자동으로 제공해 줍니다.
- 만약 커스텀 브릿지를 사용하지 않고, --links 옵션을 사용하지 않으면 우리는 직접 IP를 입력해줘야 합니다.
2. networks 옵션을 명시하지 않은 서비스는 기본적으로 default 옵션에 포함되는데 이는 위험 할 수 있습니다.
3. 기타 장점은 공식 홈페이지를 참조 부탁드립니다.
각각의 서비스에서 networks에 my_network라는 커스텀 network를 명시함으로써 각각의 컨테이너들은 우리가 정의한 my_network라는 하나의 커스텀 브릿지 네트워크안에 있게 됩니다. 그리고 각각의 컨테이너에서 컨테이너 이름으로 연결이 가능하게 됩니다.(자동으로 DNS가 제공되기 때문)
정말 그런지 확인해 볼까요?
backend 컨테이너에서 mysqldb 서비스 컨테이너로 ping을 보내봤습니다.
따로 hosts파일을 건들거나 mysqldb라는 이름으로 DNS에 등록하지 않았음에도 정상적으로 핑이 보내지는 것을 확인 하실 수 있습니다.
depends_on - 컨테이너 실행 순서 설정
데이터베이스 컨테이너는 서비스 컨테이너보다 먼저 떠 있을 필요가 있습니다. 이럴 때 사용할 수 있는 옵션이 depends_on 입니다.
backend 서비스에 depends_on: mysqldb 옵션을 주게 되면, 데이터베이스 컨테이너를 항상 backend 컨테이너 전에 실행 하게 됩니다.
'Docker' 카테고리의 다른 글
[Docker] 컨테이너 빌드 시 prisma migrate하기 (0) | 2023.10.11 |
---|---|
Docker로 Mysql 컨테이너 띄우고 접속 (0) | 2023.09.12 |
[Solved] docker container에서 local db 접속하기 (host.docker.internal) (1) | 2022.10.29 |
[Docker] Docker 설치하기 (특정 버전 docker 설치) (1) | 2022.10.07 |
[Docker - 3] Dockerfile 작성법 (with example) (1) | 2022.09.24 |