Docker compose

CHAN LIM·2022년 7월 3일
0

Docker

목록 보기
6/8

Docker compose

다중 컨테이너 도커 애플리케이션을 정의하고 실행하기 위한 도구입니다.

  • Docker Compose를 이용하면 여러 개의 컨테이너(container)로 구성된 애플리케이션하나의 파일에 정의해놓고 한 번에 올리거나 내릴 수 있습니다.
  • Docker Compose는 특히 로컬 개발 환경이나 테스트 자동화 환경에서 간단한 컨테이너 오케스트레이션(Container Orchestration) 도구로 많이 사용되고 있는데요.

멀티 컨테이너 사이에 통신을 할 수 있게 합니다.

  • 서로 다른 컨테이너가 존재하고 컨테이너 사이에는 어떠한 설정이 없으면 접근할 수 없습니다.
  • 따라서, Node.js 앱에서 Redis 서버에 접근을 할 수 없습니다.

: Redis?

  • REmote Dictionary Server
  • 메모리 기반의 키-값 구조 데이터 관리 시스템이며, 모든 데이터를 메모리에 저장하고 조회할 수 있는 비관계형 데이터베이스 (NoSQL)입니다.
  • 메모리에 저장을 하기 때문에 MySQL과 같은 데이터베이스에 저장하는 것과 데이터를 불러올 때 훨씬 빠르게 처리할 수 있습니다.
  • 비록 메모리에 저장하지만 영속적으로도 보관할 수 있습니다.
  • 그래서 서버를 재부팅해도 데이터를 유지할 수 있는 장점이 있습니다.

Docker compose 작성

  • Docker Compose는 기본적으로 docker-compose.yml 파일을 설정 파일로 사용하는데 일반적으로 프로젝트의 최상위 디렉토리에 위치시킵니다.
  • 그렇게 해야 개발자가 프로젝트에 디렉토리에 들어오자 마자 손쉽게 애플리케이션을 올릴 수 있기 때문입니다.

docker-compose.yml

: YAML - ain't markup language
: 일반적으로 구성 파일 및 데이터가 저장되거나 전송되는 응용 프로그램에서 사용됩니다.
: 원래는 XML이나 json 포맷으로 많이 쓰였지만, 조금 더 사람이 읽기 쉬운 형태로 나타낸게 yaml입니다.


docker-compose.yml 파일은 대략적으로 다음과 같은 구조를 갖습니다.

version: "3.5"
services:
  web:
    # 웹 애플리케이션 설정
  db:
    # 데이터베이스 설정
networks:
  # 네트워크 설정
volumes:
  # 볼륨 설정
  • 맨 위에 Docker Compose 규격의 어떤 버전을 사용하는지 명시하고, 그 아래에 각각 서비스, 네트워크, 볼륨 영역에 대한 설정을 할 수 있습니다.
  • Docker Compose에서 서비스는 독립된 컨테이너에서 돌아가는 애플리케이션의 구성 요소라고 생각하면 됩니다.
  • 가장 먼저 프로젝트에서 개발하고 있는 애플리케이션 자체가 서비스가 될 것이고, 그 밖에 해당 애플리케이션이 의존하는 데이터베이스나 캐시 등도 서비스가 될 수 있습니다.
  • 쉽게 말해, 메인 애플리케이션 뿐만 아니라 정상적으로 구동되기 위해서 필요한 기반 시스템까지 Docker Compose로 설정한다고 보시면 됩니다.
  • 그렇게 때문에 로컬에 별도로 데이터베이스를 셋업하는 등의 추가 작업이 필요없이 바로 Docker Compose 커맨드 하나로 애플리케이션을 올릴 수 있는 것이지요.

build

  • build 항목은 해당 서비스의 이미지를 빌드하기 위한 Dockerfile이 위치하는 경로를 지정하기 위해 사용됩니다.

예를 들어, docker-compose.yml 파일과 동일한 디렉토리에 위치한 Dockerfile을 사용해서 web 서비스의 이미지를 빌드하려면 다음과 같이 설정합니다.

services:
  web:
    build: .

