Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
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
29 30 31
Archives
Today
Total
관리 메뉴

nomad-programmer

[DevOps/Docker] Docker Compose가 제공하는 운용 명령들 본문

DevOps/Docker

[DevOps/Docker] Docker Compose가 제공하는 운용 명령들

scii 2020. 12. 5. 21:22

Docker Compose의 버전 확인

Docker Compose는 Docker for Mac 또는 Docker for Windows에 미리 설치되어 있다. Linux는 아래의 링크를 통해 설치할 수 있다.

docs.docker.com/compose/install/

 

Install Docker Compose

 

docs.docker.com

// Docker Compose 버전 확인

$ docker-compose --version

compose 정의 파일의 지정

현재 디렉토리 안에 docker-compose.yml 파일이 없는 상태에서 docker-compose up 명령을 실행하면 다음과 같은 에러를 확인할 수 있다.

$ docker-compose up
ERROR: 
        Can't find a suitable configuration file in this directory or any
        parent. Are you in the right directory?

        Supported filenames: docker-compose.yml, docker-compose.yaml

docker-compose에서 지원하는 정의 파일의 이름은 다음 중 하나이다. 

  • docker-compose.yml
  • docker-compose.yaml
이 파일명 이외의 경우는 명령의 -f 옵션을 사용하여 정의 파일명을 지정할 필요가 있다.

Docker Compose의 기본 명령

docker-compose 명령에는 몇 가지 서브 명령이 있다. 주요 서브 명령은 다음과 같다.

서브 명령 설명
up 컨테이너 생성/시작
ps 컨테이너 목록 표시
logs 컨테이너 로그 출력
run 컨테이너 실행
start 컨테이너 시작
stop 컨테이너 정지
restart 컨테이너 재시작
pause 컨테이너 일시 정지
unpause 컨테이너 재개
port 공개 포트 번호 표시
config 구성 확인
kill 실행 중인 컨테이너 강제 정지
rm 컨테이너 삭제
down 리소스 삭제

docker-compose 명령은 docker-compose.yml 을 저장한 디렉토리에서 실행된다. 만일 현재 디렉토리 이외의 장소에 docker-compose.yml 을 놓아 둔 경우는 -f 옵션으로 파일 경로를 지정해야 한다.

// docker-compose.yml 파일을 바탕으로 컨테이너 생성/시작

$ docker-compose -f ./sample/docker-compose.yml up

서브 명령 다음에 컨테이너명을 지정하면 해당 컨테이너만을 조작할 수 있다. 예를 들어 webserver라는 이름의 컨테이너만 정지시키고 싶을 때는 다음의 명령을 실행한다.

// 특정 컨테이너 조작

$ docker-compose stop webserver

여러 컨테이너 생성 (up)

작성한 docker-compose.yml 을 바탕으로 여러 개의 컨테이너를 생성하여 시작할 때는 docker-compose up 명령을 사용한다.

$ docker-compose up [옵션] [서비스명 .]

지정할 수 있는 주요 옵션

옵션 설명
-d 호스트 머신에서 백그라운드에서 실행한다.
--no-deps 링크 서비스를 시작하지 않는다.
--build 이미지를 빌드한다. (또는 Dockerfile 파일을 수정했을 경우 이 옵션 적용)
--no-build 이미지를 빌드하지 않는다.
-t, --timeout 컨테이너의 타임아웃을 초로 지정한다. (기본 10초)
--scale SERVICE=서비스 수 서비스 수를 지정한다.
--force-recreate docker-compose.yml 파일을 수정했다면 이 옵션을 적용한다. (컨테이너를 지우고 새로 만듦)

다음과 같이 docker-compose.yml 을 작성한다. 이것은 Nginx가 베이스 이미지인 serverA와 Redis가 베이스 이미지인 serverB, 이 두개의 컨테이너로 구성되어 있다.

// docker-compose.yml

version: '3.3'

services:
  server_a:
    image: nginx
    
  server_b:
    image: redis

이 docker-compose.yml에 정의된 2개의 컨테이너를 시작하려면 다음의 명령을 실행한다. 컨테이너를 정지시킬 때는 Ctrl + c 를 누른다.

