Docker-compose
Docker Compose
Docker Compose란?
주요 명령어
Docker Compose 구성해보기
Docker Compose Environment
Compose Network 설정 옵션
docker Compose Version별 yml 변수
버전별 특징 및 구성
Docker Compose란?
Docker Compose는 다중 컨테이너 애플리케이션을 정의하고 공유할 수 있도록 개발된 도구로
YAML 파일을 통하여 단일 명령을 사용하여 모두 실행하거나 모두 종료가 가능하며
YAML 파일에 애플리케이션 스택을 정의하고 프로젝트 리포지토리 루트에 파일을 저장함으로
다른 사용자가 Repository를 복제하고 Compose 실행만으로 구동이 가능하다.
\
단일 호스트의 여러 격리 된 환경
Compose는 프로젝트 이름을 사용하여 환경을 서로 격리하고 여러 다른 컨텍스트에서 이 프로젝트 이름을 사용하여 접근한다.
실행시 -p 옵션을 통하여 프로젝트 이름 변경이 가능하며 Default 값은 프로젝트 폴더 이름이 된다.
docker-dompose up -p {프로젝트 이름}
컨테이너 생성시 볼륨 데이터 보존
컨테이너 생성시 볼륨 데이터 보존하여 데이터가 휘발되지 않도록 처리한다.
\
변경된 컨테이너 만 재생성
컨테이너를 만드는 데 사용되는 구성을 캐시하여 변경되지 않은 서비스를 다시 시작하면 Compose는 기존 컨테이너를 다시 사용한다.
\
변수 및 환경 간 구성 이동
Compose 파일의 변수를 지원
변수를 사용하여 다양한 환경 또는 다른 사용자에 맞게 컴포지션 커스텀이 가능하다.
주요 명령어
up -d
docker-compose.yml 파일의 내용에 따라 이미지를 빌드하고 서비스를 실행한다.
up으로 compose를 실행시 단계별 진행사항
서비스를 띄울 네트워크 설정
필요한 볼륨 생성(혹은 이미 존재하는 볼륨과 연결)
필요한 이미지 풀(pull)
필요한 이미지 빌드(build)
서비스 의존성에 따라 서비스 실행
options
-d: 서비스 백그라운드로 실행. (docker run에서의 -d와 같음)--force-recreate: 컨테이너를 지우고 새로 생성.--build: 서비스 시작 전 이미지를 새로 생성
ps
현재 환경에서 실행 중인 각 서비스의 상태를 표시한다.
stop, start
서비스를 멈추거나, 멈춰 있는 서비스를 시작한다.
down
서비스를 삭제한다. 컨테이너와 네트워크를 삭제하며, 옵션에 따라 볼륨도 삭제한다.
options
--volume: 볼륨까지 같이 삭제 (DB 데이터 초기화 하는데 용이함)
exec
실행 중인 컨테이너에서 명령어를 실행한다.
run
docker run 과 마찬 가지로 특정 명령어를 일회성으로 실행한다.
exec는 프로세서를 실행시켜놓을때 사용되고 run은 batch성 작업에 사용 특화 된것으로 보여진다.
options
--rm: 해당 명령어가 종료된 뒤 컨테이너도 종료
logs
output으로 나온 log들을 확인 할때 사용한다.
docker의 logs와 마찬가지로 --follow, -f를 하여 실시간으로 나오는 로그 확인이 가능하다.
options
-f,--follow: 실시간 로그 출력
config
docker-compose에 최종적으로 적용된 설정을 보여준다.
-f를 이용하여 여러개의 설정파일을 띄웠을때 확인에 용이함
Docker Compose 구성해보기.
docker compose 파일은 크게 아래와 같이 구성되어있다.
\
docker-compose version 확인 링크
서비스 정의
App Service 정의
상단의 Docker실행명령어를 아래처럼 Docker Compose로 작성이 가능하다.
Compose 장점으로는 상대경로 입력이 가능하며 yaml로 구성하여 설정파일의 가독성이 좋아진다.
MySQL 서비스 정의
최종본
docker-compose.yml 파일명으로 YAML 파일을 작성하고 docker-compose up 명령어를 통하여 시작한다.
백그라운드 실행 옵션 -d
만약
docker-compose.yml이 아닌 다른 파일을 실행하기 위해선docker-compose -f {YAML_FILE_PATH} up형식으로 명령이 가능하다.
ex) $ docker-compose -f docker-compose-custom.yml updocker-compose -f docker-compose.yml -f docker-compose-test.yml up형태로 두개도 가능하다. YAML을 두개 이상 설정할 경우 앞에 있는 설정보다 뒤에 있는 파일이 우선시 된다.
Docker Compose Environment
.env file
.env file환경변수 설정으로 아래와 같이 참조가 가능하다.
기본적으로 docker-compose up을 한 상태에서는 .env 파일을 찾아 파일 내부에 있는 값을 환경 변수로 사용한다.
여러 파일에서 동일한 환경 변수를 설정할 때 사용할 값을 선택하기 위해 Compose에서 사용하는 우선 순위는 다음과 같다.
Compose file
Shell environment variables
Environment file
Dockerfile
Variable is not defined
상황에 따른 .env 적용법
.env 적용법dev, prod, local 환경에 따라서
.env.dev, .env.prod, .env.local 형식으로 할당을 줄 수 있는데
--env-file 옵션으로 environment 파일 지정이 가능하다.
CLI Environment
아래의 명령어들은 각각 그 아래의 compose 파일이 일치하게 맵핑된다.
Docker Cli Environment Variable
CLI에서 실행할때의 참고 변수 키 값 https://docs.docker.com/compose/reference/envvars/
Compose Network 설정 옵션
위 Compose를 실행했을때의 네트워크가 생성되는 과정은 아래와 같다.
myapp_default네트워크 생성web컨테이너가 생성. (web이라는 이름으로myapp_default에 접속)db컨테이너가 생성. (db이라는 이름으로myapp_default에 접속)
네트워크가 구성된 이후
postgres://db:5432주소로 접속 가능내부 컨테이너 끼리는
postgres://db:5432로 접속하고 외부에선postgres://{DOCKER_IP}:8001로 접속컨테이너 업데이트를 위해 다시 시작할 경우에는 컨테이너 이름은 같지만 다른 IP로 네트워크가 생성되어 IP 베이스는 IP를 다시 찾아서 연결하여야 하고 다른 컨테이너에선 기존에 접속했던 컨테이너 이름으로 재 연결을 시도하여야 한다.
Links
다른 서비스의 컨테이너에 연결한다.
이름만 지정하거나 {name}:{alias}형식으로 지정할 수 있다.
depend_on 처럼 디펜던시 관계가 맺어지며 네트워크랑 같이 쓰일때는 하나 이상의 네트워크가 관리되어 네트워크만 사용하길 권장
Custom Network
Custom Network를 통해 좀 더 복잡한 네트워크 토폴로지를 만들 수 있다
top-level network 옵션에서 커스텀하게 지정이 가능
위와 같이 설정을 하면 app에서만 proxy, db에 접근 가능하고 db와 proxy는 서로 접근이 불가능하게 설정이된다.
IPv4, IPv6
IPv6 사용하려면 enable_ipv6를 반드시 true로 해야한다.
Default Network
default를 이용하여 자체 네트워크를 지정하면서 앱 전체의 기본적인 네트워크 구성이 가능하다.
Use Pre Existing Network
기존의 외부의 네트워크를 사용하려면 다음과 같이 external을 사용하여 명시한다
docker Compose Version 별 yml 변수
Versioning
docker-compose.yml 상단에 작성하는 versioning 작성 방법
Version 1에서는 버저닝을 생략Version 2부터 마이너 버전(2.x)까지 설정해야 함 (생략시 2.0으로 적용된다.)Version 3은 도커 스웜과 같이 사용되도록 디자인 됨
각 docker 버전 별 사용 가능한 docker-compose.yml 버전
docker-compose.yml 버전3.8
19.03.0+
1.26.0+
3.7
18.06.0+
-
3.6
18.02.0+
-
3.5
17.12.0+
-
3.4
17.09.0+
-
3.3
17.06.0+
-
3.2
17.04.0+
-
3.1
1.13.1+
-
3.0
1.13.0+
1.10.0+
2.4
17.12.0+
1.21.0+
2.3
17.06.0+
1.16.0+
2.2
1.13.0+
1.13.0+
2.1
1.12.0+
1.9.0+
2.0
1.10.0+
1.6.0+
1.0
1.9.1.+
Compose 버전에 따른 차이점
Structure가 허용하는 키 값과 매개변수
실행해야하는 최소 Docker Engine 버전
네트워킹과 관련된 Compose의 동작
Compose 마이그레이션
Version 2.x -> 3.x 마이그레이션
Compose 버전 2와 3의 구조는 동일하지만 삭제된 매개변수들이 있어서 3.X에 맞게 수정하여준다.
volume_driver
서비스에서 볼륨 드라이버를 설정하는 대신
top-level volumes option을 사용하여 볼륨을 정의 하고 드라이버를 지정volumes_from: 서비스간에 볼륨을 공유하려면top-level volumes option을 사용하여 정의하고 서비스 수준 볼륨 옵션을 사용하여 공유하는 각 서비스에서 참조cpu_shares,cpu_quota,cpuset,mem_limit,memswap_limit는3.x의resource로 대체해당 옵션은 docker swarm에만 적용
extends은 제거되어 다른 방법을 찾아봐야함group_add은3.x에서 제거됨pids_limit은3.x에 도입되지 않음networks -
link_local_ips옵션은3.x에 도입되지 않음
Version 1 -> 2.x 마이그레이션
모든것을 한단계씩 들여쓰기를 하고
services:를 삽입최상단에 version:
2.x지정dockerfile은build하위로 옮긴다.
log_driver,log_opt는logging하위로 두고 다음과 같이 변경한다.
net는network_mode로 대체
volumesnamed volumes이 있는 경우top-level volumes option에서data를 선언해야 함
기본적으로 프로젝트 이름으로 볼륨을 선언하지만
data라는 이름으로 볼륨을 생성하고 싶으면 다음과 같이 외부로 선언을한다.
버전별 특징 및 구성
Version.1
https://docs.docker.com/compose/compose-file/compose-file-v1/
yml 문서에 버전명이 생략
volumes,networksorbuild arguments사용 불가networking이 지원되지 않음
모든 컨테이너는 기본 bridge 네트워크 에 배치 되고 해당 IP 주소의 다른 모든 컨테이너에서 연결 가능
컨테이너 간 검색을 활성화 하려면
links를 사용
links https://docs.docker.com/compose/compose-file/compose-file-v1/#links
Version.2
https://docs.docker.com/compose/compose-file/compose-file-v2/
Compose 1.6.0이상Docker Engine of version 1.10.0+.에서 동작yml 문서에 버전명을 마이너 버전까지 작성
ex) 2.1모든 서비스는 services 키 아래에 선언
volumes에 Named volumes 생성 가능networks에 Network 생성 가능기본적으로 모든 컨테이너는 애플리케이션 전체의 기본 네트워크에 연결되며 서비스 이름과 동일한 호스트 이름에서 검색 가능 이것은 링크가 거의 불필요하다는 것을 의미.
links 동작 원리 이 컨테이너의 /etc/hosts 파일에 그 내용이 추가되어서 컨테이너에서 다른 컨테이너 들에 접근할 수 있게 된다.
Version2 예시
추가된 매개변수
network -
aliasesNetwork -
depends_on:
depends_on
실행시 depends_on에 명시된 db, redis가 뜬 뒤에 해당 서비스가 실행된다.
Version 2.1
추가된 매개 변수
link_local_ipsbuild, service -
isolationvolumes, networks, build -
labelsvolumes -
nameuserns_modehealthchecksysctlspids_limitoom_kill_disablecpu_period
Version 2.2
추가된 매개 변수
initscalecpu_rt_runtime,cpu_rt_periodbuild -
network에
Version 2.3
추가된 매개 변수
build -
target,extra_hosts,shm_sizehealthcheck -
start_periodservice -
runtimevolumns -
LONG SYNTAX제공device_cgroup_rules
LONG SYNTAX
Version 3
https://docs.docker.com/compose/compose-file/compose-file-v3/ 삭제된 매개 변수
volume_drivervolumes_fromcpu_sharescpu_quotacpusetmem_limitmemswap_limitextendsgroup_add
추가된 매개 변수
Version 3.1
추가된 매개 변수
Version 3.2
추가된 매개 변수
build -
cache_fromnetwork driver option -
attachable)deploy -
endpoint_modedeploy -
placement preference
Version 3.3
추가된 매개 변수
Version 3.4
추가된 매개 변수
healthcheck -
start_periodupdate - order
volumes - name
Version 3.5
추가된 매개 변수
Version 3.6
추가된 매개 변수
volume mount type -
tmpfs
Version 3.7
추가된 매개 변수
service -
initdeploy -
rollback_configroot of service,network,volume,secret에 extension-fields 제공
Version 3.8
추가된 매개 변수
secret -
driver,driver_optsoption (swarm에 배포시에만 적용)
참고한 문서 https://docs.microsoft.com/ko-kr/visualstudio/docker/tutorials/use-docker-compose https://www.44bits.io/ko/post/almost-perfect-development-environment-with-docker-and-docker-compose#%EB%8F%84%EC%BB%A4-%EC%BB%B4%ED%8F%AC%EC%A6%88%EC%9D%98-%EC%A3%BC%EC%9A%94-%EB%AA%85%EB%A0%B9%EC%96%B4 https://docs.docker.com/compose/environment-variables/ https://docs.docker.com/compose/env-file/ https://docs.docker.com/compose/reference/envvars/
Last updated