DevOps

[docker-compose] 설정 가이드

nineDeveloper 2020. 3. 15. 17:37
728x90

docker-compose 설정 가이드

docker-composedocker-compose.yml 이라는 Compose 정의 파일에 시스템 안에서 가동하는 여러 서버들의 구성을 모아서 정의함
이정의 파일은 YAML 형식으로 기술

docker-compose.yml 정의 파일의 예

# 버전을 지정(현재 메이저 최신 버전)
version: "3"

# 서비스 정의
services:
    webserver:
        image: ubuntu
        ports:
            - "80:80"
        networks:
            - webnet

    redis:
        image: redis
        networks:
            - webnet

# 네트워크 정의
networks:
    webnet:

# 데이터 볼륨 정의
volumes:
    data-volume:

이미지 지정(image)

베이스 이미지가 로컬에 없으면 Docker Hub로 부터 자동 다운로드 함
이미지 태그를 지정하지 않은 경우는 최신 버전(latest)이 다운로드 됨

이미지 태그를 지정하지 않은 경우

services:
webserver:
    image: ubuntu

이미지 태그를 지정한 경우

services:
webserver:
    image: asashiho/dockersample:1.0

이미지 빌드(build)

이미지 작성을 Dockerfile에 기술하고 그것을 자동으로 빌드하여 베이스 이미지로 지정할때는 build를 지정
build에는 Dockerfile의 파일 경로를 지정

build 지정

docker-compose.yml 파일과 Dockerfile 이 같은 경로에 있을떄 아래와 같이 설정할 수 있다

services:
    webserver:
        # current directory 설정
        build: .

Dockerfile 과 컨텍스트 지정

임의 이름으로 된 Dockerfile을 빌드 할 때
Dockerfile이 있는 디렉토리의 경로나 Git Repository URLcontext로 지정

services:
    webserver:
        build:
            context: /data
            dockerfile: Dockerfile-alternate

빌드 시의 인수 지정

docker 이미지를 build 할 때 인수를 args로 지정할 수 있음
bool 연산자 (true/false/yes/no)를 사용하는 경우는 따옴표로 둘러싸야 됨
변수 값은 docker-compose를 실행하는 머신 위에서만 유효함

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

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

컨테이너에서 작동하는 명령은 command로 지정
베이스 이미지에서 지정되어 있을 때는 그 명령을 덮어씀

컨테이너 안에서 작동하는 명령 지정

command: /bin/bash

entrypoint 지정

entrypoint:
    - php
    - -d
    - memory_limit=-1

컨테이너 간 연결(links)

다른 컨테이너에 대한 링크 기능을 사용하여 연결하고 싶을때 links를 사용하여 연결할 컨테이너명을 설정
links 항목을 사용하지 않더라도 한 네트워크 안에 있는 서비스끼리 통신을 할 수 있음
docker-compose.yml 안에 있는 서비스들은 별도로 지정하지 않으면 하나의 네트워크에 속함

links:
    - logserver
    # 컨테이너 명과 별도로 Alias 명을 붙임
    - logserver:log01

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

ports

컨테이너가 외부에 공개하는 포트는 ports로 지정
'호스트 머신의 포트번호: 컨테이너의 포트번호' 를 지정하거나 컨테이너의 포트 번호만 지정
컨테이너의 포트 번호만 지정한 경우는 호스트 머신의 포트랜덤한 값으로 설정

공개 포트 지정
ports:
    - "3000"
    - "8000:8000"
    - "49100:22"
    - "127.0.0.1:8001:8001"

expose

호스트 머신에 대한 포트를 공개하지 않고 링크 기능을 사용하여 연결하는 컨테이너에게만 포트를 공개 할떄 expose를 지정
로그 서버와 같이 호스트 머신에서 직접 액세스하지 않고 웹 애플리케이션 서버 기능을 갖고 있는 컨테이너를 경유해서만 액세스하고 싶은 경우 등에 사용

컨테이너 내부에만 공개하는 포트 지정
expose:
    - "3000"
    - "8000"

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

여러 서비스의 의존관계를 정의할 때는 depends_on을 지정
예를 들어 webserver 컨테이너를 시작하기 전에 db 컨테이너와 redis 컨테이너를 시작하고 싶을 때 아래와 같이 정의

의존관계 지정
services:
    webserver:
        build: .
        depends_on:
            - db
            - redis
    redis:
        image: redis
    db:
        image: postgres

※주의: depends_on은 컨테이너의 시작 순서만 제어할 뿐 컨테이너상의 애플리케이션이 이용 가능해 질 때까지 기다리고 제어하지는 않음

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

컨테이너 안의 환경변수를 지정할 때는 environment를 지정
YAML 배열 형식 또는 해시 형식 중 하나로 변수를 지정

환경변수 지정

# 배열 형식으로 지정
environment:
    - HOGE=fuga
    - FOO
# 해시 형식으로 지정
environment:
    HOGE: fuga
    FOO:

환경 변수 파일에 환경변수를 정의하고 파일을 읽어 올 수 있음
docker-compose.yml 과 동일한 디렉토리에 envfile이라는 이름의 파일을 작성 하고 환경변수를 정의 한뒤
env_file 항목에 연결

envfile

HOGE=fuga
FOO=bar

환경변수 파일 읽어 들이기

env_file: envfile

여러 개의 환경변수 파일 읽어 들이기

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

애플리케이션 안에서 사용하는 API 키와 같은 비밀정보의 관리는 컨테이너 오케스트레이션 툴의 기능을 사용하는 것을 권장

컨테이너 정보 설정(container_name/labels)

docker-compose로 생성되는 컨테이너에 이름을 붙일 때는 container_name을 지정
docker 컨테이명은 고유해야 하므로 커스텀명을 지정하면 여러 컨테이너로 스케일할 수 없음

컨테이너 명 지정

container_name: web-container

컨테이너 라벨 지정

# 배열 형식으로 지정
labels:
    - "com.example.description=Accounting webapp"
    - "com.example.department=Finance"
# 해시 형식으로 지정
labels:
    com.example.description: "Accounting webapp"
    com.example.department: "Finance"
  • 설정한 라벨 확인
    docker-compose config

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

컨테이너에 볼륨을 마운트할때는 volumes를 지정

볼륨 지정

volumes:
    - /val/lib/mysql
    - cache/:/tmp/cache

읽기 전용 볼륨 지정

볼륨 지정 뒤에 ro를 지정하면 볼륨을 읽기 전용으로 마운트

volumes:
    - ~/configs:/etc/configs/:ro

볼륨 마운트 지정

다른 컨테이너로부터 모든 볼륨을 마운트할 때는 volumes_from에 컨테이너명을 지정

volumes_from:
    - log
728x90