삽질저장소

Docker Compose 작성 방법 및 명령어 정리

2020-08-27docker

Docker Compose

  • 여러 컨테이너를 모아서 관리하기 위한 툴
  • docker-compose.yml 파일에 컨테이너의 구성 정보를 정의함으로써 동일 호스트상의 여러 컨테이너를 일괄적으로 관리 할 수 있다.
  • yml 파일에 기술하는 version 은 docker engine 버전에 따라 달라진다.

이미지 지정(image)

  • Docker 컨테이너의 바탕이 되는 베이스 이미지를 지정할 때 사용 한다. image 에는 이미지의 이름 또는 이미지 ID 중 하나를 지정한다.
  • 베이스 이미지는 로컬 환경에 있으면 그것을 사용하고, 로컬 환경에 없으면 Docker Hub 로부터 자동으로 다운로드 한다.
  • 이미지의 태그를 지정하지 않은 경우는 최신 버전(latest)이 다운로드 된다.

이미지 빌드(build)

  • 이미지의 작성을 Dockerfile 에 기술 하고 그것을 자동으로 빌드하여 베이스 이미지로 지정할 때는 build 를 지정한다. build 에는 Dockerfile 의 파일 경로를 지정 한다.
  • Docker 이미지를 빌드할 때에 인수를 args 로 지정할 수 있다. bool 연산자를 사용하는 경우는 따옴표로 둘러싸야 한다.
  • 예시)

    services:
        webserver:
            build:
                args:
                    projectno: 1
                    user: asa

컨테이너 안에서 작동하는 명령 지정(command/entrypoint)

  • 베이스 이미지에 지정되어 있을 때는 그 명령을 덮어쓴다.

컨테이너 간 연결(links)

  • 예시)

    links:
        - logserver
        - logserver:1og01

컨테이너 간 통신(ports/expose)

  • 컨테이너가 공개하는 포트는 ports 로 지정한다.
  • ‘호스트 머신의 포트 번호:컨테이너의 포트 번호’를 지정하거나, 컨테이너의 포트 번호만 지정한다. 또한 컨테이너의 포트 번호만 지정한 경우는 호스트 머신의 포트는 랜덤한 값으로 설정된다.
  • YAML은 xx:yy 형식을 시간으로 해석하므로 포트 번호를 설정할 때는 반드시 겹따옴표로 둘러싸서 문자열을 정의해야 한다.
  • 예시)

    ports:
        - "3000"
        - "8000:8000"
        - "49100:22"
        - "127.0.0.1:8001:8001"
  • 호스트 머신에 대한 포트를 공개하지 않고 링크 기능을 사용하여 연결하는 컨테이너에게만 포트를 공개할 때는 expose를 지정한다.

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

  • 컨테이너의 시작 순서만 제어할 뿐 컨테이너상의 애플리케이션이 이용 가능해 질 때까지 기다리고 제어를 하지 않는다.
  • 의존관계에 있는 데이터베이스 서비스의 준비가 끝날 때까지 기다리는 것은 아니기 때문에 애플리케이션 측에서 이에 대한 대책을 세워야 한다.

컨테이너 환경변수 지정(environment/env_file)

  • 배열 형식 또는 해시 형식으로 지정 가능
  • 예시)

    # 배열 형식으로 지정
    environment:
        - HOGE=fuga
        - FOO
    # 해시 형식으로 지정
    environment :
        HOGE: fuga
        FOO:
  • 설정할 변수가 많을 경우에는 파일을 지정 할 수 있다.

    HOGE-fuga
    FOO=bar
  • 위의 내용을 yml 파일에 다음과 같이 기술한다.

    env_file : envfile명
  • 파일명을 여러개 지정할 수도 있다.

    env_file:
        - ./envfile1
        - ./app/envfile2
        - /tmp/envfile3

컨테이너 데이터 관리(volumes/volumes_from)

  • 컨테이너에 볼륨을 마운트할 때 사용한다.
  • 호스트 측에서 마운트할 경로를 지정하려면 호스트의 디렉토리 경로:컨테이너의 디렉토리 경로를 지정한다.
  • 볼륨 지정 뒤에 ro를 지정하면 볼륨을 읽기 전용으로 마운트 할 수 있다. 설정 파일이 저장된 볼륨 등과 같이 쓰기를 금지하고 싶은 경우에 지정한다.

    volumes:
        - ~/configs:/etc/configs/:ro
  • 다른 컨테이너로부터 모든 볼륨을 마운트 할 때는 volumes_from에 컨테이너명을 지정한다.

Docker Compose 의 주요 서브 명령

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

여러 컨테이너 생성(up)

docker-compose up [옵션] [서비스명 .]
옵션 설명
-d 백그라운드에서 실행한다.
--no-deps 링크 서비스를 시작하지 않는다.
--build 이미지를 빌드 한다.
--no-build 이미지를 빌드하지 않는다.
-t, --timeout 컨테이너의 타임아웃을 초로 지정(기본10초)한다.
--scale SERVICE=서비스 수 서비스 수를 지정한다.
  • 작성한 docker-compose.yml을 바탕으로 여러 개의 컨테이너를 생성하여 시작할 때 쓰는 명령어
  • 예를 들어 yml 파일에 servera와 serverb라는 2개의 정의가 있고, servera의 컨테이너를 10개, serverb의 컨테이너를 20개 시작시킬 때 다음과 같이 지정할 수 있다.

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

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

docker-compose down [옵션]
옵션 설명
--rmi all 모든 이미지를 삭제
--rmi local 커스텀 태그가 없는 이미지만 삭제
-v, --volumes Compose 정의 파일의 데이터 볼륨을 삭제
  • compose 정의 파일을 바탕으로 docker-compose up 명령으로 생성한 컨테이너나 Docker 이미지를 모아서 삭제할 때 사용하는 명령어
  • 실행중인 컨테이너를 정지시키고, Docker 이미지, 네트워크, 데이터 볼륨을 일괄적으로 삭제한다.
  • Thank You for Visiting My Blog, Have a Good Day 😆
    © 2021 Developer shPark, Powered By Gatsby.