강의
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 |