Dockerfile이 아닌 다른 이름의 파일로 빌드를 하고 싶거나, 빌드 인자를 넘겨야 하는 경우에는 다음과 같이 하위 항목을 사용해서 좀 더 구체적으로 설정을 해줄 수 있습니다.

services:
  web:
    build:
      context: ./app
      dockerfile: Dockerfile-dev
      args:
        env: "development"

image

  • 프로젝트에서 직접 개발하지 않는 데이터베이스나 캐시와 같은 경우에는 이미지를 직접 빌드하는 대신에 이미지 저장소(repository)로 부터 이미지를 내려받아서 사용하는 것이 일반적입니다.

build 항목은 이미지 저장소로 부터 내려받을 이미지의 이름과 태그를 명시하는데 사용됩니다.

services:
  db:
    image: postgres:13
  cache:
    image: redis

ports

  • ports 항목은 외부로 노출시킬 포트의 맵핑을 명시합니다.
  • 바인드(bind)가 필요한 호스트 외부 포트와 컨테이너 내부 포트를 지정해주면 됩니다.
services:
  web:
    ports:
      - "8000:8000"
  db:
    ports:
      - "5432:5432"

volumes

  • volumes 항목은 볼륨 설정을 위해 쓰입니다.
  • 마운트(mount)가 필요한 호스트의 경로와 컨테이너의 경로를 명시해주면 됩니다.
services:
  web:
    volumes:
      - .:/web

depends_on

  • depends_on 항목은 서비스 간 의존 관계를 지정하기 위해서 사용됩니다.

예를 들어, 웹 애플리케이션이 올라오기 전에 데이터베이스가 먼저 올라와야 한다면 다음과 같이 설정합니다.

services:
  web:
    depends_on:
      - db

command

  • command 항목은 해당 서비스가 올라올 때 DockerfileCMD 명령문을 무시하고 실행할 명령어를 설정하기 위해서 사용됩니다.
services:
  web:
    command: node .

environment

  • environment 항목은 환경 변수를 설정하기 위해서 사용됩니다.
environment:
  - POSTGRES_USER=postgres
  - POSTGRES_PASSWORD=postgres

EX).

version: "3"
services:
  redis-server:
    image: "redis"
  node-app:
    build: .
    ports:
     - "5000:8080"
  • version : 도커 컴포즈의 버전
  • services : 이곳에 실행하려는 컨테이너들을 정의
  • redis-server : 컨테이너 이름
  • image : 컨테이너에서 사용하는 이미지
  • node-app : 컨테이너 이름
  • build : 현재 디렉토리에 있는 Dockerfile 사용
  • ports : 포트 맵핑 - 로컬포트 : 컨테이너 포트

Docker Compose command

up

  • docker-compose up 커맨드는 아마도 Docker Compose에서 가장 자주 사용되는 커맨드입니다.

  • Docker Compose에 정의되어 있는 모든 서비스 컨테이너를 한 번에 생성하고 실행하기 위해서 사용합니다.

  • 보통 -d 옵션을 사용하여 백그라운드에서 컨테이너를 띄우는 경우가 많습니다.

>>> docker-compose up -d
Creating network "django-app_default" with the default driver
Creating django-app_db_1 ... done
Creating django-app_web_1 ... done
>>>
  • -d 옵션을 사용하지 않으면 현재 터미널이 컨테이너의 로그가 출력되고 Ctrl + C를 눌러서 탈출하는 순간 컨테이너가 모두 정지되기 때문입니다.

-d

>>> docker-compose up -d
  • detached 모드로서 앱을 백그라운드에서 실행합니다.
  • 앱에서 나오는 output을 표출하지 않습니다.

docker-compose up VS docker-compose up --build

  • docker-compose up : 이미지가 없을 때 이미지를 빌드하고 컨테이너 시작합니다.
  • docker-compose up --build : 이미지가 있든 없든 이미지를 빌드하고 컨테이너를 시작합니다.

down

  • docker-compose down 커맨드는 docker-compose up 커맨드와 정반대의 동작을 합니다.
  • Docker Compose에 정의되어 있는 모든 서비스 컨테이너를 한 번에 정지시키고 삭제합니다.
>>> docker-compose down
Stopping django-app_web_1 ... done
Stopping django-app_db_1  ... done
Removing django-app_web_1 ... done
Removing django-app_db_1  ... done
Removing network django-app_default

