도커 Docker 멀티 컨테이너 관리 Compose
Docker compose
도커 컨테이너를 다루는 도구
다수의 컨테이너를 하나로 통합하여 관리
인프라를 코드로 표현
하나의 서비스를 위해 여러개의 컨테이너를 올리는 경우
docker compose를 이용하여 컨테이너들을 관리
docker compose 는 링크옵션이 필요하지 않다 ,알아서 연결 됨
-> 쿠버네티스를 사용하면 docker compose 가 필요없다
쿠버네티스랑 호환이 되지 않아서 거의 사용하지 않는다
설치
https://docs.docker.com/compose/install/
Install Docker Compose
docs.docker.com
vagrant@docker:~$ docker-compose --version
docker-compose version 1.29.2, build 5becea4c
# 도커 컴포즈 파일 만들기
# yml 야믈
vagrant@docker:~$ cat docker-compose.yml
version: '3'
services: # 컨테이너
web:
image: httpd:alpine
# 컨테이너 생성, 실행
vagrant@docker:~$ docker-compose up -d
# 실핼중인 컨테이너 확인
# 현재 있는 디렉토리_서비스명_숫자
vagrant@docker:~$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a39e15be6ad9 httpd:alpine "httpd-foreground"2 minutes ago Up About a minute 80/tcp vagrant_web_1
# 도커 컴포즈로 배포 된 컨테이너 확인
vagrant@docker:~$ docker-compose ps
Name Command State Ports
-------------------------------------------------
vagrant_web_1 httpd-foreground Up 80/tcp
# 도커 컴포즈 삭제
vagrant@docker:~$ docker-compose down
vagrant@docker:~$ docker-compose ps
Name Command State Ports
------------------------------
# 다수의 컨테이너 관리
# docker-compose.yml 파일 생성
vagrant@docker:~$ mkdir ldh
vagrant@docker:~/ldh$ cat docker-compose.yml
version: '3'
services:
web:
image: httpd:alpine
db:
image: mysql:5.7
# 도커 컴포즈 생성, 실행
vagrant@docker:~/ldh$ docker-compose up -d
vagrant@docker:~/ldh$ docker-compose ps
Name Command State Ports
---------------------------------------------------------
ldh_db_1 docker-entrypoint.sh mysqld Exit 1
ldh_web_1 httpd-foreground Up 80/tcp
-> 환경 변수를 제공하지 않았기 때문에 Exit 상태
# docker-compose.yml 파일 수정
vagrant@docker:~/ldh$ cat docker-compose.yml
version: '3'
services:
web:
image: httpd:alpine
db:
image: mysql:5.7
environment: # 환경변수
MYSQL_ROOT_PASSWORD: 1234
# 도커 컴포즈 생성, 실행
vagrant@docker:~/ldh$ docker-compose up -d
vagrant@docker:~/ldh$ docker-compose ps
Name Command State Ports
------------------------------------------------------------
ldh_db_1 docker- Up 3306/tcp,
entrypoint.sh 33060/tcp
mysqld
ldh_web_1 httpd-foreground Up 80/tcp
-> 환경변수 추가 후 정상적으로 실행 된 것을 확인
# 도커 컴포즈 컨테이너 스케일링
# docker-compose.yml 파일에 작성한 서비스를 실행할 컨테이너 개수 지정
# 다수의 컨테이너 생성, 시작
vagrant@docker:~/ldh$ docker-compose scale web=3
vagrant@docker:~/ldh$ docker-compose ps
Name Command State Ports
-------------------------------------------------------------
ldh_db_1 docker- Up 3306/tcp, 33060/tcp
entrypoint.sh
mysqld
ldh_web_1 httpd-foreground Up 80/tcp
ldh_web_2 httpd-foreground Up 80/tcp
ldh_web_3 httpd-foreground Up 80/tcp
# web 2ro db 3개 생성,시작
vagrant@docker:~/ldh$ docker-compose up -d --scale web=2 --scale db=3
# 포트포워딩 scale
# docker-compose.yml 파일 수정
vagrant@docker:~/ldh$ cat docker-compose.yml
version: '3'
services:
web:
image: httpd:alpine
ports:
- "80:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: 1234
# 도커 컴포즈 생성, 실행
vagrant@docker:~/ldh$ docker-compose up -d --scale web=2
WARNING: The "web" service specifies a port on the host.
ldh_db_1 is up-to-date
Creating ldh_web_2 ...
Creating ldh_web_2 ... error
ERROR: for ldh_web_2 Cannot start service web: Bind for 0.0.0.0:80 failed: port is already allocated
-> 포트포워딩을 구성하면 scale 사용 불가능 하다
# 이미지 대신에 Dockerfile을 이용하여 빌드
vagrant@docker:~/build/flask$ cat docker-compose.yml
version: '3'
services:
web:
build: .