English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Compose은 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하는 도구입니다. Compose를 통해 YML 파일을 사용하여 애플리케이션에 필요한 모든 서비스를 설정할 수 있습니다. 그런 다음, 한 명령어로 YML 파일 설정에서 모든 서비스를 생성하고 시작할 수 있습니다.
Compose의 세 단계:
Dockerfile을 사용하여 애플리케이션 환경을 정의합니다.
docker를 사용하여-compose.yml은 애플리케이션을 구성하는 서비스를 정의하며, 이를 통해 이들이 분리된 환경에서 함께 실행할 수 있습니다.
마지막으로, docker 명령어를 실행합니다.-compose up 명령어를 사용하여 전체 애플리케이션을 시작하고 실행합니다.
docker-아래는 compose.yml 설정 사례입니다. (설정 매개변수는 다음을 참조하세요):
# yaml 설정 예제 version: ''3' services: web: build: . ports: - "5000:5000" volumes: - .:/code - logvolume01:/var/log links: - redis redis: image: redis volumes: logvolume01: {}
리눅스
Linux 上我们可以从 Github 上下载它的二进制包来使用,最新发行的版本地址:Linux에서는 Github에서 이의 바이너리 패키지를 다운로드하여 사용할 수 있습니다. 최신 출시 버전 주소는://L "https:/docker/$ docker/github.com。
https:
현재 안정 버전의 Docker Compose를 다운로드하기 위해 다음 명령어를 실행합니다: -$ sudo curl//L "https:/docker/$ docker/github.com/releases/1.24.1/docker-$ docker-s) -download-s) -$(uname -m)" /usr/local/bin/docker-$ docker
o 1.24.1。
Compose의 다른 버전을 설치하려면 다음을 대체하세요
이진 파일에 실행 권한을 부여합니다: +$ sudo chmod /usr/local/bin/docker-$ docker
x
소프트 링크를 생성합니다: -초 /usr/local/bin/docker-$ docker /usr/bin/docker-$ docker
$ sudo ln
설치가 성공적으로 완료되었는지 테스트합니다:-$ docker --version compose-cker 1.24.1compose version 4667896, build
b주의-:alpine용으로는 다음 의존성 패키지가 필요합니다: py-pip, python-dev, libffi-dev, openssl-dev, gcc, libc
Mac의 Docker 데스크톱판과 Docker Toolbox은 Compose와 다른 Docker 애플리케이션을 포함하고 있으므로 Mac 사용자는 별도로 Compose를 설치할 필요가 없습니다. Docker 설치 설명은 다음을 참조하세요 MacOS Docker 설치。
Windows의 Docker 데스크톱판과 Docker Toolbox은 Compose와 다른 Docker 애플리케이션을 포함하고 있으므로 Windows 사용자는 별도로 Compose를 설치할 필요가 없습니다. Docker 설치 설명은 다음을 참조하세요 Windows Docker 설치。
테스트 디렉토리를 생성합니다:
$ mkdir composetest $ cd composetest
테스트 디렉토리에 app.py 파일을 생성하고 다음 내용을 복사 붙여넣습니다:
import time import redis from flask import Flask app = Flask(__name__) cache = redis.Redis(host='redis', port=6379) def get_hit_count(): retries = 5 while True: try: return cache.incr('hits') except redis.exceptions.ConnectionError as exc: if retries == 0: raise exc retries -= 1 time.sleep(0.5) @app.route('/') def hello(): count = get_hit_count() return 'Hello World! I have been seen {} times.\n'.format(count)
이 예제에서 redis는 응용 프로그램 네트워크에서 redis 컨테이너의 호스트 이름이며, 사용하는 포트 번호는 6379。
composetest 디렉토리에서 requirements.txt 파일을 만들고 다음과 같은 내용을 작성합니다:
flask redis
composetest 디렉토리에서 Dockerfile 파일을 만들고 다음과 같은 내용을 작성합니다:
FROM python:3.7-alpine WORKDIR /code ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0 RUN apk add --no-cache gcc musl-dev linux-headers COPY requirements.txt requirements.txt RUN pip install -r requirements.txt COPY . . CMD ["flask", "run"]
Dockerfile 내용 설명:
FROM python:3.7-alpine: Python 3.7 이미지가 빌드되기 시작합니다
WORKDIR /code: 작업 디렉토리를 설정합니다 /code。
ENV FLASK_APP app.py ENV FLASK_RUN_HOST 0.0.0.0
flask 명령어가 사용하는 환경 변수를 설정합니다
RUN apk add --no-cache gcc musl-dev linux-headers: MarkupSafe와 SQLAlchemy와 같은 Python 패키지를 컴파일 가속하기 위해 gcc를 설치합니다
COPY requirements.txt requirements.txt RUN pip install -r requirements.txt
requirements.txt를 복사하고 Python 의존성을 설치합니다
COPY . .: 현재 디렉토리를 . 프로젝트의 현재 디렉토리로 복사합니다
CMD ["flask", "run"]: 컨테이너는 기본 실행 명령어로 다음을 제공합니다: flask run。
테스트 디렉토리에서 docker 이름의 디렉토리를 만듭니다-compose.yml 파일을 열고 다음 내용을 붙여넣으세요:
이 Compose 파일은 두 개의 서비스를 정의합니다:web과 redis。
web:이 웹 서비스는 Dockerfile 현재 디렉토리에서 구축된 이미지를 사용합니다. 그런 다음, 컨테이너와 호스트를 노출된 포트에 바인딩합니다 5000。이 예제 서비스는 Flask 웹 서버의 기본 포트를 사용합니다 5000 。
redis:이 redis 서비스는 Docker Hub의 공개 Redis 이미지를 사용합니다。
테스트 디렉토리에서 다음 명령어를 실행하여 애플리케이션을 시작합니다:
docker-compose up
이 서비스를 배경에서 실행하고 싶다면 추가할 수 있습니다: -d 参数:
docker-compose up -d
이 yml이 준수하는 compose 버전을 지정합니다。
이미지 구축 상대 경로를 지정합니다:
예를 들어 webapp 서비스는 상대 경로 .으로 지정됩니다./dir/Dockerfile에서 구축된 이미지:
version: "3.7" services: webapp: build: ./dir
또는, 상대 경로로 지정된 객체로서 선택적으로 Dockerfile 및 args를 포함합니다:
version: "3.7" services: webapp: build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1 labels: - "com.example.description=Accounting webapp" - "com.example.department=Finance" - "com.example.label-with-empty-value" target: prod
context:상대 경로.
dockerfile:이미지 구축에 사용할 Dockerfile 파일 이름을 지정합니다.
args:구축 파라미터 추가,이는 구축 과정에서만 접근할 수 있는 환경 변수입니다.
labels:이미지 구축에 태그를 설정합니다.
target:多层 구축에서, 구축할 레이어를 지정할 수 있습니다.
컨테이너가 소유하는 호스트의 커널 기능을 추가하거나 제거합니다.
cap_add: - ALL # 모든 권한 활성화 cap_drop: - SYS_PTRACE # ptrace 권한 종료
컨테이너에 부모 cgroup 그룹을 지정하면 그 그룹의 자원 제한을 상속하게 됩니다.
cgroup_parent: m-executor-abcd
컨테이너 시작 시 기본 명령을 덮어쓰습니다.
command: ["bundle", "exec", "thin", "-p", "3000"]
사용자 정의 컨테이너 이름을 지정하여 기본적으로 생성된 이름 대신 사용합니다.
container_name: my-web-container
의존 관계 설정.
docker-compose up: 의존성에 따라 서비스를 시작합니다. 다음 예제에서는 db와 redis가 먼저 시작되어 web이 시작됩니다.
docker-compose up SERVICE: SERVICE의 의존 관계를 자동으로 포함합니다. 다음 예제에서는 docker-compose up web은 db와 redis를 생성하고 시작합니다.
docker-compose stop: 의존 관계에 따라 서비스를 중지합니다. 다음 예제에서는 web이 db와 redis보다 먼저 중지됩니다.
version: "3.7" services: web: build: . depends_on: - db - redis redis: image: redis db: image: postgres
주의: 웹 서비스는 redis db가 완전히 시작된 후에도 시작되지 않습니다.
서비스 배포와 실행에 관련된 설정을 지정합니다. swarm 모드에서만 사용됩니다.
version: "3.7" services: redis: image: redis:alpine deploy: mode: replicated replicas: 6 endpoint_mode: dnsrr labels: description: "This redis service label" resources: limits: cpus: '0.50' memory: 50M reservations: cpus: '0.25' memory: 20M restart_policy: condition: on-failure delay: 5초 max_attempts: 3 window: 120초
가능한 매개변수:
endpoint_mode:클러스터 서비스에 접근하는 방법.
endpoint_mode: vip # Docker 클러스터 서비스는 외부로 나가는 가상 ip입니다. 모든 요청은 이 가상 ip를 통해 클러스터 서비스 내부의 기계에 도달합니다. endpoint_mode: dnsrr # DNS 루퍼(DNSRR). 모든 요청은 자동으로 클러스터 ip 목록 중 하나의 ip 주소를 가져옵니다.
labels:서비스에 태그를 설정합니다. 컨테이너의 labels (deploy와 동일한 레벨의 설정)를 통해 deploy 아래의 labels를 덮을 수 있습니다.
mode:서비스가 제공하는 모드를 지정합니다.
replicated:복사 서비스, 지정된 서비스를 클러스터의 기계에 복사합니다.
global:전체 서비스, 서비스가 클러스터의 각 노드에 배포됩니다.
도표: 아래 그림에서 노란 박스는 replicated 모드의 실행 상태이고, 회색 박스는 global 모드의 실행 상태입니다.
replicas: mode replicated 시에, 특정으로 실행할 노드 수를 설정하는 데 사용됩니다.
resources:서버 자원 사용 제한을 설정합니다. 예를 들어, 이전 예제에서는 redis 클러스터가 실행되기 위해 필요한 cpu의 퍼센트와 메모리 사용량을 설정합니다. 자원 사용이 너무 많아서 이상이 발생하지 않도록 주의하세요.
restart_policy:컨테이너를 종료할 때 컨테이너를 다시 시작하는 방법을 설정.
condition: 선택 가능한 none, on-failure 또는 any (기본값: any).
delay: 재시작을 설정할 시간 (기본값: 0).
max_attempts: 컨테이너를 다시 시작하려는 시도 횟수, 횟수를 초과하면 더 이상 시도하지 않습니다 (기본값: 항상 시도).
window: 컨테이너가 재시작되는 시간을 설정합니다 (기본값: 0).
rollback_config:업데이트 실패 시 서비스를 어떻게 롤백할지 설정.
parallelism: 한 번에 롤백할 컨테이너 수. 0으로 설정되면 모든 컨테이너가 동시에 롤백됩니다.
delay: 각 컨테이너 그룹이 롤백할 때까지 기다릴 시간 (기본적으로 0s입니다).
failure_action: 롤백이 실패했을 때 어떻게 해야 합니까? 그 중 하나는 continue 또는 pause (기본적으로 pause입니다).
monitor: 각 컨테이너가 업데이트된 후, 실패한 시간을 지속적으로 모니터링합니다. (ns|us|ms|s|m|h) (기본적으로 0s입니다).
max_failure_ratio: 롤백 중에 용인할 수 있는 故障율 (기본적으로 0입니다).
order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first (병렬 롤백) (기본적으로 stop)-first )
update_config:서비스를 어떻게 업데이트할지 설정, 배포 로킹 업데이트에 매우 유용합니다.
parallelism: 한 번에 업데이트할 컨테이너 수.
delay: 한 번에 업데이트할 컨테이너 그룹 사이에 기다릴 시간.
failure_action: 업데이트가 실패했을 때 어떻게 해야 합니까? 그 중 하나는 continue, rollback 또는 pause (기본적으로 pause입니다).
monitor: 각 컨테이너가 업데이트된 후, 실패한 시간을 지속적으로 모니터링합니다. (ns|us|ms|s|m|h) (기본적으로 0s입니다).
max_failure_ratio:在更新过程中可以容忍的故障率。
order:回滚期间的操作顺序。其中一个 stop-first(串行回滚),或者 start-first(并行回滚)(默认stop-first)。
注:仅支持 V3.4 及更高版本。
指定设备映射列表。
devices: - "/dev/ttyUSB0:/dev/ttyUSB0"
自定义 DNS 服务器,可以是单个值或列表的多个值。
dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9
自定义 DNS 搜索域。可以是单个值或列表。
dns_search: example.com dns_search: - dc1.example.com - dc2.example.com
覆盖容器默认的 entrypoint。
entrypoint: /code/entrypoint.sh
也可以是以下格式:
entrypoint: - php - -d - zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so - -d - memory_limit=-1 - vendor/bin/phpunit
从文件添加环境变量。可以是单个值或列表的多个值。
env_file: .env
也可以是列表格式:
env_file: - ./common.env - ./apps/web.env - /opt/secrets.env
添加环境变量。您可以使用数组或字典、任何布尔值,布尔值需要用引号引起来,以确保 YML 解析器不会将其转换为 True 或 False。
environment: RACK_ENV: development SHOW: 'true'
暴露端口,但不映射到宿主机,只被连接的服务访问。
仅可以指定内部端口为参数:
expose: - "3000" - "8000"
添加主机名映射。类似 docker client --add-host。
extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229"
以上会在此服务的内部容器中 /etc/hosts 创建一个具有 ip 地址和主机名的映射关系:
162.242.195.82 somehost 50.31.209.229 otherhost
docker 서비스가 건강하게 실행되고 있는지 확인하는 데 사용됩니다.
healthcheck: test: ["CMD", "curl", "-", "http://localhost"] # 검사 프로그램 설정 interval: 1m30s # 검사 간격 설정 timeout: 10s # 검사 타임아웃 시간 설정 retries: 3 # 재시도 횟수 설정 start_period: 40s # 시작 후, 몇 초 후에 검사 프로그램을 시작합니다
컨테이너가 실행할 이미지를 지정합니다. 다음과 같은 형식을 사용할 수 있습니다:
image: redis image: ubuntu:14.04 image: tutum/influxdb image: example-registry.com:4000/postgresql image: a4bc65fd # 이미지 id
서비스 로그 기록 구성
driver: 서비스 컨테이너의 로그 기록 드라이버를 지정합니다. 기본 값은 json입니다.-file에는 세 가지 옵션이 있습니다.
driver: "json"-file" driver: "syslog" driver: "none"
단지 json-file 드라이버에서는 다음과 같은 파라미터를 사용하여 로그의 수량과 크기를 제한할 수 있습니다.
logging: driver: "json"-file options: max-size: "200k"# 단일 파일 크기는200k max-file: "10"# 최대10개 파일
파일 제한 상한에 도달하면 자동으로 오래된 파일을 삭제합니다.
syslog 드라이버에서는 syslog를 사용할 수 있습니다.-address 로그 수신 주소를 지정합니다.
logging: driver: "syslog" options: syslog-address: "tcp://192.168.0.42:123"
네트워크 모드를 설정합니다.
network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]"
networks
구성 컨테이너 연결 네트워크를 참조하여 최상위 networks 아래의 항목을 사용합니다.
services: some-service: networks: some-network: aliases: - alias1 other-network: aliases: - alias2 networks: some-network: # Use a custom driver driver: custom-driver-1 other-network: # Use a custom driver which takes special options driver: custom-driver-2
aliases :같은 네트워크상의 다른 컨테이너는 서비스 이름이나 이 별명을 사용하여 해당 컨테이너의 서비스에 연결할 수 있습니다.
no:기본적인 재시작 전략으로, 어떤 경우에도 컨테이너를 재시작하지 않습니다.
always:컨테이너가 항상 재시작됩니다.
on-failure:컨테이너가 비정상적으로 퇴출될 때(퇴출 상태가 0이 아닌 경우)에만 컨테이너를 재시작합니다.
unless-stopped:컨테이너가 퇴출될 때마다 항상 컨테이너를 재시작하지만, Docker 데몬 프로세스가 시작할 때 이미 중지된 컨테이너는 고려하지 않습니다.
restart: "no" restart: always restart: on-failure restart: unless-stopped
주의: swarm 클러스터 모드에서는 restart_policy를 사용하도록 합니다.
감시적인 데이터를 저장하는 데 사용됩니다. 예를 들어, 비밀번호:
version: "3.1" services: mysql: image: mysql environment: MYSQL_ROOT_PASSWORD_FILE: /run/secrets/my_secret secrets: - my_secret secrets: my_secret: file: ./my_secret.txt
컨테이너의 기본 schema 태그를 수정합니다.
security-opt: - label:user:USER # 컨테이너의 사용자 태그를 설정합니다 - label:role:ROLE # 컨테이너의 역할 태그를 설정합니다 - label:type:TYPE # 컨테이너의 보안 전략 태그를 설정합니다 - label:level:LEVEL # 컨테이너의 보안 등급 태그를 설정합니다
컨테이너가 SIGTERM(또는 어떤 stop_signal 신호)를 처리할 수 없을 때, 얼마나 많은 시간을 기다린 후 SIGKILL 신호를 보내 컨테이너를 닫습니다.
stop_grace_period: 1s # 대기 1 초 stop_grace_period: 1m30s # 대기 1 분 30 초
기본적인 대기 시간은 10 초.
컨테이너를 중지하기 위한 대체 신호를 설정합니다. 기본적으로 SIGTERM을 사용합니다.
아래 예제에서 SIGUSR를 사용합니다.1 컨테이너를 중지하기 위해 SIGTERM 신호를 대체합니다.
stop_signal: SIGUSR1
컨테이너 내의 커널 파라미터를 설정합니다. 배열이나 딕셔너리 형식으로 사용할 수 있습니다.
sysctls: net.core.somaxconn: 1024 net.ipv4.tcp_syncookies: 0 sysctls: - net.core.somaxconn=1024 - net.ipv4.tcp_syncookies=0
컨테이너 내에 일시적인 파일 시스템을 설치합니다. 단일 값 또는 여러 값을 포함하는 목록이 될 수 있습니다.
tmpfs: /run tmpfs: - /run - /tmp
컨테이너의 기본 ulimit을 덮어쓰습니다.
ulimits: nproc: 65535 nofile: soft: 20000 hard: 40000
메인 호스트의 데이터 볼륨이나 파일을 컨테이너에 마운트합니다.
version: "3.7" services: db: image: postgres:latest volumes: - "/localhost/postgres.sock:/var/run/postgres/postgres.sock" - "/localhost/data:/var/lib/postgresql/data"