도커 컴포즈란?!
시스템 구축에 필요한 설정을 YAML 포맷으로 기재한 정의 파일(Compose file)을 이용해 전체 시스템을 일괄 실행 또는 종료 및 삭제할 수 있는 도구.
정의 파일에는 컨테이너나 볼륨을 '어떠한 설정으로 만들지’에 대한 항목이 기재되어 있다.
Dockerfile vs 도커 컴포즈 vs 쿠버네티스
Dockerfile은 이미지를 만드는 데 쓰이는 스크립트.
도커 컴포즈는 컨테이너, 네트워크, 볼륨을 만드는 데 쓰이는 스크립트
쿠버네티스는 컨테이너를 관리하는 도구
도커 컴포즈는 컨테이너를 생성하고 삭제하는 도구 (컨테이너 관리 X)
컴포즈 파일(YAML 형식) 작성법
- 첫 줄에 도커 컴포즈
version
기재 - 주 항목
services
(컨테이너),networks
(네트워크),volumes
(볼륨) 아래에 설정 내용 기재 - 항목 간의 상하 관계는 공백을 사용한 들여쓰기로 나타냄
- 들여쓰기는 같은 수의 배수만큼의 공백을 사용함
- 이름은 주 항목 아래에 들여쓰기한 다음 기재
- 컨테이너 설정 내용은 이름 아래에 들여쓰기한 다음 기재
- 여러 항목을 기재하려면 줄 앞에
-
붙이기 - 이름 뒤에는 콜론
:
붙이기 - 콜론 뒤에는 반드시 공백이 와야 함 (바로 줄바꿈하는 경우는 예외)
#
뒤의 내용은 주석으로 간주- 문자열은
‘
혹은“
로 감싸 작성
version: "1.0" # 버전 기재
services: # 컨테이너 관련 정보
컨테이너_이름1:
image: 이미지_이름
networks:
- 네트워크_이름
ports:
- 포트_설정
...
컨테이너_이름2:
image: 이미지_이름
...
networks: # 네트워크 관련 정보
네트워크_이름1:
volumes: # 볼륨 관련 정보
볼륨_이름1:
볼륨_이름2:
...
주로 사용하는 정의 항목들
항목 | docker run 커맨드의 해당 옵션/인자 | 내용 |
image | 이미지 인자 | 사용할 이미지 지정 |
networks | --net | 접속할 네트워크 지정 |
volumes | -v, --mount | 스토리지 마운트 설정 |
ports | -p | 포트 설정 |
environment | -e | 환경변수 설정 |
depends_on | 없음 | 다른 서비스에 대한 의존관계 정의 ✔️ B라는 컨테이너 정의에 depends_on: -A 라고 써 있다면, A 컨테이너를 생성한 다음에 B 컨테이너를 만들어야 함! |
restart | 없음 | 컨테이너 종료 시 재시작 여부 설정 no : 재시작하지 않는다 always : 항상 재시작한다. on-failure : 프로세스가 0 외의 상태로 종료됐다면 재시작한다. unless-stopped : 종료 시 재시작하지 않음. 그 외에는 재시작한다. |
도커 컴포즈 커맨드
up
커맨드
: 정의 파일에 기재된 내용대로 이미지를 내려받고 컨테이너와 볼륨, 네트워크를 생성 및 실행.
# 예시
docker-compose -f 정의_파일_경로 up 옵션
옵션 | 내용 |
-f | 컴포즈 파일 경로 지정 (생략하면 현재 작업 디렉터리를 컴포즈용 폴더로 사용) |
-d | 백그라운드 실행 |
--no-color | 화면 출력 내용을 흑백으로 함 |
--no-deps | 링크된 서비스를 실행하지 않음 |
--force-recreate | 설정 or 이미지가 변경되지 않더라도 컨테이너 재생성 |
--no-create | 컨테이너가 이미 존재할 경우 다시 생성하지 않음 |
--no-build | 이미지가 없어도 이미지를 빌드하지 않음 |
--build | 컨테이너를 실행하기 전에 이미지 빌드 |
--abort-on-container-exit | 컨테이너가 하나라도 종료되면 모든 컨테이너 종료 |
-t, --timeout | 컨테이너를 종료할 때의 타임아웃 설정. 기본은 10초. |
--remove-orphans | 컴포즈 파일에 정의되지 않은 서비스의 컨테이너 삭제 |
--scale | 컨테이너의 수 변경 |
down
커맨드
: 컨테이너와 네트워크를 종료 및 삭제 (볼륨과 이미지는 삭제 X)
docker-compose -f 컴포즈_파일_경로 stop 옵션
옵션 | 내용 |
-f | 컴포즈 파일 경로 지정 |
--rmi 종류 | 삭제 시에 이미지도 삭제한다. all : 사용했던 모든 이미지 삭제 local : 커스텀 태그가 없는 이미지만 삭제 |
-v, --volumes | volumes 항목에 기재된 볼륨을 삭제한다. 단, external로 지정된 볼륨은 삭제되지 않는다. |
--remove-orphans | 컴포즈 파일에 정의되지 않은 서비스의 컨테이너도 삭제한다. |
stop
커맨드
: 컨테이너와 네트워크를 삭제하지 않고 종료만
[직접해보기] Wordpress 구축
2023.11.13 - [♾️DevOps/Docker] - [Docker] Wordpress를 구축해보자!! 1탄 - 여러 컨테이너 생성 및 연동하기
👆 앞선 포스팅에서 워드 프레스 구축 연습을 했었다.
네트워크 생성 -> MySQL 컨테이너 생성 -> 워드프레스 컨테이너 생성 순으로 각각의 컨테이너를 생성하고 연동해줌으로써 워드프레스를 구축했었는데,
도커 컴포즈를 활용한다면 컴포즈 파일에 필요한 내용을 전부 작성하고 up커맨드로 실행만 해주면 된다.
Step1. 컴포즈 파일 작성
version: "3"
services:
mysql_container:
image: mysql:5.7.32
networks:
- wordpress_net
volumes:
- mysql_vol:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: myrootpass
MYSQL_DATABASE: wordpress_db
MYSQL_USER: wordpress_user
MYSQL_PASSWORD: wuserpass
wordpress_container:
depends_on:
- mysql_container
image: wordpress
networks:
- wordpress_net
volumes:
- wordpress_vol:/var/www/html
ports:
- 8085:80
restart: always
environment:
WORDPRESS_DB_HOST: mysql_container
WORDPRESS_DB_NAME: wordpress_db
WORDPRESS_DB_USER: wordpress_user
WORDPRESS_DB_PASSWORD: wuserpass
networks:
wordpress_net:
volumes:
mysql_vol:
wordpress_vol:
- wordpress_net 이라는 이름의 가상 네트워크 생성해서 MySQL과 wordpress 컨테이너 연결
- mysql_container 이라는 이름의 MySQL 컨테이너 생성. (인자 관련 설정을 생략하기 위해 5.7대 버전으로 진행)
- wordpress_container 이라는 이름의 wordpress 컨테이너 생성. 의존 관계 설정(depends_on)을 통해 MySQL 컨테이너 생성 후에 wordpress 컨테이너가 생성되도록 함.
컴포즈 파일 자체는 메모장에 작성하면 되고, 파일 이름은 반드시 "docker-compose.yml"로 해야 한다!!
공백, 콜론, 철자 등에 유의해서 작성하자!
위치는 어디에 두든 상관 없다고 한다.
나는 문서 아래에 compose_folder를 만들고, 그 안에 컴포즈 파일을 작성했다.
Step2. 컴포즈 파일 내용 실행 및 확인
docker-compose -f C:\Users\heoyu\Documents\compose_folder\docker-compose.yml up -d
- -f : 컴포즈 파일 경로 지정 (생략하면 현재 작업 디렉터리를 컴포즈용 폴더로 사용)
- C:\Users\heoyu\Documents\compose_folder\docker-compose.yml : 컴포즈 파일 경로
- -d : 백그라운드 실행
- up : 정의 파일에 기재된 내용대로 이미지를 내려받고 컨테이너와 볼륨, 네트워크를 생성 및 실행.
up 커맨드 실행 후 localhost:8085로 접근했을 때 위와 같이 wordpress 화면이 뜬다면 성공!!
혹시 이렇게 'Error establishing a databse connection' 이라는 에러 화면이 뜬다면..
컴포즈 파일에 작성한 내용 중 어딘가 틀린 것이다ㅋㅋㅋ
콜론과 공백, 철자 하나하나 다시 꼼꼼히 보면서 틀린 부분을 찾아서 고쳐주면 잘 실행될 것이다!!
(나도 알고 싶지 않았다...ㅎ)
워드프레스 구축 후에 볼륨, 네트워크, 컨테이너 목록을 띄워봤다.
볼륨과 네트워크의 경우에는 내가 컴포즈 파일에서 지정해 준 이름 앞에 "compose_folder"라고 폴더 명이 붙었고,
컨테이너의 경우에는 내가 지정한 이름 앞에는 폴더 명, 뒤에는 1이라는 숫자가 붙어 있었다.
번호가 붙는 이유는 같은 구성의 컨테이너를 여러 세트 실행했을 때 사용하기 위함이라고 한다.
도커 컴포즈로 컨테이너와 볼륨, 네틍워크를 생성/실행할 경우 이렇게 폴더 이름과 번호가 붙는다는 사실에 주의해야 한다!!
Step3. 컨테이너와 네트워크 종료 및 삭제
docker-compose -f C:\Users\heoyu\Documents\compose_folder\docker-compose.yml down
down 커맨드를 이용해 컨테이너와 네트워크를 종료 및 삭제할 수 있다.
볼륨과 이미지는 down 커맨드로 삭제되지 않기 때문에 필요없는 경우 직접 삭제해줘야 한다!!
참고 자료
📓 그림과 실습으로 배우는 도커 & 쿠버네티스
그림과 실습으로 배우는 도커 & 쿠버네티스: 개념과 작동 원리가 쏙쏙 이해되는 완벽 입문서
컨테이너나 도커를 도통 이해하기 어려운 분들을 위한 본격 도커 입문서! 이 책은 컨테이너 기술이 어렵게 느껴지는 엔지니어나 백엔드 기술에 자신이 없는 분들을 위한 도커 입문서입니다. 자
wikibook.co.kr