도커 컴포즈에는 애플리케이션을 좀 더 신뢰성 있게 실행하는 데 유용한 기능이 몇 가지 있다. 이번 연습 문제는 to-do 애플리케이션을 테스트 환경에서 다음과 같이 좀 더 신뢰성 있게 실행하는 컴포즈 파일 정의를 작성하는 것이다
- 호스트 컴퓨터가 재부팅되거나 도커 엔진이 재시작되면 애플리케이션 컨테이너도 재시작되도록 하라.
- 데이터베이스 컨테이너는 바인드 마운트에 파일을 저장해 애플리케이션을 재시작하더라도 데이터를 유지할 수 있도록 하라
- 테스트를 위해 웹 애플리케이션은 80번 포트를 주시하도록 하라.
이번 연습 문제의 힌트는 다음과 같다. * 도커 참조 문서 중 도커 컴포즈 파일의 상세 규격을 https://docs.docker.com/compose/compose-file 에서 볼 수 있다. 컴포즈 파일에 정의할 수 있는 모든 설정이 이 문서에 정의돼 있다.
이 연습 문제 역시 내가 작성한 해답을 참고할 수 있다. 가급적이면 직접 해결하는 것이 좋겠지만, 꼭 필요하다면 이 책의 깃허브 저장소 ch07/lab/ 폴더를 참고하라.
mine
- 호스트 컴퓨터가 재부팅되거나 도커 엔진이 재시작되면 애플리케이션 컨테이너도 재시작되도록 하라.
restart: always
- 데이터베이스 컨테이너는 바인드 마운트에 파일을 저장해 애플리케이션을 재시작하더라도 데이터를 유지할 수 있도록 하라
todo-db:
# ...
volumes:
- type: bind
- source: /data
- target: /data
- 테스트를 위해 웹 애플리케이션은 80번 포트를 주시하도록 하라.
todo-web:
# ...
ports:
- "80:80"
전체
version: "3.7"
services:
todo-db:
image: diamol/postgres:11.5
ports:
- "5433:5432"
networks:
- app-net
restart: always
volumes:
- type: bind
- source: /data
- target: /data
todo-web:
image: diamol/ch06-todo-list
ports:
- "80:80"
environment:
- Database:Provider=Postgres
depends_on:
- todo-db
networks:
- app-net
secrets:
- source: postgres-connection
target: /app/config/secrets.json
restart: always
networks:
app-net:
secrets:
postgres-connection:
file: ./config/secrets.json
정답
Dev environment
참고
* 아래 명령어로 실행
* -f
로 도커 컴포즈 파일명 지정
docker-compose -f docker-compose-dev.yml up -d
# docker-compose-dev.yml
# This is the app definition for running in dev.
# It uses a Sqlit database inside the web app container.
version: "3.7"
services:
todo-web:
image: diamol/ch06-todo-list
ports:
- "8020:80"
environment:
- Database:Provider=Sqlite
networks:
- app-net
networks:
app-net:
external:
name: nat
Test environment
참고
* 아래 명령어로 실행
* -p
옵션을 사용할 경우 존재하지 않는 중간의 디렉토리를 자동을 생성해 준다.
mkdir -p /data/postgres
docker-compose -f docker-compose-test.yml up -d
# docker-compose-test.yml
# This is the app definition for running in test.
# It runs a Postgres container and sets the web app to use Postgres.
# It also sets the containers to restart, and uses a bind mount for the database files.
version: "3.7"
services:
todo-db:
image: diamol/postgres:11.5
restart: unless-stopped
environment:
- PGDATA=/var/lib/postgresql/data
volumes:
- type: bind
source: /data/postgres
target: /var/lib/postgresql/data
networks:
- app-net
todo-web:
image: diamol/ch06-todo-list
restart: unless-stopped
ports:
- "8050:80"
environment:
- Database:Provider=Postgres
depends_on:
- todo-db
secrets:
- source: postgres-connection
target: /app/config/secrets.json
secrets:
postgres-connection:
file: postgres-connection.json
networks:
app-net:
external:
name: nat