게시:
수정:

들어가며

Docker는 독립된 가상화 컨테이너(Container) 환경에서 애플리케이션을 실행할 수 있도록 자동화시켜주는 컨테이너 도구이다. 환경변수(Environments) 입력, 포트(Ports) 바인딩, 컨테이너 네트워크(Network) 매핑 등 다양한 옵션을 제공하지만 CLI로 제공되며 Dependence에 따라 명령어를 정확하게 입력해야 하는 까다로움이 있다.

Docker compose는 이와 같은 문제를 Configuration 파일 형태로 한 곳에서 관리할 수 있게 돕는 도구이다. Docker compose를 사용하면 다수의 컨테이너를 모아서 클러스터를 구성하여 서비스를 하는 경우 각각의 컨테이너를 따로 실행시킬 필요없이 한 번에 빌드하고 실행할 수 있다.

Docker flow diagram

Docker(dockerfile)의 문법

Docker 파일(dockerfile)은 Docker image를 만들기 위해서 사용되는 텍스트 기반 참조 스크립트 파일이다. 애플리케이션의 루트 디렉토리에 Dockerfile(파일 확장자 없음)이라는 파일을 생성한 뒤 명령어를 조합하여 만든다.

1
2
3
FROM ubuntu:20.04
RUN apt-get update
RUN apt-get install python3

Dockerfile을 다 만들었으면 해당 파일을 기반으로 docker build 명령어를 사용하여 새로운 이미지를 만들 수 있다. 다음은 Dockerfile에서 사용할 수 있는 주요 명령어이다.

  • FROM: 기본 이미지를 지정한다.
  • RUN: 쉘 스크립트 명령어 실행한다.
  • EXPOSE: 오픈되는 포트 정보로, 호스트와 연결할 포트 번호를 설정한다.
  • ENV: 환경변수를 설정한다. key=value 형식이다. RUN, CMD, ENTRYPOINT에서 사용할 수 있다.
  • ADD: 로컬의 파일을 이미지에 추가한다. 컨텍스트 디렉토리보다 상위 디렉토리는 포함시킬 수 없으며, 상대 경로만 사용할 수 있다. ADD [로컬 파일 경로] [이미지 파일 경로] 형식이다. 인터넷에 있는 url 경로를 로컬 경로로 사용할 수 있으며 압축된 파일은 압축이 해제되어 올라간다.
  • COPY: ADD와 동일한 기능을 한다. ADD와 달리 url 경로를 사용할 수 없으며 압축된 파일이라도 unzip 되지 않고 그대로 올라간다.
  • CMD: 컨테이너가 수행할 명령어. Dockerfile에서 한 번만 사용할 수 있다. 컨테이너 생성 시 실행파일을 지정하면 CMD는 무시된다. 보통 Dockerfile의 마지막에 위치한다. ['실행파일', '매개변수1', '매개변수2', ...] 형식이다.
  • ENTRYPOINT: CMD와 동일한 기능을 한다. CMD와 달리 컨테이너 생성 시 실행파일을 지정해도 무시되지 않는다. 단, --entrypoint 옵션을 추가한 경우에는 무시된다. ENTRYPOINTCMD가 모두 있으면 CMDENTRYPOINT의 매개변수로 취급된다.
  • VOLUME: 외부 마운트 포인트를 생성한다.
  • USER: RUN, CMD, ENTRYPOINT를 실행하는 특정 사용자(유저명 및 그룹명)를 지정한다.
  • WORKDIR: 작업 디렉토리를 설정한다. WORKDIR로 작업 디렉토리를 전환하면 RUN, CMD, ENTRYPOINT, ADD, COPY: 명령어가 해당 작업 디렉토리에서 실행된다.
  • ARGS: 환경변수를 설정한다. key=value 형식이다. ARGS로 설정한 환경변수는 ENV와 달리 빌드 시점에서만 사용할 수 있다.
  • LABEL: 작성자, 버전, 코멘트 등 이미지에 라벨을 추가할 수 있다. key=value 형식이다.
  • ONBUILD: 본 Dockerfile로 빌드한 이미지 베이스로 새로운 이미지 빌드 시 실행할 명령어를 설정한다.