// 여러 컨테이너의 일괄 생성 및 시작

$ docker-compose up

컨테이너를 백그라운드에서 실행시킬 때는 -d 옵션을 지정한다. -d 옵션으로 시작하면 프롬프트 화면으로 돌아간다.

// 여러 컨테이너를 백그라운드로 시작

$ docker-compose up -d

컨테이너 시작 시에 Dockerfile을 빌드하고 싶을 때는 --build 옵션을 지정한다.

// docker 이미지 빌드

$ docker-compose up --build

컨테이너를 생성할 개수를 지정할 때는 docker-compose up 명령에서 --scale 옵션을 사용한다.

$ docker-compose up --scale [서비스명=수]

예를 들어 docker-compose.yml 에 server_a와 server_b라는 2개의 정의가 있고, server_a의 컨테이너를 10개, server_b의 컨테이너를 20개 시작시키고 싶을 때는 다음의 명령을 실행한다.

// 컨테이너 개수 지정

$ docker-compose up --scale= server_a=10 --scale server_b=20

여러 컨테이너 확인 (ps / logs)

docker-compose 에서는 여러 개의 컨테이너가 연결되어 작동한다. 이러한 컨테이너들의 목록을 표시할 때는 docker-compose ps 명령을 사용한다.

// 여러 컨테이너의 상태 확인

$ docker-compose ps

명령을 실행하면 시작되어 있는 컨테이너의 이름, 실행되고 있는 명령, 상태, 포트를 확인할 수 있다. 또한 다음과 같이 -q 옵션을 지정하면 컨테이너 ID만 표시된다.

// 컨테이너 ID 확인

$ docker-compose ps -q

또한, docker-compose 를 사용하여 시작한 경우도 보통의 Docker 명령을 사용할 수 있다. 다음은 docker container ls 명령을 사용하여 컨테이너의 상태를 확인하는 예이다.

// 도커 명령을 사용한 컨테이너 확인

$ docker container ls

컨테이너의 로그를 확인하려면 docker-compose logs 명령을 사용한다.

// 로그 확인

$ docker-compose logs

컨테이너에서 명령 실행 (run)

docker-compose로 시작한 컨테이너에서 임의의 명령을 실행하고 싶을 때는 docker-compose run 명령을 사용한다.

다음의 명령은 docker-compose up 명령을 사용하여 시작한 server_a 라는 이름의 컨테이너에서 /bin/bash를 실행하는 예이다.

// 컨테이너에서 명령 실행

$ docker-compose run server_a /bin/bash

여러 컨테이너 시작 / 정지 / 재시작 (start / stop / restart)

docker-compose를 사용하면 여러 개의 서비스를 일괄적으로 시작/일시 정지/정지/재시작을 할 수 있다. 각각의 명령은 다음과 같다.

// 컨테이너 일괄 시작/정지/재시작

$ docker-compose start

$ docker-compose stop

$ docker-compose restart

특정 컨테이너만을 조작하고 싶을 때는 명령의 인수에 컨테이너명을 지정한다. 예를 들어 server_a 라는 이름의 서비스만을 재시작할 때는 다음의 명령을 실행한다.

// 특정 컨테이너 재시작

$ docker-compose restart server_a

여러 컨테이너 일시 정지/재개 (pause/unpause)

docker-compose를 사용하면 여러 개의 서비스를 일괄적으로 일시 정지/재개할 수 있다. 각각의 명령은 다음과 같다.

// 컨테이너 일시 정지/재개

$ docker-compose pause

$ docker-compose unpause

서비스의 구성 확인 (port / config)

서비스의 공개용 포트를 확인할 때는 docker-compose port 명령을 사용한다.

$ docker-compose port [옵션] <서비스명> <프라이빗 포트 번호>

지정할 수 있는 주요 옵션

옵션 설명
--protocol=proto 프로토콜. tcp 또는 udp
--index=index 컨테이너의 인덱스 수

예를 들어 webserver라는 이름의 서비스의 80번 포트에 할당되어 있는 설정을 확인하려면 다음의 명령을 실행한다.

// 공개 포트 확인

$ docker-compose port webserver 80

