도커 컴포즈 개념
도커 컴포즈란 파일 하나로 여러 컨테이너를 생성하고 폐기할 수 있도록 하는 도구입니다.
만약 도커 컴포즈가 없다면, 일일이 커맨드를 입력해야 하는데 이를 한번에 해결해주는 도구이죠.
도커 컴포즈 vs Docker file, Kubernetes
Dockerfile 스크립트는 이미지 만드는 용도입니다. 네트워크나 볼륨을 생성할 수 없습니다.
그러나 도커 컴포즈 파일은 컨테이너를 비롯한 네트워크나 볼륨 등 주변 환경까지 포괄합니다.
앞서 말씀드렸듯, 여러 커맨드를 입력할 필요 없이 파일 하나로 해결해낼 수 있는 것입니다.
Kubernetes는 여러 컨테이너를 관리하는 도구입니다. 따라서 생성 및 폐기를 비롯한 관리 기능이 제공됩니다.
그러나 도커 컴포즈에는 컨테이너 관리 기능이 없습니다.
도커 컴포즈 사용 및 작동 원리
도커 컴포즈는 도커 엔진과 사용법이 대동소이합니다. 그러나 엄연히 별개의 소프트웨어입니다. 따라서 별도 설치가 필요합니다. 다만 리눅스 환경에서만 설치가 필요할 뿐, 윈도우나 MAC OS에선 필요치 않습니다. 이유는 Docker Desktop 설치 시 함께 설치되기 때문입니다.
도커 컴포즈의 파일 형식은 YAML 파일 형식으로, "파일이름.yml" 양식을 따릅니다.
파일은 호스트에 위치하며 도커 컴포즈가 이를 읽고 대신 커맨드를 입력해주는 방식으로 작동합니다. 단, 파일은 폴더에 하나만 있어야 합니다. 만약 여러 YAML 파일이 있다면 폴더를 각각 분리해야 합니다.
도커 컴포즈 커맨드
YAML 파일 커맨드 주요 커맨드로는 up, down이 있습니다.
도커 컴포즈 주요 커맨드: UP
up은 YAML 파일을 읽는 명령어입니다.
docker-compose -f C:\Users\user\Desktop\study\cloud\redmine-maria\docker-compose-red-maria.yml up
up 명령어 사용 시 주의해야할 점 2가지가 있습니다. 먼저, up 명령어는 YAML 파일을 한번 읽고 나면 끝입니다. 따라서 up 실행 이후 YAML 파일을 수정하더라도 동기화되진 않습니다. 마찬가지로, YAML 파일로 생성된 컨테이너의 설정을 변경하더라도 YAML 파일에 반영되지 않습니다. 다음으로, 도커 엔진에 생성되는 컨테이너 이름은 도커 컴포즈에 명시한 service 이름과 다르다는 점입니다. 도커 엔진에 생성되는 컨테이너 이름은 "leaf 폴더명_service에 명시한 컨테이너 이름_번호"로 생성됩니다. 예를 들어, C:\Users\user\Desktop\study\cloud\wordpress-maria\docker-compose-red-maria.yml에 대해 up 커맨드를 입력한 경우 생성되는 컨테이너 이름은 "wordpress-maria-${services에 명시한 컨테이너 이름}-1" 입니다.
번호는 YAML 파일이 여러 번 실행되면, 즉 같은 구성의 컨테이너 세트가 여러 개 생성되면 넘버링 형태로 붙습니다.
docker-compose -f C:\Users\user\Desktop\study\cloud\redmine-maria\docker-compose-red-maria.yml up --scale maria_lim=2
*근데 여러 컨테이너를 만드는 도커 컴포즈에서 의존 관계와 맞지 않게 특정 컨테이너만 여러 개 생성하면, 장애가 날 가능성이 높습니다. 여러 컨테이너가 포트번호를 공유하는 것(포트 번호 중복)도 장애를 야기할 수 있습니다. 따라서 여러 세트의 컨테이너를 생성하는 경우 쿠버네티스 활용을 권장합니다.
도커 컴포즈 주요 커맨드: DOWN
down은 YAML로 실행된 컨테이너, 네트워크를 폐기하는 명령어입니다.
down 명령어에서 중요한 건 image와 volume은 삭제되지 않는다는 점입니다. 따라서 별도 폐기 작업이 필요합니다.
docker-compose -f C:\Users\user\Desktop\study\cloud\redmine-maria\docker-compose-red-maria.yml down
도커 컴포즈 파일 양식 및 예제
양식
version: "${버전}"
services:
${컨테이너 이름}:
depend_on:
- ${의존 컨테이너 이름}
image: ${이미지 이름}
networks:
- ${네트워크 이름}
ports:
- ${클라이언트 요청하는 포트}:${리다이렉트되는 포트}
restart: ${컨테이너 재시작 여부}
#restart 설정 값: no, always, on-failure, unless-stopped
environment:
${환경변수 이름}=${환경변수 값}
networks:
${네트워크 이름}:
volumes:
${볼륨 이름}:
mysql+wordpress
version: "3"
services:
mysql000ex11:
image: mysql
networks:
- wordpress000net1
volumes:
- mysql000vol11:/var/lib/mysql
restart: always
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
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:
MYSQL_ROOT_PASSWORD: myrootpass
MYSQL_DATABASE: wordpress000db
MYSQL_USER: wordpress000kun
MYSQL_PASSWORD: wkunpass
networks:
wordpress000net1:
volumes:
mysql000vol11:
wordpress000vol12:
mysql+redmine
version: "1"
services:
cloudlim_mysql:
image: mysql
networks:
- cloudlim_net
volumes:
- cloudlim_vol1:/var/lib/mysql
restart: always
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: myrootpass
MYSQL_DATABASE: cloudlimdatabase
MYSQL_USER: cloudlim
MYSQL_PASSWORD: limlim1234
cloudlim_redmine:
depends_on:
- cloudlim_mysql
image: redmine
networks:
- cloudlim_net
volumes:
- cloudlim_vol2:/usr/src/redmine/files
ports:
- 8086:3000
restart: always
environment:
MYSQL_ROOT_PASSWORD: myrootpass
MYSQL_DATABASE: cloudlimdatabase
MYSQL_USER: cloudlim
MYSQL_PASSWORD: limlim1234
networks:
cloudlim_net:
volumes:
cloudlim_vol1:
cloudlim_vol2:
mariadb+redmine
version: "2"
services:
maria_lim:
image: mariadb
networks:
- net_lim
volumes:
- vol_lim1:/var/lib/mysql
restart: always
command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: mariarootpw
MYSQL_DATABASE: limdb
MYSQL_USER: cloudlim
MYSQL_PASSWORD: lim1234
cloudlim_redmine:
depends_on:
- maria_lim
image: redmine
networks:
- net_lim
volumes:
- vol_lim2:/usr/src/redmine/files
ports:
- 8087:3000
restart: always
environment:
MYSQL_ROOT_PASSWORD: mariarootpw
MYSQL_DATABASE: limdb
MYSQL_USER: cloudlim
MYSQL_PASSWORD: lim1234
networks:
net_lim:
volumes:
vol_lim1:
vol_lim2:
출처
그림과 실습으로 배우는 도커 & 쿠버네티스 - 예스24
컨테이너나 도커를 도통 이해하기 어려운 분들을 위한 본격 도커 입문서!이 책은 컨테이너 기술이 어렵게 느껴지는 엔지니어나 백엔드 기술에 자신이 없는 분들을 위한 도커 입문서다. 자세한
www.yes24.com
'Docker' 카테고리의 다른 글
Docker Hub Repository Image Push, Pull (0) | 2024.06.08 |
---|---|
워드프레스 배포(네트워크 구축, mysql과 wordpress image로 컨테이너 배포) (1) | 2024.06.02 |
컨테이너 실행해보기 (0) | 2024.05.31 |
컨테이너와 도커 개념, 도커 동작 원리, 도커 이미지와 생애주기(그림과 실습으로 배우는 도커&쿠버네티스) (0) | 2024.05.31 |