Docker 명령어

컨테이너(Container)에 대한 명령어와 이미지(Docker Image)에 대한 명령어를 구분하였다.

Container 명령어

컨테이너(Container)란 격리된 Layered file system인 이미지(Docker Image)로 생성한 호스트의 모든 프로세스와는 다른 격리된 시스템 공간의 프로세스이다. 호스트에서 컨테이너를 생성하는 것은 호스트와 완전히 격리된 시스템 공간에서 애플리케이션을 실행하는 것과 같다고 할 수 있다.

쉽게 컨테이너란 격리된 하나의 프로세스이자, 실행되고 있는 이미지라고 생각하면 이해하기 편하다.

docker ps (컨테이너 목록보기)

실행(Running) 중인 컨테이너 목록을 표시한다. 컨테이너는 상태(Running 또는 Stopped)를 갖는다. -a 옵션을 추가하면 종료된(Stopped) 컨테이너도 목록에 표시한다.

$ docker ps [OPTIONS]

# Example
$ docker ps -a
result to enter command 'docker ps' in terminal.

docker run (컨테이너 가동)

사용할 이미지를 지정하여 생성 및 가동(Run)한다. 만약 사용할 이미지가 저장되어 있지 않다면 Docker Hub에서 pull 한 뒤 컨테이너를 생성하고 실행한다. 이미지를 한 번 Pull 하면 삭제하지 않는 이상 해당 이미지를 다시 Pull 하지 않고 반복해서 사용할 수 있다.

우분투 이미지를 가동시키고 바로 콘솔로 진입하려면 -it 옵션과 /bin/sh 명령어를 추가해야 한다.

$ docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

# Example 1
$ docker run --rm -it ubuntu:20.04 /bin/sh

# Example 2
$ docker run -d -p 3306:3306 \
    -e MYSQL_ALLOW_EMPTY_PASSWORD=true \
    --network=web-network \
    --name=mysql \
    -v /User/seungho/Development/project001/mysql:/var/lib/mysql \
    mysql:5.7

주요 옵션은 다음과 같다.

  • -d: 백그라운드 실행한다. (Detached mode, Daemon mode)
  • -p: 호스트와 컨테이너의 포트를 연결한다. -p hostPort:containerPort 형식으로 바인딩한다.
  • -v: 컨테이너의 디렉토리를 외부로 마운트한다. 컨테이너의 디렉토리가 마운트되면 바인딩된 호스트 경로에서도 데이터를 확인할 수 있으며 컨테이너를 종료해도 데이터가 호스트에 남아 유실되지 않는다. 형식은 포트 바인딩과 같음.
  • -e: 컨테이너 안에서 사용할 환경변수를 설정한다. key-value 형식(--e key=value)이다.
  • --name: 컨테이너 이름을 설정한다.
  • --rm: 해당 컨테이너 종료(Stop) 시 컨테이너를 자동으로 제거하도록 설정한다.
  • -it: 터미널 입력을 위한 옵션이다. ubuntu 컨테이너와 같이 터미널 입력이 필요한 경우 사용한다.
  • --network: 이미 생성된 Docker 네트워크와 바인딩할 때 사용한다.

docker stop (컨테이너 종료)

실행 중인 특정 컨테이너를 중지(Stop)시킨다. 컨테이너 ID 또는 NAME을 띄어쓰기로 구분하여 다수의 컨테이너를 선택적으로 중지시킬 수도 있다. 중지된 컨테이너는 docker ps 목록에 표시되지 않는다. 확인하려면 docker ps -a 명령어를 사용해야 한다.

$ docker stop [OPTIONS] [CONTAINER]

# Example
$ docker stop 797b347b6b3e

docker rm (컨테이너 삭제)