-f

  • Docker Compose는 기본적으로 커맨드가 실행하는 디렉토리에 있는 docker-compose.yml 또는 docker-compose.yaml를 설정 파일로 사용합니다.
  • 다른 이름이나 경로의 파일을 Docker Compose 설정 파일로 사용하고 싶다면 -f 옵션으로 명시를 해줍니다.
>>> docker-compose -f docker-compose-local.yml up

>>> docker-compose -f docker-compose.yml -f docker-compose-test.yml up

start

  • docker-compose start 커맨드는 내려가 있는 있는 특정 서비스 컨테이너를 올리기 위해서 사용합니다.
  • 대부분의 경우에는 docker-compose up 커맨드를 사용해도 내려간 서비스를 알아서 올려주므로 무방합니다.
>>> docker-compose start web
Starting web ... done

stop

  • docker-compose stop 커맨드는 docker-compose start 커맨드와 정반대의 동작을 합니다.
  • 돌아기고 있는 특정 서비스 컨테이너를 정지시키기 위해서 사용합니다.
>>> docker-compose stop web
Stopping django-app_web_1 ... done

ps

  • docker-compose ps 커맨드는 Docker Compose에 정의되어 있는 모든 서비스 컨테이너 목록을 조회할 때 사용합니다.
>>> docker-compose ps
      Name                    Command               State           Ports
----------------------------------------------------------------------------------
django-app_db_1    docker-entrypoint.sh postgres    Up      5432/tcp
django-app_web_1   python manage.py runserver ...   Up      0.0.0.0:8000->8000/tcp

logs

  • docker-compose logs 커맨드는 서비스 컨테이너의 로그를 확인하고 싶을 때 사용하며, 보통 -f 옵션을 붙여서 실시간 로그를 확인합니다.
>>> docker-compose logs -f web
Attaching to django-app_web_1
web_1  | Watching for file changes with StatReloader
web_1  | Performing system checks...
web_1  |
web_1  | System check identified no issues (0 silenced).
web_1  |
web_1  | May 30, 2020 - 22:16:29
web_1  | Django version 3.0.6, using settings 'our_project.settings'
web_1  | Starting development server at http://0:8000/
web_1  | Quit the server with CONTROL-C.

exec

  • docker-compose exec 커맨드는 실행 중인 서비스 컨테이너를 대상으로 어떤 명령어를 날릴 때 사용합니다.
>>> docker-compose exec db psql postgres postgres
psql (12.2 (Debian 12.2-2.pgdg100+1))
Type "help" for help.

postgres=#

run

  • docker-compose run 커맨드는 서비스 컨테이너의 특정 명령어를 일회성으로 실행할 때 사용합니다.
>>> docker-compose run web env
PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=10757eb6642e
TERM=xterm
LANG=C.UTF-8
GPG_KEY=E3FF2839C048B25C084DEBE9B26995E310250568
PYTHON_VERSION=3.8.2
PYTHON_PIP_VERSION=20.1
PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/1fe530e9e3d800be94e04f6428460fc4fb94f5a9/get-pip.py
PYTHON_GET_PIP_SHA256=ce486cddac44e99496a702aa5c06c5028414ef48fdfd5242cd2fe559b13d4348
PYTHONUNBUFFERED=1
HOME=/root

config

  • docker-compose config 커맨드는 Docker Compose 설정을 확인할 때 사용합니다. -f 옵션으로 여러 개의 설정 파일을 사용할 때, 최종적으로 어떻게 설정이 적용되는지 확인해볼 때 유용합니다.
>>> docker-compose config
services:
  db:
    environment:
      POSTGRES_PASSWORD: postgres
      POSTGRES_USER: postgres
    image: postgres
  web:
    build:
      context: /Users/dale/temp/django-app
    command: python manage.py runserver 0:8000
    depends_on:
    - db
    ports:
    - 8000:8000/tcp
    volumes:
    - /Users/dale/temp/django-app:/web:rw
version: '3.0'

Reference

Docker Official reference
DaleSeo

profile
클라우드, 데이터, DevOps 엔지니어 지향 || 글보단 사진 지향

0개의 댓글