본문 바로가기

클라우드/도커(Docker)

도커 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: .