일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- zookeeper
- Operating System
- tcp
- PostgreSQL
- Network
- EC2
- ip
- Spring
- docker
- helm
- Kafka
- CSV
- airflow
- aws s3
- OS
- Trino
- AWS
- Vision
- jvm
- kubectl
- Packet
- log
- CVAT
- MAC address
- Python
- grafana
- JavaScript
- kubernetes
- kubeadm
- java
Archives
- Today
- Total
JUST WRITE
Docker 제품 만들기(6) - docker-compose 구성 본문
2020년에 다니고 있는 회사 내부 프로젝트에서 기술적인 부분만 발췌해서 정리한 글입니다.
Docker Compose
Compose는 다수의 Container를 정의하고 실행시킬 수 있는 Tool이다.
YAML 파일을 통해 한 번의 command로 다수의 Container를 실행할 수 있다.Compose command로 아래 사항을 Manage 할 수 있다.
- Container 시작, 중지, Rebuild
- 실행 중인 Container 상태
- 실행 중인 Container Log
- Container에 명령 수행
Docker Compose의 자세한 사항은 따로 정리하겠다.
제품 Docker Compose 구성
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
반응형
'MLOps > Docker' 카테고리의 다른 글
Docker 제품 만들기(5) - Container 운영 (0) | 2021.10.04 |
---|---|
Docker 제품 만들기(4) - Image 배포 (0) | 2021.10.03 |
Docker 제품 만들기(3) - Image 빌드 개선 (0) | 2021.10.02 |
Docker버전 제품 만들기(2) - 자동 배포 (0) | 2021.09.25 |
Docker버전 제품 만들기(1) - image 만들기 (0) | 2021.09.25 |
Comments