명령어를 입력하는 데 익숙해져도, 워드프레스처럼 여러 개의 컨테이너로 구성된 시스템을 실행하기에는 조금 번거롭다.
도커 컴포즈는 시스템 구축과 관련된 명령어를 하나의 텍스트 파일(정의 파일)에 기재해, 명령어 한번에 시스템 전체를 실행하고 종료와 폐기까지 한번에 하도록 도와주는 도구이다.
도커 컴포즈를 사용하면 여러 개의 명령어를 하나의 정의 파일로 합쳐 실행할 수 있다.
도커 컴포즈는 시스템 구축에 필요한 설정을 YAML
포맷으로 기재한 정의 파일을 이용해 전체 시스템을 일괄 실행(run
) 또는 일괄 종료 및 삭제(down
)할 수 있는 도구이다.
📌 정의 파일
정의 파일에는 컨테이너나 볼륨을 '어떠한 설정으로 만들지'에 대한 항목이 기재돼 있다.
작성 내용은 도커 명령어와 비슷하지만 도커 명령어는 아니다.
up
커맨드는 docker run
커맨드와 비슷하다.
정의 파일에 기재된 내용대로 이미지를 내려받고 컨테이너를 생성 및 실행한다.
정의 파일에는 네트워크나 볼륨에 대한 정의도 기재할 수 있어서 주변 환경을 한꺼번에 생성할 수 있다..
down
커맨드는 컨테이너와 네트워크를 정지 및 삭제한다.
볼륨과 이미지는 삭제하지 않는다.
만약 컨테이너와 네트워크를 삭제 없이 종료만 하고 싶다면, stop
커맨드를 사용한다.
도커 컴포즈는 텍스트 파일에 기재된 정의를 따라 실행된다.
이 부분에서, 이전에 배웠던 Dockerfile 스크립트와 비슷한 부분이 있다고 느낄 수 있지만 분명한 차이점이 존재한다.
결론부터 말하자면, 만드는 대상이 다르다!
docker run
명령어를 여러 개 모아놓은 것과 같다.📌 도커 컴포즈와 쿠버네티스
쿠버네티스는 도커 컨테이너를 관리하는 도구인 만큼 여러 개의 컨테이너를 다루는 것과 관계가 깊어서, 도커 컴포즈와도 혼동하기 쉽다.
- 쿠버네티스 : 컨테이너를 관리하는 도구
- 도커 컴포즈 : 컨테이너를 생성 및 삭제, 컨테이너 관리 기능은 없음
도커 컴포즈는 도커 엔진과 별개의 소프트웨어이므로, 도커 컴포즈를 사용하기 전에 먼저 설치를 해야한다.
그러나 도커 컴포즈의 사용법 또한 도커 엔진과 큰 차이가 없어,
일단 설치하고 나면 별개의 소프트웨어라는 점을 신경 쓰지 않아도 될 정도다.
도커 컴포즈로 생성한 컨테이너를 도커 엔진으로 똑같이 관리할 수 있다.
커맨드만 다를 뿐 거의 같은 소프트웨어나 마찬가지이다.
📌 현재 설치해 사용하고 있는 도커 데스크톱은 도커 컴포즈가 함께 설치되기 때문에 따로 설치할 필요가 없다!
도커 컴포즈를 사용하려면 (Dockerfile 스크립트로 이미지를 빌드할 때처럼) 호스트 컴퓨터에 폴더를 만들고 이 폴더에 정의 파일(YAML
파일)을 배치한다.
정의 파일의 이름은 미리 정해진 docker-compose.yml
이라는 이름을 사용해야 한다.
파일은 호스트 컴퓨터에 배치되지만 명령어는 똑같이 도커 엔진에 전달되며,
만들어진 컨테이너도 동일하게 도커 엔진 위에서 동작한다.
정리하자면, 사람이 하나하나 입력하던 명령어를 도커 컴포즈가 대신 입력해주는 역할을 하는 구조이다.
그리고 정의 파일은 한 폴더에 하나만 존재해야 한다.
여러 개의 정의 파일을 사용하려면 그 개수만큼 폴더를 만들어야 한다.
컨테이너 생성에 필요한 이미지 파일이나 HTML 파일 또한 컴포즈가 사용할 폴더에 둬야 한다.
📌 서비스와 컨테이너
도커 컴포즈에서 컨테이너가 모인 것을 '서비스'라고 한다.
공식 참조문서에는 컨테이너와 서비스라는 두 가지 용어가 함께 사용되는데,
그냥 모두 컨테이너로 이해해도 큰 문제는 없다.
이 책에서는 컨테이너라고 용어를 통일한다.
정의 파일은 YAML
형식으로 확장자는 .yml
이다.
파일 이름은 docker-compose.yml
을 사용해야 하고,
-f
옵션을 사용해 파일 이름을 지정하면 다른 이름을 사용해도 되지만 그렇지 않으면 정해진 이름을 사용해야 한다.
version: "3"
services:
apa000ex2:
image: httpd
ports:
- 8080:80
restart: always
➡️ docker run --name apa000ex2 -d -p 8080:80 httpd
version: "3"
services:
wordpress000ex12:
depends_on:
- mysql000ex11
image: wordpress
networks:
- wordpress000net1
ports:
- 8085:80
restart: always
environment:
WORDPRESS_DB_HOST=mysql000ex11
WORDPRESS_DB_NAME=wordpress000db
WORDPRESS_DB_USER=wordpress000kun
WORDPRESS_DB_PASSWORD=wkunpass
➡️ docker run --name wordpress000ex12 -dit --net=wordpress000net1 -p 8085:80 -e WORDPRESS_DB_HOST=mysql000ex11 -e WORDPRESS_DB_NAME=wordpress000db -e WORDPRESS_DB_USER=wordpress000kun -e WORDPRESS_DB_PASSWORD=wkunpass wordpress
컴포즈 파일은 주 항목 ➡️ 이름 추가 ➡️ 설정 의 순서로 작성한다.
주요 항목에는 서비스와 네트워크, 볼륨 등이 존재한다.
version
맨 위의 version
에는 컴포즈 파일의 버전을 적는다.
services
- 컨테이너 관련 정보services
는 컨테이너에 대한 내용을 적는다.
컨테이너가 여러 개라면, 여러 개를 적는다.
networks
- 네트워크 관련 정보networks
는 네트워크 이름을 적는다.
volumes
- 볼륨 관련 정보volumes
은 볼륨 이름을 적는다.
YAML
형식에서는 공백에 따라 의미가 달라지므로 탭은 의미가 없으며 '공백 두 개'로 맨 처음 들여쓰기를 했다면 그 뒤로도 '공백 두 개'가 한 단이 되도록 해야 한다.
주요 항목을 적고 이름을 적을 땐 주 항목보다 한 단 들여쓰기를 해야 한다.
이름 뒤에는 반드시 :
을 붙인다.
이름을 기재한 다음, 각 컨테이너의 설정을 기재한다.
-
) 을 앞에 적고 들여쓰기를 맞춘다.📌 컴포즈 파일(
YAML
) 작성 요령 정리
- 첫 줄에 도커 컴포즈 버전 기재
- 주 항목
services
,networks
,volumes
아래에 설정 내용을 기재- 항목 간의 상하 관계는 공백을 사용한 들여쓰기로 나타냄
- 들여쓰기는 같은 수의 배수만큼의 공백을 사용
- 이름은 주 항목 아래에 들여쓰기한 다음 기재
- 컨테이너 설정 내용은 이름 아래에 들여쓰기한 다음 기재
- 여러 항목을 기재하려면 줄 앞에
-
을 사용- 이름 뒤에는
:
을 사용- 콜론 뒤에는 반드시 공백이 와야 함(바로 줄바꿈하는 경우 제외)
#
뒤의 내용은 주석으로 간주- 문자열은
' '
또는" "
로 감싸 사용
컴포즈 파일의 항목을 정리해보자.
services
: 컨테이너 정의networks
: 네트워크 정의volumes
: 볼륨 정의(항목, docker run 커맨드의 해당 옵션 또는 인자, 내용 순서)
image
/ 이미지 인자
: 사용할 이미지를 지정 networks
/ --net
: 접속할 네트워크를 지정volumes
/ -v
, --mount
: 스토리지 마운트를 설정ports
/ -p
: 포트 설정environment
/ -e
: 환경변수 설정depends_on
: 다른 서비스에 대한 의존관계 정의restart
: 컨테이너 종료 시 재시작 여부를 설정도커 엔진 명령어에서는 보지 못했던 항목으로 depends_on
과 restart
이 있다.
depends_on
은 다른 서비스에 대한 의존관계를 나타낸다.
컨테이너를 생성하는 순서나 연동 여부를 정의한다.
워드프레스처럼 MySQL 컨테이너가 먼저 있어야 하는 경우와 같이, 컨테이너 생성 순서를 지정하는 데 쓸 수 있다.
restart
는 컨테이너 종료 시 재시작 여부를 설정한다.
이번 실습은 이전에 생성했던 '워드프레스 및 MySQL 컨테이너'와 동일한 컨테이너를 만드는 컴포즈 파일을 작성하는 것이다.
✔️ docker-compose.yml
version: "3"
services:
mysql000ex11:
platform: linux/x86_64 # 추가된 옵션
image: mysql:5.7
networks:
- wordpress000net1
volumes:
- mysql000vol11:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: myrootpass
MYSQL_DATABASE: wordpress000db
MYSQL_USER: wordpress000kun
MYSQL_PASSWORD: wkunpass
wordpress000ex12:
depends_on: # 의존관계 설정
- mysql000ex11
image: wordpress
networks:
- wordpress000net1
volumes:
- wordpress000vol12:/var/www/html
ports:
- 8085:80
restart: always
environment:
WORDPRESS_DB_HOST: mysql000ex11
WORDPRESS_DB_NAME: wordpress000db
WORDPRESS_DB_USER: wordpress000kun
WORDPRESS_DB_PASSWORD: wkunpass
networks:
wordpress000net1:
volumes:
mysql000vol11:
wordpress000vol12:
depends_on
항목을 추가해 의존관계를 설정한다.바탕화면에 com_folder
라는 새로운 디렉토리를 생성한 뒤, 작성한 컴포즈 파일을 디렉토리 안에 둔다.
지금까지는 도커 엔진을 통해 명령을 실행하는 docker 커맨드를 사용했지만,
도커 컴포즈는 docker-compose 커맨드를 사용한다.
가장 자주 사용하는 커맨드는 up
down
stop
이다.
up
커맨드는 컴포즈 파일에 정의된 컨테이너 및 네트워크를 생성하고,
down
커맨드는 생성된 컨테이너와 네트워크를 종료하고 삭제한다.
docker-compose -f [정의_파일_경로] up [옵션]
docker-compose up
커맨드를 실행하면 컴포즈 파일의 정의대로 컨테이너 및 주변 환경이 생성된다.
-d
옵션을 사용해 백그라운드에서 실행하고, -f
옵션으로 컴포즈 파일의 경로를 지정한다.
ls
커맨드로 컨테이너, 이미지, 네트워크, 볼륨 정보를 확인한다.
워드프레스의 초기 화면이 나타나는지 확인한다.
docker-compose -f [정의_파일_경로] down [옵션]
docker-compose down
커맨드를 실행해 컨테이너와 네트워크를 종료 및 삭제한다.
-f
옵션으로 컴포즈 파일의 경로를 지정한다.
삭제가 잘 됐는지 확인한다.
📌 이미지와 볼륨은 직접 삭제해야 한다.
down
커맨드는 컨테이너와 네트워크 정보만 삭제하므로, 이미지와 볼륨은 따로 삭제해야 한다.