도커 컴포즈는 정의 파일(이하 컴포즈 파일)의 내용을 실행하므로 컴포즈 파일 작성이 필요하다. 여기선 컴포즈 파일의 작성 방법을 알아보고 실습해보자.
컴포즈 파일은 YAML 형식 으로 작성하며 주 항목 → 이름 추가 → 설정 순서의 계층 구조로 작성 한다. 주 항목은 version, services, networks, volumes 등이 있고 주 항목 뒤에는 콜론(:)을 작성 한다. 주 항목에 이름을 추가하는 경우, 주 항목 아랫줄에 들여쓰기를 포함해 이름을 작성 하고 역시 콜론(:)을 작성 한다.
# docker-compose.yml 파일 예시
version: "3"
services: # 컨테이너 관련 정보
컨테이너_이름1:
컨테이너_이름2:
networks: # 네트워크 관련 정보
네트워크_이름1:
volumes: # 볼륨 관련 정보
볼륨_이름1:
볼륨_이름2:
version은 컴포즈 파일 포맷의 버전을 의미 한다. version에 따라 작성 포맷 및 항목에 차이가 있으며, 도커 엔진/컴포즈 버전에 따라 support 하는 컴포즈 파일 version에 제한이 존재한다. 우리는 실습에서 version: "3" 을 사용한다. 추가로 services 항목은 컨테이너를 의미 한다
Tip. YAML (YAML Ain't Markup Language)
설정 파일에 사용되는 파일 형식 으로, 주로 사용되던 포맷인 JSON의 불편함을 해소하기 위해 만들어진 상위호환 이다. XML, JSON등과 비교해 압도적으로 간결하다. YAML 형식은 공백에 따라 의미가 달라지므로 공백 구분에 유의 하자.
이름을 기재한 다음에는 세부 항목을 추가 할 수 있다. 세부 항목은 새로운 줄에 들여쓰기 한단을 추가하여 작성하며 콜론과 공백 을 써야한다. 설정 값이 다수인 경우 콜론 밑에 줄을 추가하여 하이픈(-)과 한칸 띄어쓰기 후 작성 한다. 하위 계층은 항상 상위 계층보다 들여쓰기 한단을 추가하며, 항목 값은 한칸 띄어쓰기 후에 작성한다는 것을 기억하자.
# docker-compose.yml 파일 예시
version: "3"
services: # 컨테이너 관련 정보
컨테이너_이름1:
image: 이미지_이름
networks:
- 네트워크_이름
ports:
- 포트_설정
volumes:
- 볼륨_이름:컨테이너_내부_경로
컨테이너_이름2:
image: 이미지_이름
networks: # 네트워크 관련 정보
네트워크_이름1:
volumes: # 볼륨 관련 정보
볼륨_이름1:
볼륨_이름2:
[컨테이너 간 연동 (워드프레스 사이트 구축)] 에서 만든 시스템을 컴포즈 파일로 작성해보자. 생성할 주 항목에 대한 정보는 다음과 같다.
항목 | 값 |
---|---|
네트워크 이름 | wordpress000net1 |
MySQL 볼륨 이름 | mysql000vol11 |
워드프레스 볼륨 이름 | wordpress000vol12 |
MySQL 컨테이너 이름 | mysql000ex11 |
워드프레스 컨테이너 이름 | wordpress000ex12 |
컴포즈 파일은 어느 경로에 둬도 상관 없다. 실습에서는 /home/jpark 에 com_folder 를 만들고 이 안에 docker-compose.yml 파일을 생성한다.
root@LAPTOP-3H85AI8N:/home/jpark# mkdir com_folder
root@LAPTOP-3H85AI8N:/home/jpark# ls
apa_folder com_folder fast-venv fastapi-data-science
root@LAPTOP-3H85AI8N:/home/jpark# cd com_folder/
root@LAPTOP-3H85AI8N:/home/jpark/com_folder# nano docker-compose.yml
# docker-compose.yml 작성
version: "3"
services:
mysql000ex11:
wordpress000ex12:
networks:
wordpress000net1:
volumes:
mysql000vol11:
wordpress000vol12:
# docker-compose.yml 작성
version: "3"
services:
mysql000ex11:
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:
networks:
wordpress000net1:
volumes:
mysql000vol11:
wordpress000vol12:
MySQL 이미지는 인자 설정과 관련된 문제로 5.7 버전으로 설치한다. MySQL은 환경설정이 필요 하므로 environment 라는 하위 항목을 작성 하고 MYSQL_ROOT_PASSWORD, MYSQL_DATABASE, MYSQL_USER, MYSQL_PASSWORD를 기재한다.
restart은 컨테이너 종료 시에 재시작 여부를 설정 하는 항목으로 always 값은 종료 시 항상 재시작하는 설정이다.
# docker-compose.yml 작성
version: "3"
services:
mysql000ex11:
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:
- 8081: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:
워드프레스 정의 작성에는 depeneds_on 항목 이 추가된다. depends_on 은 다른 서비스(컨테이너)에 대한 의존관계 항목 이며, 컨테이너 생성 순서나 연동 여부를 정의한다. 여기서는 MySQL 컨테이너 생성 후, 이에 의존하여 워드프레스 컨테이너를 생성 한다는 의미이다.
environment 항목에는 WORDPRESS_DB_HOST, WORDPRESS_DB_NAME, WORDPRESS_DB_USER, WORDPRESS_DB_PASSWORD를 기재한다.
Tip. MySQL 8.0 사용
MySQL은 버전 8.0 부터 인증 방식이 바뀌었기 때문에 사용하려면 인자를 추가해야한다. 컴포즈 파일에서 인자를 추가하려면 command 항목을 기재해야한다.version: "3" ... mysql000ex11: image: mysql networks: - wordpress000net1 volumes: - mysql000vol11:/var/lib/mysql restart: always command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci --default-authentication-plugin=mysql_native_password environment: MYSQL_ROOT_PASSWORD: myrootpass MYSQL_DATABASE: wordpress000db MYSQL_USER: wordpress000kun MYSQL_PASSWORD: wkunpass wordpress000ex12: ...