종료된 특정 컨테이너를 삭제(Remove)한다. 컨테이너 삭제 시 가상화된 컨테이너만 삭제될뿐 Docker 이미지는 삭제되지 않는다. 컨테이너 ID 또는 NAME을 띄어쓰기로 구분하여 다수의 컨테이너를 선택적으로 삭제할 수 있다.

실행 중인 컨테이너를 삭제하려고 하면 Running 상태인 컨테이너를 먼저 종료하거나 강제 삭제를 하라는 에러 메시지를 반환한다. 에러 메시지를 무시하고 강제 삭제하려면 --force 옵션을 추가한다.

$ docker rm [OPTIONS] CONTAINER [CONTAINER...]

# Example
$ docker rm 797b347b6b3e

docker exec (컨테이너 접속)

컨테이너가 백그라운드 모드(-d)로 실행 중인 상태에서, 또는 새로운 터미널을 열고 해당 명령어를 사용하면 가상화된 컨테이너 안으로 접속할 수 있다.

$ docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

# Example
$ docker exec -it mysql mysql

docker logs (컨테이너 로그보기)

컨테이너 안에서 가동되고 있는 애플리케이션의 로그를 표시한다. -f 옵션을 추가하면 로그를 계속 추적한다. headtail 옵션을 적절히 사용하여 필요한 부분(line)만 볼 수도 있다.

$ docker logs [OPTIONS] CONTAINER

# Example
$ docker logs -f 797b347b6b3e
result to enter command 'docker logs' in terminal.

docker newtork ls (컨테니어 네트워크 목록보기)

이미 생성된 도커 네트워크 목록을 볼 수 있다.

$ docker network ls [OPTIONS]
result to enter command 'docker network ls' in terminal.

docker network create (컨테이너 네트워크 생성)

컨테이너간 네트워크 이름으로 통신할 수 있는 가상의 네트워크를 새로 생성한다.

$ docker network create [OPTIONS] NETWORK

# Example
$ docker network create web-network

docker network connect (컨테이너 네트워크 연결)

이미 생성된 컨테이너에 이미 생성된 네트워크를 추가한다. 새로 컨테이너를 생성할 때에는 --network=NETWORK 옵션을 추가하여 네트워크를 연결할 수 있다.

$ docker network connect [OPTIONS] NETWORK CONTAINER

# Example
$ docker network connect web-network 7889de429a5b

docker network disconnect (컨테이너 네트워크 연결 해제)

특정 네트워크에 연결된 특정 컨테이너의 연결을 끊는다.

$ docker network disconnect [OPTIONS] NETWORK CONTAINER

# Example
$ docker network disconnect ex1_default 7889de429a5b

docker network inspect (네트워크 상세정보 보기)

특정 네트워크의 상세 정보를 표시한다. 띄어쓰기로 구분하여 다수의 네트워크에 대한 정보를 선택적으로 확인할 수 있다. 네트워크 상세정보에는 연결된 컨테이너의 정보가 포함되어 있다.

$ docker network inspect [OPTIONS] NETWORK [NETWORK...]

$ docker network inspect web-network
result to enter command 'docker network inspect' in terminal.

docker network prune (모든 미사용 네트워크 삭제)

사용중이지 않은 모든 네트워크를 삭제한다. 기본 Docker internal network는 삭제되지 않는다.

$ docker network prune [OPTIONS]
result to enter command 'docker network ls' in terminal.
‘ex1_default’는 사용되지 않는 네트워크이다.
result to enter command 'docker network ls' after entered 'docker network prune' in terminal.
‘docker network prune’로 네트워크를 정리하면 미사용 네트워크인 ‘ex1_default’가 삭제된다.

docker network rm (특정 네트워크 삭제)

특정 네트워크를 삭제한다.

$ docker network rm NETWORK [NETWORK...]

# Example
$ docker network rm ex1_default

Image 명령어

이미지(Docker image)는 직접 빌드(Dockerfile)하는 방법과 이미 만들어진 이미지를 git pull하듯 pull 받는 방법이 있다. 자신이 빌드한 Docker 이미지와 ubuntu, python, nginx, mysql, postgresql 등의 기존에 있는 이미지를 pull 받아 바인딩 및 서비스하는 방식은 대단히 보편적인 방식이다.

