Docker compose로 서버 띄우기

DockerCompose

docker compose 사용하면 컨테이너간의 의존성을 파일 하나로 관리하면서 실행시킬 수 있다. 이번시간에는 개발 환경을 직접 docker-compose 로 build 해 보도록 한다.
사용하는 이미지는 mysql 과 node 환경을 이용하고 서버 프레임 워크로는 Express 를 사용한다.

docker-compose.dev.yml

먼저 docker-compose 파일을 생성해준다. 개발 환경임을 명시하기 위해서 dev.yml 파일로 생성한다. docker-compose 파일을 사용하지 않고도 run 명령어로 실행시킬 수 있지만 compose 파일을 사용하면 하나의 파일로 의존성을 관리할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
version: '3.8'

services:
mysqldb:
image: mysql
ports:
- 3306:3306
command: # 명령어 실행
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- mysql:/var/lib/mysql
- mysql_config:/etc/mysql
environment:
- MYSQL_ROOT_PASSWORD=1q2w3e
- MYSQL_DATABASE=test

notes:
depends_on:
- mysqldb
build:
context: .
working_dir:
/app
ports:
- 443:8080
- 9229:9229
environment:
- SERVER_PORT=8080
- DB_PORT=3306
- MYSQL_DATABASE=test
- USER=root
- MYSQL_ROOT_PASSWORD=1q2w3e
- HOST=mysqldb
- CHOKIDAR_USEPOLLING=true
volumes:
- ./:/app
command:
- bash
- -c
- |
/app/wait-for-it.sh mysqldb:3306 -t 10
yarn run nodemon-dev

volumes:
mysql:
mysql_config:
  • mysqldb로 서비스를 만들었고, notes 서비스에서 HOST를 mysqldb로 환경 변수를 전달하고 있는데 DNS를 지원하기 때문에 compose 된 환경 안에서 이름 그대로 접근할 수 있다.
  • notes 에서 build로 context로 현제 폴더를 지정해 주었는데 이렇게 하면 현제 폴더에서 Dockerfile를 참조해서 build를 실행한다. 명시적으로 파일을 지정해 줄 수 도 있다.
  • depends_on 을 통해서 의존성을 명시한다. 해당 서버에서 mysql 에 test table을 조회하는데 test table이 만들어지 않은 상태에서 접근하려고 하면 에러가 발생한다. 의존성을 명시해서 먼저 mysqldb 에 build 가 실행된 이후에 notes 에 build 가 실행되도록 한다.
  • 다만, depends_op은 실행 순서는 보장해 주지만 준비 상태까지는 보장해 주지 않는다. 따라서 wait-for-it.sh 스크립트를 사용했는데 조금 서치해보면 어떻게 설치하는지 알 수 있다. 그냥 사용하면 권한 거부 에러가 발생하기 대문에 wait-for-it.sh 의 실행 권한을 설정하고 build 해야 한다.
  • dockerfile로 개발환경을 설정할때에는 현제 로컬에 수정사항을 반영하기 위해서 $(pwd) 같은 것을 사용했었는데 docker-compose 파일을 사용하면 상대 경로를 통해서 수정사항을 반영할 수 있도록 하는게 가능하다.