Docker

도커 컴포즈

쿠와와 2021. 1. 12. 17:48

도커 컴퍼즈란??

여러 개의 컨테이너를 하나의 서비스로 정의해 컨테이너 묶음으로 관리하는 것

 

 

도커 컴포즈를 사용하는 이유

여러 개의 컨테이너가 하나의 애플리케이션을 동작할 때 이를 테스트하려면 각 컨테이너를 하나씩 생성해야 한다.

매번 run 명령어를 여러 번 사용할 수 있지만 각 컨테이너가 제대로 동작하는지 확인하는 테스트 단계에서는 번거롭다. 

매번 실행 따로 하기 귀잖다. 

그래서 여러 개의 컨테이너를 하나의 서비스로 정의해 컨테이너 묶음으로 관리하는 것이 편리하다. 

도커 컴포즈는 여러 개의 컨테이너의 옵션과 환경을 정의한 파일을 읽어 컨테이너를 순차적으로 생성하는 방식으로 동작한다. 또한 설정 파일에 정의된 서비스의 컨테이너 수를 유동적으로 조절할 수 있으며 컨테이너의 서비스 디스커버리도 자동으로 이뤄진다. 

 

프로젝트에 컨테이너의 수가 많아지고 정의해야 할 옵션들이 많아진다면 도커 컴포즈를 쓰자

 

도커 컴포즈 설치 

버전은 달라질 수 있음 : 참고링크 - https://github.com/docker/compose/releases

 

설치 명령어 

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

권한 설정 

sudo chmod +x /usr/local/bin/docker-compose

 

설치 후 잘 설치되었는지 확인해보자 

docker-compose -v

 

도커 컴포즈 사용 

적절한 사진이 안 돌아다니냐..

docker-compose.yml 작성과 활용

 

컨테이너 생성

docker run -d --name mysql alicek106/composetest:mysql mysqld
docker run -d -p 80:80 --link myslq:db --name web alicek106/composetest:web apachect1 -DFOREGROUND

docker-compose.yml 파일 작성 

version: '3.0'
services:
  web:
    image: alicek106/composetest:web
    ports:
      - "80:80"
    links:
      - mysql:db
    command: apachectl -DFOREGROUND
  mysql:
    image: alicek106/composetest:mysql
    command: mysqld

YAML 파일에서 들여쓰기를 할 때 Tab은 도커 컴포즈가 인식하지 못하므로 2개의 공백을 사용하자 

 

실행해보자 ! 

docker-compose up -d

이때 -f 옵션을 사용하면 yml 파일의 위치와 이름을 지정할 수 있다.

 

docker ps 명령어 뿐만아니라 

docker-compose ps 명령어로도 컨테이너를 확인할 수 있다.

 

 

도커 컴포즈는 컨테이너를 프로젝트 및 서비스 단위로 구분하므로 컨테이너의 이름은 일반적으로 다음과 같다.

[프로젝트 이름]_[서비스 이름]_[서비스 내에서 컨테이너의 번호]

 

하나의 프로젝트는 여러 개의 서비스로 구성되고 각 서비스는 여러 개의 컨테이너로 구성된다. 

 

Tip.
docker-compose up 명령어 끝에 서비스의 이름을 입력해 특정 서비스의 컨테이너만 생성할 수 있다.

docker-compose up -d mysql

docker-compose run 명령어로 컨테이너를 생성할 수 도 있다. 이떄 interactive 셸을 사용할 수 있다.

docker-compose run web /bin/bash

 

위에서 유동적이라고 설명했는데 아래의 명령어를 사용하면 서비스의 컨테이너를 유동적으로 줄이거나 늘릴 수 있다.

docker-compose scale=2

docker-compose ps

 

 

생성된 프로젝트는 삭제할 수도 있다. 프로젝트를 삭제하면 서비스의 컨테이너 또한 전부 정지된 뒤 삭제된다. 

docke-compose down

 

여기서 -p 옵션을 사용해서 제거하거나 생성할 프로젝트의 이름을 명시할 수 있다. 

 

yml파일 

 

1) 버전 정의 -> 버전 3은 도커 스윔 모드와 호황이 되므로 가능하면 최신 버전을 쓰자. 맨 윗부분에 명시

version: '3.0'

 

2) 서비스 정의 -> 도커 컴포즈로 생성할 컨테이너 옵션을 정의한다. 

