[Docker / Kubernetes] 9. 도커 컴포즈

서준교·2021년 9월 20일
0

Docker / Kubernetes

목록 보기
11/15
post-thumbnail

👉 이 게시글은 도커 / 쿠버네티스 온라인 부트캠프 with 카카오엔터프라이즈 강의를 바탕으로 작성되었습니다.

1. Docker Compose

도커 컴포즈는 하나의 설정파일로 여러 컨테이너를 운용하게 할 수 있게 해주는 도커 컴포넌트 중 하나이다. 여러 개의 컨테이너를 정의하고 실행하는 역할을 하며, 설정 파일인 yaml을 기반으로 동작한다.

1) Docker Compose 설치

  • Docker Compose 다운로드
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  • 실행 권한 부여
sudo chmod +x /usr/local/bin/docker-compose
  • 버전 확인
docker-compose --version

다음과 같이 버전이 정상적으로 출력되면 설치가 완료된 것이다.

2) docker-compose.yml

YAML 파일은 도커 컴포즈에 관한 설정을 담고 있다. Yet Another Markup Language에서 YAML Ain't Markup Language로 의미가 변화하였다. json이나 xml과 같이 시스템간 데이터 교환을 위해 만들어졌다. yaml 파일은 다음과 같은 특징을 가지고 있다.

  • 확장자로 *.yml, *.yaml의 형식을 갖고 있다.
  • key / value 구조로 구성된다.
  • 대소문자를 구분한다.
  • 콜론(:) 뒤에는 한 칸을 떼고 쓴다.
  • 대시(-)로 복수의 값을 나열한다.
  • 주석 표기는 해시(#)를 이용한다.

Docker Compose를 이용하기 위해 다음 예제를 docker-compose.yml 로 사용해보자. 해당 파일을 통해 설치형 클라우드인 Nextcloud와 관계형 DB인 postgresql 컨테이너를 함께 구성할 수 있다.

$ nano docker-compose.yml
version: "3.9"
services:
  db:
    image: postgres:alpine
    environment:
      - POSTGRES_PASSWORD=nextcloud
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=nextcloud
    restart: always
    volumes:
      - db_data:/var/lib/postgresql/data


  nc:
    image: nextcloud:apache
    environment:
      - POSTGRES_HOST=db
      - POSTGRES_PASSWORD=nextcloud
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=nextcloud
    ports:
      - "80:80"
    restart: always
    volumes:
      - nc_data:/var/www/html
    depends_on:
      - db
volumes:
  nc_data:
  db_data:  

해당 파일 경로에서 docker-compose up 명령을 수행하면, 다음과 같이 컨테이너가 구동된다.

$ sudo docker-compose up

가상머신 또는 서버의 IP주소로 웹브라우저에 접속하면 다음과 같이 Nextcloud의 관리자 계정을 생성하는 창이 나온다. 아이디와 비밀번호를 입력하고 설치 완료버튼을 클릭하자.
계정 생성이 완료되었으면 다음과 같이 대시보드가 나오게 되는데, 이제 해당 컨테이너를 구글 드라이버나 네이버 클라우드처럼 개인적으로 사용할 수 있다.

3) Docker Compose 명령어

Docker Compose에서 사용되는 명령은 기존에 사용하던 Docker 명령어와 유사하나, 기능적으로 차이가 있는 부분이 있기 때문에 혼동하지 않도록 주의해야 한다.
명령어는 기본적으로 docker-compose.yml 파일이 위치한 경로에서 실행한다.

  • up - 멀티 컨테이너 생성 및 실행
$ sudo docker-compose up

yaml파일에 정의된 여러 개의 컨테이너를 구동한다. 컨테이너의 이름은 별도로 생성하지 않으면 <yaml 파일이 위치한 디렉토리명>_<서비스명>_<번호>의 형태로 정의된다.

옵션기능
-d, --detach컨테이너를 백그라운드에서 실행한다.
--build컨테이너를 생성하기 전에 이미지를 빌드한다.
--no-build실행 대상 이미지가 존재하지 않더라도 빌드하지 않는다.
--abort-on-container-exit여러 컨테이너들 중 하나라도 종료되면 모두 종료된다. (--detach와 함께 사용할 수 없음)
  • ps - 컨테이너 조회
$ sudo docker-compose ps

docker ps 혹은 docker container ls를 사용해도 실행중인 컨테이너를 조회할 수 있으나, docker-compose ps를 통해 조회했을 때와 출력 양식에서 약간의 차이가 있다.

옵션기능
-q, --quiet컨테이너 ID만 출력한다.
-services정의된 서비스명을 출력한다.
-a, --all종료된 컨테이너를 포함한 모든 컨테이너를 출력한다.

  • run - 컨테이너 내부에서 명령 실행
$ sudo docker-compose run <서비스명> <실행 대상 명령>

4) yaml 작성 방법

  • version
    가장 먼저 Docker Compose 파일 최상단에서 버전을 정의해야 한다. 각 버전별로 명령어 혹은 표기법이 다르기 때문에 정상적으로 작동하지 않는 경우에는 버전을 체크해보아야 한다. 또한, 설치된 도커 엔진과의 호환성도 반드시 확인하여야 한다.
  • services
services:
  db:
    ...
  nc:
    ...

services는 컨테이너에서 실행할 서비스를 정의한다.

  • image
services:
  db:
    image: postgres:alpine
    ...
  nc:
    image: nextcloud:apache
    ...
  • environment
    컨테이너 내부에서 사용할 환경변수를 의미한다. 각각의 컨테이너에 적용할 수 있다.
services:
  db:
    ...
  nc:
    environment:
      - POSTGRES_HOST=db
      - POSTGRES_PASSWORD=nextcloud
      - POSTGRES_DB=nextcloud
      - POSTGRES_USER=nextcloud
    ...
  • restart
    컨테이너를 어떤 상황에서 다시 시작할지를 결정하는 요소이다. default값은 no이며, 상황에 따라 다른 값을 옵션으로 줄 수 있다.

    옵션기능
    always컨테이너가 중지된 경우 무조건 다시 실행한다.
    on-failure구동이 실패한 경우 다시 실행한다.
    unless-stopped사용자가 중지시키는 경우를 제외한 모든 경우에 다시 시작한다.
  • volumes
    컨테이너와 함께 삭제되면 안되는 데이터를 호스트에 연동하여 저장하도록 한다.

  • ports
    컨테이너와 호스트를 연결할 포트를 설정한다. 다만 주의할 점은 yaml 파일에서는 xx:yy 형식의 입력을 시간으로 인식하기 때문에 따옴표를 붙여 "xx:yy" 형식으로 정의하여야 한다.

    services:
      db:
        ...
      nc:
        ports:
        - "80:80"
  • expose
    도커 파일에서는 단순히 공개할 포트를 명시하는 역할이었다면, yaml 파일에서는 호스트에서의 접근은 불가능하지만 yaml 파일에 정의된 컨테이너에서는 접근이 가능하게 한다. expose로 지정된 포트를 통해 통신이 가능하지만, 호스트 OS에서의 접근은 불가능하고 동일한 네트워크 대역에 위치한 컨테이너와의 통신만 가능하다.
    services:
      db:
            ...
        expose:
          - 5432
            ...
      nc:
            ...
profile
매일 성장하는 개발자가 되고 싶습니다. 😊

0개의 댓글