데브코스 TIL/Docker

Docker Compose

예니ㅣ 2023. 12. 21. 17:03

강의

Docker Compose

"Docker Compose"는 다수의 Container로 구성된 소프트웨어를 사용할 수 있도록 도와주는 기능 입니다.

개별 Container를 각각 관리하는 것보다 생산성이 높습니다.

다양한 버전 생성이 일반적입니다. (dev, test, prod)

# 일반적인 표현
docker-compose.yml
docker-compose.yaml

# 가능한 표현
docker compose.yml
docker compose.yaml

# 다양한 버전 존재할 때
docker-compose -f docker-compose.dev.yml

 

Docker Compose 명령

  • docker-compose build : build 키 지정된 경우
  • docker-compose pull : image 키 지정된 경우
  • docker-compose push : Docker Hub로 이미지 업로드
  • docker-compose up : build → create → start
    • docker-compose build
    • docker-compose create
    • docker-compose start
  • docker-compose down : stop → rm
    • docker-compose stop
    • docker-compose rm
  • docker-compose ls : 그룹별 확인
  • docker-compose ps : 실행 상황 확인
  • docker images : 개별 이미지 앞에 폴더 이름을 prefix로 붙여 확인
  • docker-compose images : 컨테이너에 의해 실행되고 있는 이미지만 확인
  • docker network ls

 

docker-compose .yml 작성

  • sevices : 프로그램 구성 서비스 지정
    • 각 서비스 별 Dockerfile 존재 필수
    • 각 서비스 별  포트번호, 환경변수, 디스크 볼륨 지정 필요
    • service name = host name
  • volumes : 앞서 사용된 Docker Volume 지정
  • networks : 앞서 사용된 Docker Network 지정
    • 별도 네트워크 구성

 


실습

Voting application

  • vote, result, worker Container 존재
git clone https://github.com/dockersamples/example-voting-app.git
# vote/app.py

def get_redis():
    if not hasattr(g, 'redis'):
        g.redis = Redis(host="redis", db=0, socket_timeout=5)
    return g.redis
// result/server.js

var pool = new Pool({
  connectionString: 'postgres://postgres:postgres@db/postgres'
});
/* worker/Program.cs */

var pgsql = OpenDbConnection("Server=dv;Username=postgres;Password=postgres;");
var redisConn = OpenRedisConnection("redis");

 

Network 기본 형태 구현

  • Docker Network 사용
  • Postgres 실행 구현 필요 → POSTGRES_USER 및 POSTGRES_PASSWORD를 환경 변수(enviroment) 처리
docker container rm -f $(docker container ls -aq)
docker image rm -f $(docker image ls -q)
# docker-compose.mac.yml

services:
  vote:
    build: ./vote
    # use python rather than gunicorn for local dev
    command: python app.py
    ports:
      - "5001:80"

  result:
    build: ./result
    # use nodemon rather than node for local dev
    entrypoint: nodemon server.js
    ports:
      - "5002:80"

  worker:
    build: ./worker

  redis:
    image: redis:alpine

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
docker-compose -f docker-compose.mac.yml build
docker-compose -f docker-compose.mac.yml pull
docker-compose -f docker-compose.mac.yml up
docker exec -it --user=postgres user_id sh
    psql
    	/dt
        SELECT * FROM votes;
        exit
docker-compose -f docker-compose.mac.yml down

 

최종 개선 구현

  • 다수의 Network 지정 : front-tier 및 back-tier
  • Volume 지정 : PostgresSQL을 db-data로 지정
  • 서비스 간의 실행 순서 지정 : depends_on 사용
  • 서비스 간의 실행 조건 지정 : condition 사용
  • 정상 실행 확인 : healthcheck 사용

 

# docker-compose.yml

services:
  vote:
    build: ./vote
    command: python app.py
    depends_on:
      redis:
        condition: service_healthy
    healthcheck: 
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 15s
      timeout: 5s
      retries: 3
      start_period: 10s
    volumes:
     - ./vote:/app
    ports:
      - "5000:80"
    networks:
      - front-tier
      - back-tier

  result:
    build: ./result
    entrypoint: nodemon server.js
    depends_on:
      db:
        condition: service_healthy 
    volumes:
      - ./result:/app
    ports:
      - "5001:80"
      - "5858:5858"
    networks:
      - front-tier
      - back-tier

  worker:
    build:
      context: ./worker
    depends_on:
      redis:
        condition: service_healthy 
      db:
        condition: service_healthy 
    networks:
      - back-tier

  redis:
    image: redis:alpine
    volumes:
      - "./healthchecks:/healthchecks"
    healthcheck:
      test: /healthchecks/redis.sh
      interval: "5s"
    networks:
      - back-tier

  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
    volumes:
      - "db-data:/var/lib/postgresql/data"
      - "./healthchecks:/healthchecks"
    healthcheck:
      test: /healthchecks/postgres.sh
      interval: "5s"
    networks:
      - back-tier

  seed:
    build: ./seed-data
    profiles: ["seed"]
    depends_on:
      vote:
        condition: service_healthy 
    networks:
      - front-tier
    restart: "no"

volumes:
  db-data:

networks:
  front-tier:
  back-tier:

'데브코스 TIL > Docker' 카테고리의 다른 글

Container Orchestration  (0) 2023.12.30
Docker: Airflow 실행  (1) 2023.12.21
Docker Network  (0) 2023.12.21
Docker Volume  (0) 2023.12.21
Docker 명령  (0) 2023.12.21