services:
  web:
    enviroment : ->docker run 의 --env 명령어랑 동일하다. 컨테이너 내부에서 사용할 환경변수 지정
      - MYSQL_ROOT_PASSWORD=mypassword
    build: ./composetest -> 이 항목에서 정의된 도커파일에서 이미지를 빌드해 서비스 컨테이너 생성 
    image: alicek106/composetest:web -> 컨테이너를 생성할 때 쓰일 이미지의 이름을 설정
    ports: -> 서비스의 컨테이너를 개방할 포트를 설정 
      - "80:80"
    depends_on  -> : 안 붙임, 특정 컨테이너에 대한 의존 관계 나타냄 명시된 컨테이너가 먼저 생성되고 실행 
      - mysql 
    links: -> docker run 명령어의 --link 와 동일하다. 다른 서비스에 접근할 수 있도록 한다.
      - mysql:db
    command: apachectl -DFOREGROUND
  mysql:
    image: alicek106/composetest:mysql
    command: mysqld -> 컨테이너가 실행될 때 수행할 명령어를 설정 

만약 특정 서비스의 컨테이너만 생성하되 의존성이 없는 컨테이너를 생성하려면 

docker-compose up --no-deps web

이렇게 --no-deps 옵션을 사용하자.

 

외로

extends -> 다른 yaml 파일이나 현재 yaml 파일에서 서비스 송성을 상속받게 설정한다.  

사용법

상속 받을 docker yaml 파일

version : '3.0'
  services :
    web:
      extends :
        file : extend_compose.yml
        service : extend_web

 

상속 해줄 docker yaml 파일

version : '3.0'
  services :
    web:
      extend_web:
      image: ...
      port : ...

 

3) 네트워크 정의 

-driver : 도커 컴포즈는 생성된 컨테이너를 위해 기본적으로 브리지 타입의 네트워크를 생성한다. 이때 생성된 네트워크의 이름은 {프로젝트 이름}_default로 설정됨, 그러나 TAML 파일에서 driver 항목을 정의해 서비스의 컨테이너가 브리지 네트워크가 아닌 다른 네트워크를 사용하도록 설정할 수 있다. 

networds: 
  mynetwork:
    diver: overlay
    driver_opts:
      subnet : "255.255.255.0"
      IPAdress: "10.0.0.2"

-ipam : IPAM( IP Address Manager )를 우해 사용할 수 있는 옵션으로서 subnet, ip 범위 등을 설정할 수 있다. 이떄 driver에는 IPAM를 지원하는 드라이버의 이름이다. 

-external : YAML 파일을 통해 프로젝트를 생성할 때마다 네트워크를 생성하는 것이 아닌, 기존의 네트워크를 사용하도록 설정한다.

networks:
  alicek106_network:
    extenrnal : true

 

4) 볼륨의 정의

driver : 볼륨을 생성할 때 사용될 드라이버를 설정. 어떠한 설정도 하지 않으면 local로 설정되며 사용하는 드라이버에 따라 변경해야 함

volumes:
  driver: flocker
    driver_opts:
      opt: "1"
      opt2: 2

external :YAML 파일에서 volume, volumes-from 옵션 등을 사용하면 프로젝트마다 볼륨을 생성한다. 이떄 볼륨을 프로젝트를 생성할 때마다 매번 생성하지 않고 기존의 볼륨을 사용하도록 하는 명령어

volumes :
  myvolume :
    external : true

 

 

파일 검증

오타나 파일 포맷이 적절한지 검사하려면

docker-compose config 

명령어를 사용하자 

 

 

 

도커 컴포즈 네트워크 추가 설명 

docker-compose

up 생성

down 삭제 

scale 이 명령어로 생성되는 컨테이너 전부다 이 브리지 타입의 네트워크를 사용 이 때 서비스 이름으로 서브스 내의 컨테이너에 접근할 수 있다.

 

 

도커 스윔 모드와 함께 사용하기

YAML 버전 3부터 스윔 모드와 함께 사용이 가능하다. (스택은 스윔모드와 함께 사용되는 개념, 스택을 생성하면 YAML파일에 정의된 서비스가 스윔 모드의 클러스터에서 일괄적으로 생성됨)

즉 YAML 파일에 정의된 서비스가 스윔모드의 서비스로 변환된 것이다. 단 스택은 도커 컴포즈 명령어인 docker-compose가 아닌 docerk stack으로 제어해야 한다.

 

 

docker stack deploy -c docker-compose.yml  -> -c로 YAML 파일 지정, 마지막에 스택 이름 => 생성 
mystack docker stack ls -> 생성된 스택 확인 
docker service scale -> 컨테이너 수 조절

'Docker' 카테고리의 다른 글

Kubernetes 설치(쿠버네티스)  (0) 2021.01.25
Docker 스웜과 서비스  (0) 2021.01.20
Docker File  (0) 2021.01.04
Docker 이미지  (0) 2021.01.04
컨테이너 자원 할당 제한  (0) 2020.12.30