Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[week3 tmi] The way ensure the order of container execution #32

Open
jang-namu opened this issue Oct 9, 2023 · 0 comments
Open

[week3 tmi] The way ensure the order of container execution #32

jang-namu opened this issue Oct 9, 2023 · 0 comments
Labels
documentation Improvements or additions to documentation

Comments

@jang-namu
Copy link
Contributor

docker-compose.yaml

Docker Compose는 기본적으로 docker-compose.yaml 파일을 통해 여러 개의 컨테이너를 관리/배포한다.

docker-compose.yaml은 Docker Compose를 통해 명령하기 위한 구성파일이다.

tutorial에서 제공하는 yaml 파일을 사용한다.

version: '3.9'

services:
  db:
    image: mysql:5.7
    platform: linux/amd64
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress

  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - '8000:80'
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}

두 개의 서비스를 확인할 수 있다.

  1. db
  2. wordpress

각각은 mysql 5.7 버전과 worldpress의 최신 릴리즈 버전의 이미지를 가져와 사용한다.
데이터베이스의 상태(데이터)를 저장할 수 있도록 볼륨을 생성하고 환경변수를 통해 비밀번호, 사용자 이름 등을 정의한다.
그리고 wordpress 서비스는 db라는 앞서 정의한 mysql 컨테이너에 의존하고 있다.

depends_on 옵션과 컨테이너 실행 순서

docker-compose에서 depends_on을 통해 서비스의 시작과 종료 순서를 제어할 수 있다.
depends_on은 특정 컨테이너에 대한 의존 관계를 나타내며, 이 항목에 명시된 컨테이너가 먼저 생성되고 실행되도록 한다.
(반대로 컨테이너가 제거될때는 의존하는 컨테이너가 먼저, 의존되는 컨테이너가 그 후에 제거된다)

주의해야할 점은 실행 순서만 제어할 뿐, 컨테이너 내부의 어플리케이션이 준비된 상태인지에 대해 확인하지 않는다.
(여담으로 links, volumes_from, network_mode: "service:..." 또한 같은 류의 종속성을 설정한다.)

DB 컨테이너와 웹서버 컨테이너가 순서대로 실행된다고 해도, DB가 초기화 중이라면 웹서버가 정상 작동하지 못한다.
이와같은 문제를 해결하기 위한 방법으로 depends_on에 condition을 통해 healthcheck를 하는 방법과 wait-for-it, dockerize 등 패키지를 사용하는 방법이 존재한다.

depends_on에 몇가지 구성들을 추가할 수 있다.

  • restart: true로 설정하면 의존성 서비스가 업데이트 된 이후 Compose가 이 서비스를 재시작한다.
    • 주의할 점은 의존성 업데이트와 같은 Compose 작업에 한하여 적용된다. 컨테이너가 종료된 후 자동 다시시작과는 다르다.
  • condition: depends_on, 즉 의존성이 충족된 것으로 판단하는 기준을 설정
    • service_started: 컨테이너 실행(디폴트)
    • service_healthy: 의존 서비스를 시작하기 전에 의존성이 정상(healthchek를 통해)일 것으로 예상되어야 함.
    • service_completed_successfully: 의존 서비스를 시작하기 전에 의존성이 성공적으로 완료될 때까지 기다려야함.
  • required: false로 설정하면 의존성 서비스가 시작되지 않거나 사용불가할 때 경고만 제공한다.

healthcheck
서비스 컨테이너의 정상 여부를 확인한다. Dockerfile과 동일한 방식으로 작동하며, Compose 파일이 Dockerfile에 설정된 값을 재정의하게 된다.

# test: 컨테이너 상태확인을 위해 Compose가 실행하는 명령
# 문자열이거나 목록일 수 있으며, 목록인 경우 첫번째 항목은 NONE 또는 CMD, CMD-SHELL이어야 함.
# string은 목록에서 CMD-SHELL을 쓰는것과 같다.
healthcheck:
   test: ["CMD", "curl", "-f", "http://localhost"]
   interval: 1m30s
   timeout: 10s
   retries: 3
   start_period: 40s
   start_interval: 5s
test: ["CMD-SHELL", "curl -f http://localhost || exit 1"]
위 아래 두 문장은 같다.
test: curl -f https://localhost || exit 1

최종적으로 작성되는 docker-compose 파일은 다음과 같다.

version: '3.8'
services:
 applicaion-service:
   image: your-applicaion-service:0.0.1
   depends_on:
     cassandra-init-keyspace:
       condition: service_completed_successfully


 cassandra:
   image: cassandra:4.0.1
   ports:
     - "9042:9042"
   healthcheck:
     test: ["CMD", "cqlsh", "-u cassandra", "-p cassandra" ,"-e describe keyspaces"]
     interval: 15s
     timeout: 10s
     retries: 10

 cassandra-init-keyspace:
   image: cassandra:4.0.1
   depends_on:
     cassandra:
       condition: service_healthy
   volumes:
     - ./src/main/resources/cassandra/init.cql:/init.cql
   command: /bin/bash -c "echo loading cassandra keyspace && cqlsh cassandra -f /init.cql"

docker docs: depends_on
docker docs: healthcheck
how to start service only when other service had comleted?

wait-for-it는 쉘 스크립트로 작성되어 있어 설치와 적용이 간단하다.
wait-for-it
dockerize는 비교적 복잡하지만, 순차적 서비스 실행 이외에도 환경변수 설정, 로그 파일 위치 지정 등 다양한 기능을 제공한다.
dockerize

@jang-namu jang-namu added the documentation Improvements or additions to documentation label Oct 9, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
documentation Improvements or additions to documentation
Projects
None yet
Development

No branches or pull requests

1 participant