[Docker] 13. Docker Compose

Date:     Updated:

카테고리:

태그:

[Docker] 13. Docker Compose



🔔 Docker Compose 이란?

여러 컨테이너를 모아서 관리하기 위한 툴로, 「docker-compose.yml」라는 파일에 컨테이너의 구성 정보를 정의함으로써 동일 호스트상의 여러 컨테이너를 관리할 수 있다.

컨테이너의 구성 정보를 YAML 형식의 파일로 관리할 수 있으므로, 지속적 디플로이나 지속적 인티그레이션 프로세스에 있어서 자동 테스트를 할 때의 환경 구축에도 이용 가능하다.


🔔 Docker Compose 개요

Compose 정의 파일에는 관리하고 싶은 컨테이너의 서비스(services:), 네트워크(networks:), 볼륨(volumes:)을 정의한다.

또한 Compose 정의 파일은 버전에 따라 기술할 수 있는 항목이 다르며, Compose 정의 파일의 버전은 Docker Engine의 버전과 관계가 있다.

# 버전을 지정
version: "3.9"

#서비스 정의 
services:
    webserver:
        image: ubuntu
        ports: 
            - "80:80"
        networks:
            - webnet

    redis: 
        image: redis 
        networks:
            - webnet

#네트워크 정의
networks:
    webnet:

# 데이터 볼륨 정의
volumes:
    data-volume:

(1) 이미지 지정

컨테이너의 바탕이 되는 베이스 이미지를 지정

services:
    webserver:
        image: ubuntu
services:
    webserver:
        image: ubuntu:kinetic-20230217
  • webserver라는 이름의 컨테이너의 베이스 이미지를 centos: 7으로 지정

  • 이미지를 로컬 환경에 있으면 그것을 사용하고, 없으면 도커 허브에서 다운로드

  • 이미지의 태그를 지정하지 않은 경우 최신 버전(latest)이 다운로드


(2) 이미지 빌드

Dockerfile로 이미지를 그술하고 그것을 자동으로 빌드하여 베이스로 지정할 때 사용

services:
    webserver:
        build: .
services:
    webserver:
        build: 
            context: ./dir
            dockerfile: Dockerfile-alternate
            args:
                projetno: 1
                user: choi
  • build : Dockerfile의 경로

  • context : Dockerfile이 있는 디렉터리의 경로 또는 리포지토리의 URL을 지정

  • dockerfile : 해당 도커 파일의 이름을 지정

  • args: Dockerfile의 ARG 명령과 비슷한 명령으로, docker-compose 명령이 실행되는 구간에서 사용하는 변수

(a) 예시

【디렉터리 구성】

image

【파일 내용】
# docker-compose.yml
services:
    webserver:
        build: .
# Dockerfile
FROM ubuntu
【컨테이너 생성】
$ docker-compose up --build Building webserver
Step 1/1 FROM ubuntu
---> 747cb2d60bbe
Successfully built 747cb2d60bbe
Successfully tagged sample_webserver:latest
Starting sample_webserver_1
Attaching to sample_webserver_1


(3) 컨테이너 안에서 작동하는 명령 - command, entrypoint

Dockerfile의 명령과 같음, 베이스 이미지에 지정되어 있을 때는 그 명령을 덮어쓴다.

services:
    webserver:
        image: centos:7
        command: /bin/bash -c "yum update && yum install net-tools"
services:
    webserver:
        image: centos:7
        entrypoint: cat /etc/hosts
        # 또는
        entrypoint: 
            - /bin/cat
            - /etc/hosts


최신 버전 부터는 links를 작성하지 않아도, 서비스 이름으로 다른 컨테이너에 접근할 수 있다.


(5) 컨테이너 간 통신 - ports, expose

ports : 호스트 머신에 컨테이너를 공개하는 포트 지정

  • “호스트의 Port번호:컨테이너 Port번호”를 지정

  • 컨테이너의 포트 번호만 지정한 경우는 호스트 머신의 포트의 랜덤한 값으로 설정

services:
    webserver:
        image: httpd:latest
        ports:
            - "80"
            - "8000:8000"
            - "127.0.0.1:8001:8001"
            # 또는
            - target: 8080       ## 컨테이너 내부 포트
              published: 8080    ## 호스트OS에서 공개할 포트
              protocol: tcp      ## 포트 프로토콜
              mode: host         ## host각 노드에 호스트 포트를 게시하거나 ingress로드 밸런싱할 스웜 모드 포트에 사용

expose : 호스트OS에 포트를 공개하지 않고, 컨테이너만 포트를 공개, 호스트OS와 직접 연결되지 않고 링크등으로 연결된 컨테이너-컨테이너간의 통신만이 필요한 경우 등에 사용 됩니다.

services:
    webserver:
        image: httpd:latest
        expose:
            - "8000"


(5) 서비스의 의존관계 정의 - depends_on

web 컨테이너를 시작하기 전에 DB와 Redis 컨테이너를 시작하고 싶을 때 사용

  • 주의할 점은 depends_on은 컨테이너의 시작 순서만 제아할 뿐, 컨테이너상의 애플리케이션이 이용 가능해 질 때까지 기다리고 제어를 하지 않는다.
version: "3.9"
services:
  web:
    build: .
    depends_on:
      - db
      - redis
  redis:
    image: redis
  db:
    image: postgres


(6) 컨테이너 환경변수 지정 - environment, env_file

컨테이너 안의 환경변수를 지정할 때 environment, 파일로 읽어 들이 때 env_file

version: "3.9"
services:
  web:
    build: .
    environment:
        - RACK_ENV=devlop
        - SHOW=ture
    # 또는
    environment:
        RACK_ENV: devlop
        SHOW: ture
version: "3.9"
services:
  web:
    build: .
    env_file:
        - ./common.env
        - /apps/web.env


(7) 컨테이너 정보 설정 - container_name, labels

container_name : 컨테이너에 붙일 이름을 지정 (단, 고유해야 함)

container_name: my-web-container

labels : 이미지 구성이나 컨테이너, 볼륨, 네트워크간의 관계에 주석을 달거나 할 때 사용

labels:
  com.example.description: "Accounting webapp"
  com.example.department: "Finance"
  com.example.label-with-empty-value: ""

labels:
  - "com.example.description=Accounting webapp"
  - "com.example.department=Finance"
  - "com.example.label-with-empty-value"


(8) 컨테이너 데이터 관리 - volumes

컨테이너에 볼륨을 마운트할 때 volumes를 지정

  • 호스트에서 마운트할 경로를 지정하려면 “호스트의 디렉터리:컨테이너 디렉터리”
volumes:
    - /var/lib/mysql
    - cache/:/tmp/cache
# 읽기 전용 볼륨 지정
volumes:
    - ~/configs:/etc/configs/:ro
# 다른 컨테이너로부터 모든 볼륨을 마운트할 때는 volume_from에 컨테이너명을 지정한다
# 볼륨 마운트 지정
volumes_from:
    - log


DOCKER 카테고리 내 다른 글 보러가기

댓글 남기기