Docker 이미지의 소스 제공자는 Docker Hub이다. Docker Hub는 GitHub과 유사한 서비스이다. GitHub Repository에 pull이 가능하듯 push(Docker Hub ID 필요)하는 것도 가능하다.

docker images (이미지 목록보기)

로컬에 설치된 이미지(다운로드한 이미지 또는 자신이 빌드한 이미지) 목록을 표시한다. 이미지는 컨테이너와 달리 상태가 없기 때문에 별도로 -a 옵션을 추가할 필요가 없다.

$ docker images [OPTIONS] [REPOSITORY[:TAG]]

# Example
$ docker images -a
result to enter command 'docker images' in terminal.

docker build (신규 이미지 빌드)

Dockerfile을 이미지로 빌드한다. Dockerfile이 존재하는 경로에서 명령어를 실행해야 한다. 명령어 마지막에 위치한 .(Dot)은 Build context를 의미하며 필히 입력해야 한다.

$ docker build [OPTIONS] PATH | URL | -

# Example
$ docker build -t seungho/djangoproject:0.1.0 .

.dockerignore (빌드 제외 설정)

.gitignore와 같은 역할을 하는 설정 파일이다. .dockerignore에 지정된 패턴은 이미지를 빌드할 때 포함되지 않는다.디렉토리를 지정하면 하위 디렉토리 및 파일이 모두 ignore된다. .dockerignore에 민감한 정보나 불필요한 파일을 등록하여 빌드 속도를 향상 시킬 수 있다.

docker rmi (이미지 삭제)

로컬에 설치된 이미지를 삭제(Remove)한다. 컨테이너 ID 또는 NAME을 띄어쓰기로 구분하여 다수의 컨테이너를 선택적으로 삭제할 수 있다. 실행중인 컨테이너를 삭제하려고 시도하면 해당 이미지를 참조한 컨테이너가 있다는 에러 메시지를 반환한다. 에러 메시지를 무시하고 강제 삭제하려면 -f 옵션을 입력한다.

$ docker rmi [OPTIONS] IMAGE [IMAGE...]

# Example
$ docker rmi -f 797b347b6b3e bd9a9f733898

docker commit (Docker 컨테이너 변경 저장)

컨테이너 변경 사항에서 새 이미지를 만든다. 예를 들어 우분투 컨테이너에 python을 설치한 뒤 커밋하면 파이썬이 설치된 우분투 이미지를 생성할 수 있다.

$ docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

# Example
$ docker run -it --name pybuntu ubuntu:20.04 /bin/sh
$ apt-get update
$ apt-get install python3
$ exit
$ docker commit pybuntu ubuntu:python
result to enter command 'docker images' after entered 'docker commit pybuntu' in terminal.

docker search (Docker 허브 이미지 검색)

Docker Hub에서 이미지를 검색한다. 여기서 검색된 이미지를 pull하여 다운로드할 수 있다. Official 값은 공식 이미지(OK) 여부를 나타내며 Stars 값은 GitHub Repository의 Stars와 같은 의미이다.

$ docker search [OPTIONS] TERM

$ docker search ubuntu
result to enter command 'docker search mysql' in terminal.

docker pull (Docker 허브 이미지 다운로드)

Docker Hub에서 이미지를 pull 한다. 태그를 생략하면 가장 마지막 버전(latest)으로 pull 한다.

$ docker pull [OPTIONS] NAME[:TAG|@DIGEST]

$ docker pull ubuntu:20.04

docker push (Docker 허브 이미지 업로드)

Builded image 또는 Commit image Docker 허브로 push한다. Docker Hub 아이디가 필요하다.

$ docker push [OPTIONS] NAME[:TAG]

# Example
$ docker push myRepository/myImage:0.1.0

Docker Compose 문법

