클라우드/도커(Docker)

도커 Docker 멀티 컨테이너 관리 Compose

두뚜 2021. 7. 5. 17:27

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