ballqs 님의 블로그
[Docker] Docker Compose 본문
Docker Compose 란?
여러 개의 Docker Container를 하나의 서비스로 정의하고 구성하며 관리할 수 있게 하는 것
Docker Compose를 사용하는 이유는?
편하게 설정하기 : 여러 컨테이너를 한 파일에 적어서 설정
자동으로 배포 : Docker Compose가 컨테이너들을 알아서 만들어 줌
의존성 관리 : 컨테이너들간 서로 의존관계가 있다면 관리 해줌
모니터링과 로깅 : 컨테이너의 현 상황을 모니터링하여 보여주며 로그까지 남김
확장성 : 여러 컨테이너를 하나의 그룹으로 관리
유연성 : 개발 환경,테스트 환경,실제 운영 환경에서도 같은 설정 파일을 쓰기 가능
보안 강화 : 네트워크를 분리하여 외부로부터 접근을 제한
유지보수 용이 : 설정 파일 하나로 컨테이너를 관리하기에 바꿀 일 있으면 파일 수정하면 된다.
Docker compose 파일 설명
version: '3'
services:
web:
image: nginx:latest
ports:
- 80:80
volumes:
- ./web:/usr/share/nginx/html
depends_on:
- api
links:
- api:api
api:
image: java:latest
volumes:
- ./api:/app
ports:
- 8080:8080
environment:
- REDIS_HOST=redis
- MYSQL_HOST=mysql
- MYSQL_USER=root
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=test
depends_on:
- mysql
- redis
links:
- mysql:mysql
- redis:redis
redis:
image: redis:latest
ports:
- 6379:6379
mysql:
image: mysql:latest
ports:
- 3306:3306
volumes:
- ./mysql:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=test
- MYSQL_USER=root
- MYSQL_PASSWORD=password
설명
- version: Docker Compose의 버전을 정의합니다.
- services: 네 개의 서비스를 정의합니다.
- web 서비스는 Nginx 이미지를 사용하며, 포트 80번을 호스트 머신에 노출합니다.
- api 서비스는 Java 이미지를 사용하며, 포트 8080번을 호스트 머신에 노출합니다.
- redis 서비스는 Redis 이미지를 사용하며, 포트 6379번을 호스트 머신에 노출합니다.
- mysql 서비스는 MySQL 이미지를 사용하며 포트 3306번을 호스트 머신에 노출합니다.
- volumes: web 서비스는 현재 디렉토리 내 web 디렉토리를 컨테이너에 연결합니다. api 서비스는 현재 디렉토리 내 api 디렉토리를 컨테이너에 연결합니다. mysql 서비스는 현재 디렉토리 내 mysql 디렉토리를 사용하여 MySQL 데이터를 영구적으로 저장하게 합니다.
- depends_on: 각 서비스 간의 의존성을 정의합니다. web 서비스는 api서비스에 의존합니다. api 서비스는 mysql과 redis 서비스에 의존합니다.
- links: 각 서비스 간의 링크를 정의합니다. web 서비스는 api서비스에 링크됩니다. api 서비스는 mysql과 redis 서비스에 링크됩니다.
Docker Compose CLI
- docker-compose [COMMAND] [SERVICES...]의 형태로 지정된 서비스(컨테이너)만 제어가 가능합니다. 예를 들어서 web, redis 중에 web만 기동하고 싶을 경우 docker-compose up -d web와 같이 실행합니다.`
- docker-compose up
- docker-compose up 실행시 다음의 순서로 진행합니다. 이미 생성된 경우 해당 단계를 건너뜁니다. (멱등성)
- 서비스를 띄울 네트워크 생성
- 필요한 볼륨 생성(혹은 이미 존재하는 볼륨과 연결)
- 필요한 이미지 풀(pull)
- 필요한 이미지 빌드(build)
- 서비스 실행 (depends_on 옵션 사용시 서비스 의존성 순서대로 실행)
- --build
- 이미 빌드가 되었더라도 강제로 빌드를 진행합니다.
- -d
- 백그라운드로 실행합니다.
- --force-recreate
- docker-compose.yml 파일의 변경점이 없더라도 강제로 컨테이너를 재생성합니다. 다시 말해서 컨테이너가 종료되었다가 다시 생성됩니다.
- docker-compose down
- 서비스를 멈추고 삭제합니다. 컨테이너와 네트워크를 삭제합니다.
- --volume
- 선언된 도커 볼륨도 삭제합니다.
- docker-compose stop, docker-compose start
- 서비스를 멈추거나, 멈춰 있는 서비스를 시작합니다.
- docker-compose ps
- 현재 환경에서 실행 중인 각 서비스의 상태를 표시합니다.
- docker-compose logs
컨테이너 로그를 확인합니다.
- -f
- tail -f와 유사하게 컨테이너 로그를 실시간으로 확인합니다. (follow)
- docker-compose exec
- 실행 중인 컨테이너에 해당 명령어를 실행합니다.
docker-compose exec django ./manage.py makemigrations
docker-compose exec db psql postgres postgres
- docker-compose run
- 특정 명령어를 일회성으로 실행하지만 컨테이너를 batch성 작업으로 사용하는 경우에 해당합니다. 이미 기동하고 있는 컨테이너에 명령어를 실행하고자 하면 docker-compose exec을 사용하는 반면에 docker-compose run을 사용할 경우 컨테이너를 기동시키고 특정 명령어를 실행이 완료된 후에 컨테이너를 종료합니다.
docker-compose exec web echo "hello world" # 이미 실행된 web 컨테이너에서 echo "hello world"를 실행
docker-compose run web echo "hello world" # web 컨테이너에서 echo "hello world"를 실행하고 컨테이너 종료
사용 예제
사용한 git 예제 : https://github.com/nbcdocker/spring-boot-sample
docker-compose.yaml 작성
version: "3"
services:
channel-api:
image: xxxx.dkr.ecr.ap-northeast-2.amazonaws.com/reaction-channel:${AWS_ENV_STAGE:-dev}-${TAG:-latest}
build:
context: .
dockerfile: dockerfile
args:
STAGE: ${STAGE:-develop}
ports:
- "8000:8000"
environment:
- NEW_RELIC_CONFIG_FILE=newrelic.ini
- NEW_RELIC_ENVIRONMENT=ecs-${STAGE:-develop}
logging:
driver: awslogs
options:
awslogs-stream-prefix: channel
awslogs-group: /ecs/reaction/${AWS_ENV_STAGE:-dev}/channel-api
awslogs-region: ap-northeast-2
reverseproxy:
image: xxxxx.dkr.ecr.ap-northeast-2.amazonaws.com/reverseproxy:prod-channel-latest
ports:
- "80:80"
- "81:81"
logging:
driver: awslogs
options:
awslogs-stream-prefix: reverseproxy
awslogs-group: /ecs/reaction/${AWS_ENV_STAGE:-dev}/reverseproxy
awslogs-region: ap-northeast-2
'코딩 공부 > Docker' 카테고리의 다른 글
[Docker] Docker Network (0) | 2024.09.27 |
---|---|
[Docker] 명령어 (0) | 2024.09.27 |
[Docker] Dockerfile 작성 (0) | 2024.09.27 |