Docker compose는 서문에서 설명한 바와 같이 다중 컨테이너 애플리케이션을 정의하고 공유하는 데 도움이 되도록 개발된 도구이다. 다수의 컨테이너를 모아서 클러스터를 구성하는 서비스를 하는 경우 Docker compose를 사용하면 각각의 컨테이너를 따로 실행시킬 필요없이 단일 명령으로 한 번에 빌드하고 서비스할 수 있다.

Docker compose는 애플리케이션을 정의하는 하나의 YAML 파일(docker-compose.yml, ~.yaml)을 사용한다. 이 파일은 복잡・반복적인 Docker 커맨드를 Docker compose 문법으로 변환하여 만든 스크립트 참조 파일이다.

Docker compose 문법을 같은 의미를 갖는 Docker 커맨드 예시와 비교하여 살펴보겠다.

Docker compose를 따로 설치해야 하는가?
MacOS 및 Windows 사용자는 Docker Desktop 설치 시 함께 설치된다.
Linux 사용자는 별도로 설치해야 한다. 설치 방법은 링크에서 확인할 수 있다.

1. Node App Service

다음 코드 스니펫은 간소화된(alpine) node 컨테이너를 생성하면서 todo-app 네트워크와 연결하고 todos라는 이름을 갖는 MySQL 컨테이너와 연결하면서 컨테이너의 작업 디렉토리를 /app으로 전환하고 작업 디렉토리인 /app을 현재 경로에 매핑하면서 yarn install && yarn run dev 명령어를 실행하는 Docker 커맨드이다.

$ docker run -dp 3000:3000 \
  -w /app -v "$(pwd):/app" \
  --network todo-app \
  -e MYSQL_HOST=mysql \
  -e MYSQL_USER=root \
  -e MYSQL_PASSWORD=secret \
  -e MYSQL_DB=todos \
  node:12-alpine \
  sh -c "yarn install && yarn run dev"

위의 커맨드는 다음과 같은 스크립트를 갖는 docker-compose.yml로 바꿀 수 있다. Docker compose 문법은 key: value 형식으로 들여쓰기와 띄어쓰기에 엄격하다. 리스트는 -(Dash)로 나열하는 식으로 표현한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
version: "3.8"

services:
  app:
    image: node:12-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    restart: always
    depends_on
      - mysql
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos
  • version: Docker 엔진 버전이다.
  • services: 해당 구문 아래 컨테이너 서비스를 정의한다.
  • app: 컨테이너 서비스 이름이다. docker run --name app과 같다. 네트워트 연결시 Alias로 사용한다.
  • image: 기본 Docker 이미지이다. 태그를 생략하면 latest 버전을 가져온다.
  • command: 컨테이너가 수행할 명령어이다.
  • ports: 호스트 포트와 컨테이너의 포트의 매핑 정보이다. hostPort:containerPost 형식이다.
  • working_dir: 컨테이너의 작업 디렉토리를 설정한다.
  • restart: 컨테이너가 오류 등으로 종료되었을 때에 대비한 재시작에 대한 정책이다. (docker 커맨드에서는 누락됨.)
  • depends_on: 의존하고 있는 서비스를 나타낸다. 의존하고 있는 서비스가 먼저 실행되고 실행됨을 보장한다.
    • no: 자동으로 재시작하지 않는다. (Default)
    • always: 컨테이너가 중지되면 항상 다시 시작. 수동 중지시킨 경우에는 재개시켰을 때 자동 적용.
    • unless-stopped: always와 동일하다. 다만 수동으로 중지시킨 뒤 재개시켰을 때 적용되지 않는다.
    • on-failure[:max-retries]: 0이 아닌 종료 코드로 나타나는 오류로 인해 컨테이너가 종료되는 경우 컨테이너를 다시 시작한다. :max-retries 옵션을 사용하여 컨테니어 재시작 시도 횟수를 제한.
  • volume: 호스트 디렉토리와 컨테이너 디렉토리의 볼륨 매핑 정보이다. hostDir:containerDir 형식이다.
  • environment: 컨테이너의 사용할 환경변수이다. environmentKey: environmentName으로 작성한다. 환경변수에 따라 MySQL 컨테이너와 연결될 서비스임을 짐작할 수 있다.

