이번에는 Docker Compose 파일을 작성해보고,
예시로 db container를 만들어 띄워보겠습니다.
Docker Compose 란?
Docker Compose란 여러 개의 컨테이너들을 관리, 실행하기 위한 "툴"로, 각각 독립된 컨테이너의 실행을 정의합니다.
도커 컨테이너로 시스템을 구축하면 하나 이상의 컨테이너가 서로 통신하며, 그 사이에 의존관계가 생기게 됩니다. 이런 방식으로 시스템을 구축하다보면 단일 컨테이너를 다룰 때는 문제가 되지 않던 부분에도 주의가 필요하게 됩니다. 이때 필요한 것이 Docker Compose 입니다.
쉽게말하자면, 하나의 시스템은 여러 어플리케이션이 서로 의존성 있게 구성되어 이루어져 있습니다.
그래서 하나의 컨테이너가 하나의 어플리케이션을 담당하기 때문에 여러 개의 컨테이너가 필요합니다.
그래서 Docker Compose가 필요하며, 이는 yaml 포맷으로 작성되고, 여러 컨테이너들을 한 번에 관리를 할 수 있게 도와주는 역할을 합니다.
Docker Compose 작성하기
- docker-compose.yml로 작성하여, 실행할 수 있습니다.
- 프로젝트 루트에 파일을 만들고, 실행 설정을 적어둡니다. 그래야 터미널에서 도커 명령어를 사용하여 컨테이너를 실행하거나 죽일 수 있습니다.
(yaml 문법이나, docker-compose에서 사용하는 문법에 대해서는 주석 또는 제가 필요한 부분만 정리하겠습니다. 세세하게는 굳이 정리하지 않겠습니다.)
먼저 제가 연습삼아 작성한 docker-compose.yml입니다.
처음 연습에서는 한 개의 컨테이너만 띄워보겠습니다.
version: "3" # 버전 지정
services: # 컨테이너 설정
db:
images: mysql:5.7 # 컨테이너에서 사용하는 base image 지정
restart: always # 컨테이너 다운 시 재시작하라는 명령어
volumes: # -v 옵션과 동일
- ./mysqldata:/var/lib/mysql
environment: # 컨테이너 안의 환경변수 설정
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=mydb
ports: # -p 옵션과 동일
- "3306:3306"
다음은 docker-compose up 명령어를 통해 컨테이너를 생성 및 실행해보도록 하겠습니다.
저는 백그라운드에서 실행할것이기 때문에, -d 옵션을 추가로 붙여보겠습니다.
docker-compose up -d
생성된 이미지와 컨테이너를 모두 확인해보면 다음과 같습니다.
잘 확인했구요!
다음번에는 docker-compose.yml 에 여러 개의 컨테이너를 정의하여 동시에 여러 컨테이너를 생성하고 실행해보도록 하겠습니다.
이 전에, 제가 현재 진행하고있는 프로젝트에서도 도커를 이용하여 배포를 했는데요,
그 프로젝트의 도커 컴포즈 파일도 함께 봐보겠습니다 ㅎㅎ
저희는 로컬 테스트용인 docker-compose.yml 그리고 배포용인 docker-compose.prod.yml이 있는데요,
배포용인 docker-compose.prod.yml 파일을 보면 다음과 같습니다.
version: '3'
services:
web: # 컨테이너1 : web
container_name: web
build:
context: ./
dockerfile: Dockerfile.prod
command: gunicorn myplanit.wsgi:application --bind 0.0.0.0:8000
environment:
DJANGO_SETTINGS_MODULE: myplanit.settings.prod
env_file:
- .env
volumes:
- static:/home/app/web/static
- media:/home/app/web/media
expose:
- 8000
entrypoint:
- sh
- config/docker/entrypoint.prod.sh
nginx: # 컨테이너2 : nginx
container_name: nginx
build: ./config/nginx
volumes:
- static:/home/app/web/static
- media:/home/app/web/media
ports:
- "80:80"
depends_on:
- web # 웹 컨테이너로 연결
volumes:
static:
media:
그리고 이를 저희 서버에서 확인해보면 web 컨테이너 그리고 nginx 컨테이너 두 개가 있는 것을 확인할 수 있습니다.
[참고]
고마워요
images: mysql:5.7 # 컨테이너에서 사용하는 base image 지정
images는 오타인듯 해요