본문 바로가기

IT 인프라/DevOps

나만의 Docker Compose Cheat Sheet

반응형

Docker Compose 구성 파일 (docker-compose.yml)

일반적으로 어플리케이션은 여러 컴포넌트(웹 서버, 어플리케이션 서버, 캐시, DB 등)와 함께 구동된다.
또한 한 어플리케이션도 다수의 서비스로 분리하고, 이것들이 모여 하나의 어플리케이션으로 역할을 하기도 한다.
각각의 구성요소를 컨테이너로 만들어 개별로 운영하는 것은 매우 번거로울 것 이다.

Docker Compose를 이용하면 여러 컨테이너를 일괄 관리하고, 설정하고, 의존성을 관리할 수 있다.

Compose 정의 파일은 사용할 Docker Engine에 맞는 Compose File Format Version을 지정해야 한다.
호환되는 버전은 https://docs.docker.com/compose/compose-file/ 에서 찾을 수 있다.

# 버전 지정
version <사용할 Docker Engine에 알맞은 버전 선택>


# 서비스 정의
services:
  <서비스 이름>:
    image: <사용할 이미지 이름>:<이미지 태그>
    build: <Dockerfile이 존재하는 경로>
    command:
      - <명령어1>
      - <명령어2>
      - ...
    entrypoint:
      - <명령어1>
      - <명령어2>
      - ...
    links:
      - <서비스 이름>
      - <서비스 이름>:<앨리어스명>
      - ...
    depends_on:
      - <서비스 이름>
      - ...
    ports:
      - "<컨테이너의 포트 번호>"
      - "<호스트 머신의 포트 번호>:<컨테이너의 포트 번호>"
      - ...
    expose:
      - "<링크로 연결하는 컨테이너에만 공개할 포트 번호>"
      - ...
    environment:
      - <key>: <value>
      - ...
    env_file:
      - <환경변수를 정의한 파일 이름>
      - ...
    container_name: <커스텀 컨테이너 이름>
    labels:
      - "<key>=<value>"
      - ...
    volumes:
      - <마운트 할 데릭토리 경로>
      - <호스트의 디렉토리 경로>:<컨테이너의 디렉토리 경로>
      - <호스트의 디렉토리 경로>:<컨테이너의 디렉토리 경로>:ro
      - ...
    networks:
      - <네트워크 이름>
      - ...


# 네트워크 정의
networks:
  <네트워크 이름>:

# 데이터 볼륨 정의
volumes:
  <볼륨 이름>:

위에서 의미가 애매모호하게 보이는 것들만 따로 정리한다.

  • build
    • Dockerfile이 존재하는 경로를 지정한다. (절대경로 가능)
    • docker-compose 명령으로 실행하면 지정한 Dockerfile이 자동으로 빌드되고, 생성된 컨테이너가 실행된다.
    • Dockerfile 이름이 다르다면 다음과 같이 지정할 수 있다.

          build:
              context: <Dockerfile이 존재하는 경로>
              dockerfile: <Dockerfile 이름>
              args:
                  <key1>: <value1>
                  <key2>: <value2>
  • command
    • 컨테이너 안에서 작동하는 명령 설정
  • entrypoint
    • entrypoint를 덮어쓴다.
  • links
    • 다른 컨테이너로의 연결이 필요할 때 사용
  • ports / expose
    • ports는 호스트 머신에 공개할 포트 번호를 지정한다.
    • expose는 links 기능으로 연결할 컨테이너들에게만 공개할 포트 번호를 지정한다.
  • depends_on
    • depends_on은 컨테이너 시작 순서만 제어한다.
      즉, 컨테이너 시작 후 내부에서 애플리케이션이 실행이 완료되는 시점까지 제어하는 것은 아니다.
    • 따라서 의존이 있는 어플리케이션 간의 제어는 직접 해야 한다.

더 자세한 사용법은 아래의 링크를 참고한다.

 

Compose file version 3 reference

Reference and guidelines These topics describe version 3 of the Compose file format. This is the newest version. Compose and Docker compatibility matrix There are several versions of the Compose...

docs.docker.com

Docker Compose 관리

생성 및 시작

###
# 컨테이너 생성과 시작을 한 번에
###
$ docker-compose up [서비스명...]

###
# 컨테이너 생성 후 시작
###
$ docker-compose up --no-start [서비스명...]
$ docker-compose start [서비스명...]

###
# 컨테이너 재시작
###
$ docker-compose restart [서비스명...]

종료 및 삭제

###
# 컨테이너 종료와 삭제를 한 번에
###
$ docker-compose down 

###
# 컨테이너 종료 후 삭제
###
$ docker-compose stop [서비스명...]
$ docker-compose rm [서비스명...]

###
# 컨테이너 강제 정지
#   - SIGHUP : 프로그램 재시작
#   - SIGINT : 키보드로 인터럽트 (ctrl+c 로 송신 가능)
#   - SIGQUIT : 키보드에 의한 중지. (ctrl+\ 로 송신 가능)
#   - SIGTERM : 프로세스 정상 종료
#   - SIGKILL : 프로세스 강제 종료 (-s 옵션을 넣지 않으면 기본값)
#   - SIGTOP : 프로세스 일시 정지
###
$ docker-compose kill -s <시그널>

가동 중인 컨테이너 확인

$ docker-compose ps

실행 중인 프로세스 확인

$ docker-compose top

외부에 바인딩 된 포트 확인

$ docker-compose port

로그 확인

$ docker-compose logs [서비스명...]

컨테이너 설정 확인

$ docker-compose config

컨테이너에서 명령 실행

$ docker-compose run [서비스명] 명령어

 

더 자세한 Docker Compose 명령어는 아래의 링크를 참고한다.

 

Compose command-line reference

The following pages describe the usage information for the docker-compose subcommands. You can also see this information by running docker-compose [SUBCOMMAND] --help from the command line. docker-compose build bundle config...

docs.docker.com

 

반응형