JUST WRITE

Docker 제품 만들기(6) - docker-compose 구성 본문

MLOps/Docker

Docker 제품 만들기(6) - docker-compose 구성

천재보단범재 2021. 10. 11. 19:47
2020년에 다니고 있는 회사 내부 프로젝트에서 기술적인 부분만 발췌해서 정리한 글입니다.

docker-compse 구성

Docker Compose

Compose는 다수의 Container를 정의하고 실행시킬 수 있는 Tool이다.

YAML 파일을 통해 한 번의 command로 다수의 Container를 실행할 수 있다.Compose command로 아래 사항을 Manage 할 수 있다.

  • Container 시작, 중지, Rebuild
  • 실행 중인 Container 상태
  • 실행 중인 Container Log
  • Container에 명령 수행

Docker Compose의 자세한 사항은 따로 정리하겠다.

제품 Docker Compose 구성

docker-compose Container 실행 순서

docker-compose.yml

version: '3.2'
   
services:
  repo:
    image: postgres:10.12
    container_name: repo
    command: ["postgres", "-c", "max_connections=150", "-c", "work_mem=32MB", "-c", "temp_buffers=16MB"]
    restart: on-failure
    volumes:
      - ${PRODCUT_PATH}/ardb:/var/lib/postgresql/data
    env_file:
      - .env
    environment:
      - POSTGRES_DB=${REPO_DB:-swjeong}
      - POSTGRES_USER=${REPO_USER:-swjeong}
      - POSTGRES_PASSWORD=${REPO_PW:-swjeong}
      - POSTGRES_INITDB_ARGS="--encoding=UTF-8"
      - LANG=C
      - TZ=Asia/Seoul
    ports:
      - "${REPO_PORT:-5432}:5432"
    networks:
      - product-net
     
  repo_setup:
    image: nexus.docker.repo:5556/product/repo_setup:1.0.0
    container_name: repo_setup
    depends_on:
      - repo
    env_file:
      - .env
    networks:
      - product-net
    command:
      bash -c "while ! nc -z database 5432; do sleep 1; done && ./ProudctSetup.sh -i database -p 5432 -d ${REPO_DB:-swjeong} -u ${REPO_USER:-swjeong} -pw ${REPO_PW:-swjeong}"
    links:
      - repo:database
   
  product_was:
    image: nexus.docker.repo:5556/product/product_was:1.0.0
    container_name: product_was
    restart: on-failure
    env_file:
      - .env
    depends_on:
      - repo
      - repo_setup
    volumes:
      - ${PRODUCT_PATH}/dataware/webapps:/usr/local/tomcat/webapps
      - ${PRODUCT_PATH}/dataware/logs:/usr/local/tomcat/logs
    environment:
      - jdbc.url=jdbc:postgresql://database:5432/${REPO_DB:-swjeong}
      - jdbc.username=${REPO_USER:-swjeong}
      - jdbc.password=${REPO_PW:-swjeong}
    networks:
      - product-net
    ports:
      - "${HTTP_PORT:-8080}:8080"
      - "${HTTPS_PORT:-443}:443"
      - "${DAEMON_PORT:-5001}:5001"
    command:
        bash -c "while ping -c1 repo_setup &>/dev/null; do sleep 1; done && catalina.sh run"
    links:
      - repo:database
      - repo_setup:repo_setup
   
  daemon:
    image: nexus.docker.repo:5556/product/product_daemon:1.0.0
    container_name: product_daemon
    restart: on-failure
    network_mode: "service:product_was"
    env_file:
      - .env
    depends_on:
      - repo
      - repo_setup
    volumes:
      - ${PRODUCT_PATH}/product_daemon/logs:/opt/product/product_daemon/logs
    command:
        bash -c "while ping -c1 script &>/dev/null; do sleep 1; done && ./product_daemon_docker.sh database 5432 ${REPO_DB:-swjeong} ${REPO_USER:-swjeong} ${REPO_PW:-swjeong}"

networks:
  product-net:

 

제품 Repository Container

repo:
    image: postgres:10.12
    container_name: repo
    command: ["postgres", "-c", "max_connections=150", "-c", "work_mem=32MB", "-c", "temp_buffers=16MB"]
    restart: on-failure
    volumes:
      - ${PRODCUT_PATH}/ardb:/var/lib/postgresql/data
    env_file:
      - .env
    environment:
      - POSTGRES_DB=${REPO_DB:-swjeong}
      - POSTGRES_USER=${REPO_USER:-swjeong}
      - POSTGRES_PASSWORD=${REPO_PW:-swjeong}
      - POSTGRES_INITDB_ARGS="--encoding=UTF-8"
      - LANG=C
      - TZ=Asia/Seoul
    ports:
      - "${REPO_PORT:-5432}:5432"
    networks:
      - product-net
  • command: ["postgres", "-c", "max_connections=150", "-c", "work_mem=32MB", "-c", "temp_buffers=16MB"]
    • PostgreSQL 초기 Setting값 설정하도록 추가
  • restart: on-failure => 종료 시 failure code일 때 재시작
  • volumes => PostgreSQL 데이터 백업할 수 있도록 Host 쪽과 매핑
  • env_file => 환경변수 파일 path 설정
  • environment => PostgreSQL 관련 환경 변수 설정(database명, encoding, timezone...)
  • ports => PostgreSQL Port(5432)와 Host Port 매핑, 환경변수 REPO_PORT 정의안되어 있으면 5432로 매핑
  • networks => product-net이란 이름 지정