직접 빌드한 이미지로 서비스 하려면?
image 대신 build를 사용하면 이미지를 지정하지 않고 직접 빌드하는 식으로 설정할 수 있다. 이러한 경우 build의 하위 항목으로 contextdockerfile이 포함되어야 한다. context는 이미지 빌드에 참조할 디렉토리를 의미하는데 .(dot)을 입력하면 현재 디렉토리를 가리키게 된다. dockerfile은 이미지 빌드를 위한 Docker파일의 파일 경로를 의미하며 상대 경로로 입력한다. (ex: ./compose/faskapi/dockerfile)

2. MySQL Service

다음 코드 스니펫은 MySQL 5.7 버전의 컨테이너를 생성하면서 todo-app 이름을 갖는 네트워크에 연결하고, 볼륨을 매핑하며, MySQL 데이터베이스의 환경변수를 정의한 Docker 커맨드이다.

$ docker run -d \
  --network todo-app --network-alias mysql \
  -v todo-mysql-data:/var/lib/mysql \
  -e MYSQL_ROOT_PASSWORD=secret \
  -e MYSQL_DATABASE=todos \
  mysql:5.7

위의 Docker 커맨드는 다음과 같은 docker-compose.yml로 정의할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
version: "3.8"

services:
  mysql:
    image: mysql:5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment: 
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:
  • 11번째 라인까지는 Exmaple 1과 같은 패턴으로 작성되어 있다.
  • volume: 볼륨 마운트 정의이다.

3. Node App Service + MySQL Service

앞선 2개의 예시를 병합하여 최종적으로 정의된 애플리케이션 스택은 다음과 같다. 이제 이 파일이 있거나 해당 Repository를 Clone한 사용자면 누구나 docker-compose up 명령어로 동일한 환경의 서비스를 시작할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
version: "3.8"

services:
  app:
    image: node:12-alpine
    command: sh -c "yarn install && yarn run dev"
    ports:
      - 3000:3000
    working_dir: /app
    volumes:
      - ./:/app
    restart: always
    environment:
      MYSQL_HOST: mysql
      MYSQL_USER: root
      MYSQL_PASSWORD: secret
      MYSQL_DB: todos

  mysql:
    image: mysql:5.7
    volumes:
      - todo-mysql-data:/var/lib/mysql
    environment: 
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: todos

volumes:
  todo-mysql-data:

네트워크 설정이 없는데 동작하는 이유
위의 예시 코드의 경우 네트워크를 설정하지 않았지만 정상 작동한다. 그 이유는 Docker compose가 애플리케이션 스택을 위한 네트워크를 자동으로 생성하기 때문이다.

Docker Compose 명령어

명령은 Docker compose 파일(docker-compose.yml)이 있는 경로에서 실행해야 한다.

docker-compose ps (컨테이너 목록보기)

Docker compose로 실행되고 있거나 중지된 컨테이너 목록을 표시한다. 일반 Docker 커맨드(docker run)로 실행된 컨테이너는 목록에 포함되지 않는다. 하지만 docker-compose up으로 실행된 컨테이너는 docker ps 목록에 포함된다.

-q 옵션을 추가하면 서비스 ID를 제외한 모든 정보가 생략된 목록을 표시한다.

$ docker-compose ps [SERVICE...] [OPTIONS]

# Example
$ docker-compose ps
result to enter command 'docker-compose ps' in terminal

Service 속성
Docker compose 명령어에서 주로 참조할 속성은 Service이다. 앞으로 소개할 명령어의 뒷부분에 [SERVICES...] 란에는 Service 속성값을 사용해야 한다. Name 속성값을 사용하면 에러 메시지를 반환한다. 참고로 Name은 Docker compose 파일내 서비스명에 현재 디렉토리명(Prefix)과 정수(Suffix)를 조합한 형식으로 네이밍된다.

docker-compose up (컨테이너 생성 및 실행)

