7.6.연습 문제

도커 컴포즈에는 애플리케이션을 좀 더 신뢰성 있게 실행하는 데 유용한 기능이 몇 가지 있다. 이번 연습 문제는 to-do 애플리케이션을 테스트 환경에서 다음과 같이 좀 더 신뢰성 있게 실행하는 컴포즈 파일 정의를 작성하는 것이다

  • 호스트 컴퓨터가 재부팅되거나 도커 엔진이 재시작되면 애플리케이션 컨테이너도 재시작되도록 하라.
  • 데이터베이스 컨테이너는 바인드 마운트에 파일을 저장해 애플리케이션을 재시작하더라도 데이터를 유지할 수 있도록 하라
  • 테스트를 위해 웹 애플리케이션은 80번 포트를 주시하도록 하라.

이번 연습 문제의 힌트는 다음과 같다. * 도커 참조 문서 중 도커 컴포즈 파일의 상세 규격을 https://docs.docker.com/compose/compose-file 에서 볼 수 있다. 컴포즈 파일에 정의할 수 있는 모든 설정이 이 문서에 정의돼 있다.

이 연습 문제 역시 내가 작성한 해답을 참고할 수 있다. 가급적이면 직접 해결하는 것이 좋겠지만, 꼭 필요하다면 이 책의 깃허브 저장소 ch07/lab/ 폴더를 참고하라.


mine

  1. 호스트 컴퓨터가 재부팅되거나 도커 엔진이 재시작되면 애플리케이션 컨테이너도 재시작되도록 하라.
restart: always 
  1. 데이터베이스 컨테이너는 바인드 마운트에 파일을 저장해 애플리케이션을 재시작하더라도 데이터를 유지할 수 있도록 하라
  todo-db:
    # ...
    volumes:
      - type: bind
      - source: /data
      - target: /data
  1. 테스트를 위해 웹 애플리케이션은 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

links

social