또한 Compose의 구성을 확인할 때는 docker-compose config 명령을 사용한다. 다음의 명령을 실행하면 Compose 구성 파일의 내용을 확인할 수 있다.

// 구성 확인

$ docker-compose config

여러 컨테이너 강제 정지 / 삭제 (kill / rm)

실행 중인 컨테이너를 강제로 정지시킬 때는 docker-compose kill 명령을 사용한다. 이 명령을 사용하면 컨테이너에게 시그널을 송신할 수 있다.

시그널이란, 프로세스 간의 연락을 주고받기 위한 장치로 Linux 커널에 내장되어 있다.

실행 중인 프로세스의 처리를 멈추고 다른 프로세스를 처리하고 싶은 경우나 프로세스를 강제 종료시키고 싶을 때에 사용한다.

예를 들어 다음의 명령을 실행하면 컨테이너에게 SIGINT를 송신한다.

// 컨테이너에 시그널 송신

$ docker-compose kill -s SIGINT

Killing sample_server_b_1 ... done
Killing sample_server_b_2 ... done
Killing sample_server_b_3 ... done

옵션을 지정하지 않고 docker-compose kill 을 실행하면 SIGKILL이 송신된다. SIGKILL은 프로세스를 강제로 종료시키는 것이다.

생성한 여러 컨테이너를 삭제할 때는 docker-compose rm 명령을 실행한다. 명령을 실행하면 다음과 같이 정말로 삭제해도 좋은지 확인 메시지가 표시되므로 y 또는 n을 입력한다. 

또한 -f 옵션을 지정하면 확인 메시지를 표시하지 않고 강제적으로 삭제한다.

docker-compose rm 명령은 docker-compose로 실행한 컨테이너 중 정지되어 있는 컨테이너만 제거한다.
// 여러 컨테이너 일괄 삭제

$ docker-compose rm

Going to remove sample_server_b_1, sample_server_b_2, sample_server_b_3
Are you sure? [yN] y
Removing sample_server_b_1 ... done
Removing sample_server_b_2 ... done
Removing sample_server_b_3 ... done

그 외 다른 명령에 대한 자세한 내용은 아래의 공식 사이트를 참조하면 된다.

docs.docker.com/compose/reference/

 

Compose command-line reference

 

docs.docker.com


Linux의 시그널

Linux에서는 프로그램을 실행할 때 파일에 쓰여 있는 프로그램을 읽어 들여 메모리상에 배치한다. 이 메모리상에 배치된 프로그램이 실행되면 '프로세스'가 된다. 그리고 이 프로세스에 대해 명령을 송신할 수 있는데, 이 명령을 시그널이라고 한다. 시그널은 POSIX.1-1990 이라는 규격으로 정의되어 있다. 주요 Linux의 시그널은 다음과 같다.

docker-compose kill -s 의 주요 서브 명령

시그널 설명
SIGHUP 프로그램 재시작
SIGINT 키보드로 인터럽트. ctrl + c 로 송신할 수 있다.
SIGQUIT 키보드에 의한 중지. ctrl + \ 로 송신할 수 있다.
SIGTERM 프로세스 정상 종료
SIGKILL 프로세스 강제 종료
SIGSTOP 프로세스 일시 정지

지원하는 시그널의 종류는 kill -l 명령으로 확인할 수 있다.


여러 리소스의 일괄 삭제 (down)

Compose 정의 파일을 바탕으로 docker-compose up 명령으로 생성한 컨테이너나 Docker 이미지를 모아서 삭제할 때는 docker-compose down 명령을 사용한다. docker-compose down 명령은 실행 중인 컨테이너를 정지시키고, Docker 이미지, 네트워크, 데이터 볼륨을 일괄적으로 삭제한다.

docker-compose down [옵션]

지정할 수 있는 주요 옵션

옵션 설명
--rmi all 모든 이미지를 삭제
--rmi local 커스컴 태그가 없는 이미지만 삭제
-v, --volumes Compose 정의 파일의 데이터 볼륨을 삭제

예를 들어 다음의 명령을 실행하면 Compose 정의 파일에서 지정한 컨테이너를 정지시키고 모든 이미지를 삭제한다.

// 여러 이미지 삭제

$ docker-compose down --rmi all
Comments