서비스에 필요한 컨테이너를 생성・실행하고 서비스를 실행한다. 백그라운드 모드(-d) 옵션을 추가하지 않은 경우 콘솔에서 ctrl + c를 입력하면 서비스가 중단되면서 각 서비스 상태가 Running에서 Exited로 변경된다.

$ docker-compose up [SERVICE...] [OPTIONS]

# Example
$ docker-compsoe up -d

주요 옵션은 다음과 같다.

  • build: 이미지를 강제로 다시 빌드한다.
  • --force-recreate: 컨테이너를 다시 생성한다.
  • -d: 백그라운드 모드(detached mode, daemon mode)로 실행한다.

docker-compose run (컨테이너 추가 생성)

실행중인 서비스에 컨테이너를 추가 생성한다. 일반 Docker 커맨드와 마찬가지로 백그라운드 모드(-d), 환경변수(-e), 포트(-p), 볼륨 마운트(-v), 작업 디렉토리(-w), 라벨(-l)을 설정할 수 있다.

$ docker-compose run [options] [-v VOLUME...] [-p PORT...] [-e KEY=VAL...] [-l KEY=VALUE...] SERVICE [COMMAND] [ARGS...]

# Example
$ docker-compose run
result to enter command 'docker-compose ps -a' after entered 'docker run -d foobar_application' in terminal.
frontend 추가로 run하면 해당 서비스가 추가로 running된다.

docker-compose stop (컨테이너 중지)

실행중인 서비스를 중지시킨다. 중지시킬 서비스를 명시하지 않으면 실행중인 모든 서비스가 중지된다.

$ docker-compose stop [SERVICE...] [OPTIONS]

# Example
$ docker-compose stop frontend

docker-compose start (중지된 컨테이너 재개)

중지된(Exited) 컨테이너를 재시작시킨다. 재개시킬 서비스를 명시하지 않으면 모든 중지된 서비스가 재개된다.

$ docker-compose start [SERVICE...]

# Example
$ docker-compose start frontend

docker-compose exec (컨테이너 명령어 실행)

실행중이던 컨테이너 안에 접속하여 컨테이너 안에서 명령어를 실행시킨다. 백그라운드 실행 모드(-d), 환경변수(-e), 작업 디렉토리(-w) 옵션을 추가할 수 있다.

$ docker-compose exec [OPTIONS] [-e KEY=VAL...] [--] SERVICE COMMAND [ARGS...]

# Example
$ docker-compose exec nginx bash

docker-compose down (컨테이너 종료 및 삭제)

실행중인 서비스를 종료하는 동시에 컨테이너를 삭제한다.

$ docker-compose down [OPTIONS]

# Example
$ docker-compose down

docker-compose pull (필요한 이미지 다운로드)

서비스를 실행하는데 필요한 이미지를 pull 받는다. 대상 이미지를 명시하지 않으면 서비스에 필요한 모든 이미지를 pull한다. pull 대상은 .yml 파일 내 명시된 Docker 이미지이다.

$ docker-compose pull [SERVICE...]

# Example
$ docker-compose pull

docker-compose build (필요한 이미지 빌드)

서비스를 실행하는데 필요한 이미지를 빌드한다. 빌드 참조위치는 Docker compose 파일 내 context를 참조한다. 명령어 뒤에 이미지를 명시하지 않으면 필요한 모든 이미지를 빌드한다.

$ docker-compose build [SERVICE...]

# Example
$ docker-compose build --no-cache

docker-compose logs (컨테이너별 로그보기)

컨테이너별 로그를 표시한다. -f 옵션을 추가하면 로그를 계속 추적한다.

$ docker-compose logs [SERVICE...]

# Example
$ docker-compose logs -f

docker-compose top (프로세스 목록보기)

서비스 내에서 실행 중인 프로세스 목록을 표시한다. 컨테이너 목록과 각 컨테이너 안의 프로세스 모두 표시한다.

$ docker-compose top [SERVICES...]

# Example
$ docker-compsoe top
result to enter command 'docker-compose top' in terminal.

댓글남기기