Repository 설치 Container

  repo_setup:
    image: nexus.docker.repo:5556/product/repo_setup:1.0.0
    container_name: repo_setup
    depends_on:
      - repo
    env_file:
      - .env
    networks:
      - product-net
    command:
      bash -c "while ! nc -z database 5432; do sleep 1; done && ./ProudctSetup.sh -i database -p 5432 -d ${REPO_DB:-swjeong} -u ${REPO_USER:-swjeong} -pw ${REPO_PW:-swjeong}"
    links:
      - repo:database
  • depends_on => 제품 Repository Container보다 뒤에 실행되도록 설정
  • command
    • command 지정해서 실행
    • while ! nc -z database 5432; do sleep 1; done => PostgreSQL이 완전히 실행되고 설치 Script 실행되도록 설정
  • links => 다른 Container와 alias로 연결되도록 설정, Repository Container에 database라는 alias설정

Web Application Container

  product_was:
    image: nexus.docker.repo:5556/product/product_was:1.0.0
    container_name: product_was
    restart: on-failure
    env_file:
      - .env
    depends_on:
      - repo
      - repo_setup
    volumes:
      - ${PRODUCT_PATH}/dataware/webapps:/usr/local/tomcat/webapps
      - ${PRODUCT_PATH}/dataware/logs:/usr/local/tomcat/logs
    environment:
      - jdbc.url=jdbc:postgresql://database:5432/${REPO_DB:-swjeong}
      - jdbc.username=${REPO_USER:-swjeong}
      - jdbc.password=${REPO_PW:-swjeong}
    networks:
      - product-net
    ports:
      - "${HTTP_PORT:-8080}:8080"
      - "${HTTPS_PORT:-443}:443"
      - "${DAEMON_PORT:-5001}:5001"
    command:
        bash -c "while ping -c1 repo_setup &>/dev/null; do sleep 1; done && catalina.sh run"
    links:
      - repo:database
      - repo_setup:repo_setup
  • depends_on => 제품 Repository Container, Repository 설치 Container 보다 뒤에 실행되도록 설정
  • ports
    • HTTP, HTTPS Port와 같은 Network로 묶일 Daemon Port를 Host 쪽과 매핑
    • 환경변수 정의 안되어 있으면 각 Default Port로 매핑
  • command
    • command 지정해서 실행
    • while ping -c1 repo_setup &>/devl/null; do sleep 1; done => Repository 설치 Container가 종료되면 WAS 실행

Daemon Product Container

  daemon:
    image: nexus.docker.repo:5556/product/product_daemon:1.0.0
    container_name: product_daemon
    restart: on-failure
    network_mode: "service:product_was"
    env_file:
      - .env
    depends_on:
      - repo
      - repo_setup
    volumes:
      - ${PRODUCT_PATH}/product_daemon/logs:/opt/product/product_daemon/logs
    command:
        bash -c "while ping -c1 script &>/dev/null; do sleep 1; done && ./product_daemon_docker.sh database 5432 ${REPO_DB:-swjeong} ${REPO_USER:-swjeong} ${REPO_PW:-swjeong}"
  • network_mode => Web Application Container와 같은 Network가 되도록 설정
  • command
    • command 지정해서 실행
    • while ping -c1 repo_setup &>/devl/null; do sleep 1; done => Repository 설치 Container가 종료되면 WAS 실행

.env

TZ=Asia/Seoul
 
REPO_DB=dataware
REPO_USER=dataware
REPO_PW=dataware
 
REPO_PORT=5432
HTTP_PORT=8080
HTTPS_PORT=443
DAEMON_PORT=5001
 
PRODUCT_PATH=/opt/product

정리

제품 Docker Compose를 구성하는 데 오랜 시간이 걸렸던 거 같습니다.Container 실행 순서, Network 및 환경변수 설정 등 고려해야 할 사항이 많았습니다.아직 완벽하게 구성한 것이 아니라서 지속적으로 공부하며 보완해야 될 거 같습니다.

 

다음 글에서는 docker-compose command에 대해서 간략하게 정리하겠습니다.

[참고사이트]

728x90
반응형
Comments