docker compose 란
도커 컴포즈는 컨테이너 여럿을 띄우는 도커 애플리케이션을 정의하고 실행하는 도구(Tool for defining and running multi-container Docker applications) 이다.
컨테이너 실행에 필요한 옵션을 docker-compose.yml이라는 파일에 적어둘 수 있고, 컨테이너 간 의존성도 관리할 수 있어서 좋다.
도커와 도커 컴포즈를 비교하면 다음과 같다.
- Dockerfile vs. Dockerfile-dev: 서버 구성을 문서화한 것(=클래스 선언이 들어 있는 파일)
- docker build vs. docker-compose build: 도커 이미지 만들기(=클래스 선언을 애플리케이션에 로드)
- docker run의 옵션들 vs. docker-compose.yml: 이미지에 붙이는 장식들(=인스턴스의 변수들)
- docker run vs. docker-compose up: 장식 붙은 이미지를 실제로 실행(=인스턴스 생성)
간단히 말해 docker run 으로 실행하면 매번 복잡한 옵션 및 명령어들을 여러개 적어두고 실행해야 하는데,
docker-compose 는 docker-compose.yml 에 사용하고자 하는 도커이미지 및 옵션 값들을 작성해 놓고 docker-compse up 이라는 명령어로 일관적으로 실행할 수 있다.
하나씩 실행해야 하는 수고로움이 덜어진다.
설치
docker-compose version 을 치고 조회가 되면 설치할 필요가 없다.
없다면 설치하면 된다.
docker-compose 설치는 매우매우 쉽다. 아래를 따라하면 된다.
출처는 https://docs.docker.com/compose/install/
윈도우는
curl -L https://github.com/docker/compose/releases/download/1.6.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
docker-compose 속성
version
version: '2.1'
docker run에서는 없었던 부분입니다. docker-compose.yml 파일의 제일 윗부분에는 파일 규격 버전을 적는다. 파일의 규격에 따라 지원하는 옵션이 달라지며, 최근에 "3.1"이 등장하긴 했지만 보통은 "2"나 "2.1"을 사용해도 충분.
services
services:
이 항목 밑에 실행하려는 서비스들을 정의한다. 서비스란, 앱 컨테이너나 postgres 컨테이너 각각의 묶음이다.
services 하위
서비스의 이름
image
image: postgres:9.6.1
db 서비스에서 사용할 도커 이미지를 적는다.
volumes
volumes: - ./docker/data:/var/lib/postgresql/data
docker run으로 앱 컨테이너를 실행할 때 --volume 옵션을 사용하여 데이터베이스의 데이터를 로컬 컴퓨터에 저장했던 부분과 같다.
다만 docker-compose.yml의 volumes에는 상대 경로를 지정할 수 있다는 점이 다르다.
environment
environment: - POSTGRES_DB=sampledb - POSTGRES_USER=sampleuser - POSTGRES_PASSWORD=samplesecret - POSTGRES_INITDB_ARGS=--encoding=UTF-8
docker run에서 -e 옵션에 적는 내용이다. 마지막의 POSTGRES_INITDB_ARGS 부분이 추가되었는데, 데이터베이스 서버의 인코딩을 설정하기 위함이다.
healthcheck
healthcheck: test: "pg_isready -h localhost -p 5432 -q -U postgres" interval: 3s timeout: 1s retries: 10
postgres 서비스가 제대로 실행될 뿐만 아니라 데이터베이스에 접근할 수 있는지도 파악을 해야 합니다.
healthcheck는 바로 이것을 제어할 수 있습니다. 검사에 사용할 명령(test)을 3초 간격(interval)으로 열 번 시도(retries)하며, 각 시도에서 타임아웃은 1초(timeout)로 지정하였다.
여기서 사용한 pg_isready 명령은 데이터베이스 서버에 접근할 수 있는지를 파악.
service 하위
앱 서비스의 이름으로 지정자 마음대로 지으면 된다.
build
build: context: . dockerfile: ./compose/django/Dockerfile-dev
db 서비스와 달리 앱 서비스는 도커 이미지를 빌드할 일이 잦기 때문에, 특정 이미지 대신 build 옵션을 추가한다.
context는 docker build 명령을 실행할 디렉터리 경로라고 보면 된다.
dockerfile은 도커 이미지를 빌드하는 데 사용할 Dockerfile을 지정하면 된다.
environment
environment: - DJANGO_DEBUG=True - DJANGO_DB_HOST=db - DJANGO_DB_PORT=5432 - DJANGO_DB_NAME=sampledb - DJANGO_DB_USERNAME=sampleuser - DJANGO_DB_PASSWORD=samplesecret
환경 변수는 그냥 docker run을 할 때보다 좀더 자세하게 적었습니다. 각 값은 Django 설정 파일(djangosample/settings.py)에서 사용합니다.
ports
ports: - "8000:8000"
도커 컴포즈로 서비스를 실행하면 기본적으로 가상의 네트워크가 하나 만들어지고, 네트워크 외부의 접근이 막힙니다. (도커 컨테이너가 그렇듯이요.) 따라서 외부에서 접근할 수 있는 포트를 지정해주어야 한다. 여기서는 Django 개발 서버의 기본 포트는 8000을 지정하였습니다.
depends_on
depends_on: db: condition: service_healthy
서비스가 하나 이상일 때, 실행 의존성을 지정할 수 있다. 여기서 지정한 내용은, db 서비스가 실행된 후에 django 서비스를 실행하겠다는 의미. contidion 뒤에는 서비스 시작(service_started)이나 서비스 헬스체크 성공(service_healthy)을 지정할 수 있다.
db 서비스의 healthcheck 부분과 여기서의 service_healthy 부분이 서로 맞물리면, db 서비스에서 데이터베이스 서버 접속이 가능해진 순간 이후에야, django 서비스가 시작한다.
depend_on에서 condition을 지정하는 방식이 도커 컴포즈 파일 규격 3.0과 3.1에서는 제대로 작동하지 않는다고 합니다.
links
links: - db
docker run에서 --link 옵션에서 지정했던 내용입니다. 앱 컨테이너 안에서 db 서비스를 db라는 이름으로 참조할 수 있다.
command
command: /start-dev.sh
docker run으로 앱 컨테이너를 실행할 때 가장 마지막에 적었던 ./manage.py runserver 0:8000을 대신할 셀 스크립트 파일을 하나 만들었습니다. 다음은 start-dev.sh의 내용이다.
#!/bin/sh python manage.py migrate python manage.py runserver 0:8000
volumes
volumes: - ./:/app/
docker run으로 앱 컨테이너를 실행할 때 프로젝트 루트 디렉터리를 컨테이너 안에 연결했던 부분과 같습니다.
예시
version: "3.3" # 파일 규격 버전
services: # 이 항목 밑에 실행하려는 컨테이너 들을 정의
db: # 서비스 명
image: mysql:5.7 # 사용할 이미지\
# restart: always
container_name: jun-mysql # 컨테이너 이름 설정
ports:
- "3306:3306" # 접근 포트 설정 (컨테이너 외부:컨테이너 내부)
environment: # -e 옵션
MYSQL_ROOT_PASSWORD: '비번' # MYSQL 패스워드 설정 옵션
MYSQL_USER: '계정'
MYSQL_PASSWORD: '비번'
volumes:
- /Users/유저명/폴더명:/var/lib/mysql
# command: # 명령어 실행
# - mysqld --default-authentication-plugin=mysql_native_password
# - --character-set-server=utf8mb4
# - --collation-server=utf8mb4_unicode_ci
mongo:
image: mongo
# restart: always
ports:
- 9017:27017
environment:
MONGO_INITDB_ROOT_USERNAME: 유저계정
MONGO_INITDB_ROOT_PASSWORD: 비번
예시2
version: '2.1'
# 변경 부분!
volumes:
django_sample_db_dev: {}
services:
db:
image: postgres:9.6.1
volumes:
# 여기도 변경 부분!
- django_sample_db_dev:/var/lib/postgresql/data
environment:
- POSTGRES_DB=sampledb
- POSTGRES_USER=sampleuser
- POSTGRES_PASSWORD=samplesecret
- POSTGRES_INITDB_ARGS=--encoding=UTF-8
healthcheck:
test: "pg_isready -h localhost -p 5432 -U postgres"
interval: 3s
timeout: 1s
retries: 10
django:
build:
context: .
dockerfile: ./compose/django/Dockerfile-dev
environment:
- DJANGO_DEBUG=True
- DJANGO_DB_HOST=db
- DJANGO_DB_PORT=5432
- DJANGO_DB_NAME=sampledb
- DJANGO_DB_USERNAME=sampleuser
- DJANGO_DB_PASSWORD=samplesecret
- DJANGO_SECRET_KEY=dev_secret_key
ports:
- "8000:8000"
depends_on:
db:
condition: service_healthy
links:
- db
command: /start-dev.sh
volumes:
# 마지막으로 여기도!
- ./manage.py:/app/manage.py
- ./requirements.txt:/app/requirements.txt
- ./requirements-dev.txt:/app/requirements-dev.txt
- ./djangosample:/app/djangosample
docker-compose 실행하기
https://docs.docker.com/compose/wordpress/
에 워드프레스 docker-compose.yml 파일이랑 실행방법 있음
yml 파일 설치된 dir 에서 실행
docker-compose up -d ##시작
docker-compose down -d ##내리기
참고문헌
> http://raccoonyy.github.io/docker-usages-for-dev-environment-setup/ --도커 docs
> docs.microsoft.com/ko-kr/visualstudio/docker/tutorials/use-docker-compose - ms에서 만든 문서 - build 도 나옴
'인프라 > docker' 카테고리의 다른 글
도커 설치 부터 실행 및 mysql 도커 실행 및 설치 (0) | 2024.05.24 |
---|---|
[docker] 도커 Elasticsearch 설치 및 kibana 설치 (0) | 2021.01.13 |
[docker] 도커 redis 설치 및 접속 (2) | 2021.01.12 |
[docker] 도커 jenkins 시작하기 (0) | 2020.12.18 |
[docker] kafka docker 시작하기 (0) | 2020.11.15 |