Введение в компоновку
Проект Compose — это официальный проект Docker с открытым исходным кодом, отвечающий за быструю оркестрацию кластеров контейнеров Docker. Его код в настоящее время находится в открытом доступе по адресу https://github.com/docker/compose.
Позиционирование Compose — это приложение для определения и запуска нескольких контейнеров Docker, а его предшественником является проект с открытым исходным кодом, рис.
Благодаря представлению предыдущего контента мы знаем, что использование файла шаблона Dockerfile позволяет пользователям легко определить отдельный контейнер приложения. Однако в повседневной работе часто возникают ситуации, когда несколько контейнеров должны взаимодействовать друг с другом для выполнения определенной задачи. Например, для реализации веб-проекта, помимо самого контейнера веб-службы, часто необходимо добавить контейнер внутренней службы базы данных и даже контейнер балансировки нагрузки.
Compose отвечает именно этой потребности. Он позволяет пользователям определять набор связанных контейнеров приложений как проект с помощью одного файла шаблона docker-compose.yml.
В Compose есть две важные концепции:
- Служба: контейнер для приложения может на самом деле включить ряд примеров контейнеров, выполняющих то же изображение.
- Проект: полная бизнес-единица, состоящая из набора связанных контейнеров приложений.
Объектом управления Compose по умолчанию является проект, который удобно управляет жизненным циклом набора контейнеров в проекте с помощью подкоманд.
Проект Compose написан на Python, и реализация вызывает API, предоставляемый службой Docker, для управления контейнерами.
Установить и удалить
Compose поддерживает три платформы: Linux, macOS и Windows 10.
Создатель может быть установлен через инструмент управления пакетами Python Pub, или вы можете напрямую загрузить скомпилированные двоичные файлы для использования или даже проходить непосредственно в контейнере Docker.
Docker для Mac, Docker для Windows поставляется с docker-compose в виде бинарного файла, его можно использовать сразу после установки Docker.
docker-compose --version
Системы Linux необходимо устанавливать отдельно, используя двоичный файл или pip.
Установка Linux с помощью docker-compose
бинарный пакет
Установка в Linux очень проста, просто скачайте скомпилированные бинарники прямо с официального GitHub Release. Например, напрямую загрузите соответствующий двоичный пакет в 64-разрядной системе Linux.
sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose #赋予可执行权限
пип установить
Если архитектура вашего компьютера ARM (например, Raspberry Pi), для установки рекомендуется использовать pip.
sudo pip install -U docker-compose
использовать
Сценарий: наиболее распространенным проектом является веб-сайт. Обычные веб-сайты полагаются на услуги, предоставляемые третьими сторонами (такие как БД и кеш). Для объяснения мы будем использовать dubbo-admin (dubbo-admin зависит от zookeeper).
Compose создает сервис dubbo-admin
Получите исходный код основной ветки dubbo-admin с github.
git clone -b master https://github.com/apache/incubator-dubbo-ops.git
Измените конфигурацию приложения в админке и измените адрес zookeeper на zookeeper://zookeeper:2181.
Скомпилировать и упаковать с помощью maven
mvn clean package -Dmaven.test.skip=true
Запишите файл Dockerfile в каталог dubbo-admin, содержимое
# FROM,表示使用JDK8环境为基础镜像,如果镜像不是本地会从DockerHub进行下载
FROM openjdk:8-jdk-alpine
# 作者
MAINTAINER Simon<xueyao.me@gmail.com>
VOLUME /tmp
# ADD,拷贝文件并且重命名
ADD ./target/dubbo-admin-0.0.1-SNAPSHOT.jar app.jar
# ENTRYPOINT,为了缩短Tomcat启动时间,添加java.security.egd的系统属性指向/dev/urandom作为ENTRYPOINT
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
Соберите с помощью команды docker build -t dubbo-admin:1.0 .
Запишите файл docker-compose.yml в корневой каталог проекта, который является основным файлом шаблона, используемым Compose.
version: '3.4'
services:
zk_server:
image: zookeeper:3.4
ports:
- 2181:2181
dubbo-admin:
image: dubbo-admin:1.0
links:
- zk_server:zookeeper
depends_on:
- zk_server
ports:
- 7001:7001
Выполните в каталоге, где находится файл docker-compose.yml:
docker-compose up
Получите доступ к http://server ip:7001 в браузере для проверки, имя пользователя и пароль: root/root guest/guest
Составление описания команды
Объект команды и формат
Выполните docker-compose [КОМАНДА] --help или docker-compose help [КОМАНДА], чтобы просмотреть формат использования определенной команды.
Основной формат использования команды docker-compose:
docker-compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
параметры команды
- -f, --file ФАЙЛ указывает файл шаблона, по умолчанию используется docker-compose.yml, который можно указать несколько раз.
- -p,--project-name NAME указывает имя проекта, по умолчанию в качестве имени проекта будет использоваться имя каталога, в котором он находится.
- --x-networking использует подключаемую сетевую серверную функцию Docker.
- --x-network-driver ДРАЙВЕР указывает драйвер сетевого сервера, по умолчанию используется мост.
- --verbose вывести дополнительную отладочную информацию.
- -v, --version вывести версию и выйти.
build
格式为docker-compose build [options] [SERVICE...]。
构建(重新构建)项目中的服务容器。
可以随时在项目目录下运行docker-compose build来重新构建服务。
选项包括:
* --force-rm 删除构建过程中的临时容器。
* --no-cache 构建镜像过程中不使用cache(将加长构建过程)。
* --pull 始终尝试通过pull来获取更新版本的镜像。
logs
格式为docker-compose logs [options] [SERVICE...]。
查看服务容器的输出。默认情况下,docker-compose将对不同的服务输出使用不同的颜色来区分。可以通过--no-color来关闭颜色。
port
格式为docker-compose port [options] SERVICE PRIVATE_PORT。
打印某个容器端口所映射的公共端口。
选项:
--protocol=proto指定端口协议,tcp(默认值)或者udp。
--index=index如果同一服务存在多个容器,指定命令对象容器的序号(默认为1)。
ps
格式为docker-compose ps [options] [SERVICE...]
列出项目中目前的所有容器。
选项:
-q只打印容器的ID信息。
pull
格式为docker-compose pull [options] [SERVICE...]。
拉取服务依赖的镜像。
选项:
--ignore-pull-failures忽略拉取镜像过程中的错误。
restart
格式为docker-compose restart [options] [SERVICE...]
重启项目中的服务。
选项:
-t,--timeout TIMEOUT指定重启前停止容器的超时(默认为10秒)。
rm
格式为docker-compose rm [options] [SERVICE...]
删除所有(停止状态的)服务容器。推荐先执行docker-compose stop命令来停止容器。
选项:
-f,--force强制直接删除,包括非停止状态的容器。一般尽量不要使用该选项。
-v删除容器所挂载的数据卷。
run
格式为docker-compose run[options] [-p PORT...][-e KEY=VAL...] SERVICE [COMMAND] [ARGS...]
在指定服务上执行一个命令。例如:
docker-compose run ubuntu ping docker.com
scale
格式为docker-compose scal [options] [SERVICE=NUM...]
设置指定服务运行的容器个数。例如:
docker-compose scale web=3 db=2
将启动3个容器运行web服务,2个容器运行db服务。
up
该命令十分强大,它将尝试自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务相关容器的一系列操作。链接的服务都将会被自动启动,除非已经处于运行状态。
选项:
-d 在后台运行服务容器。
--no-color 不使用颜色来区分不同的服务的控制台输出。
--no-deps 不启动服务所链接的容器。
--force-recreate强制重新创建容器,不能与--no-recreate同时使用。
--no-recreate如果容器已经存在了,则不重新创建,不能与--force-recreate同时使用。
--no-build 不自动构建缺失的服务镜像。
-t,--timeout TIMEOUT停止容器时候的超时(默认为10秒)。
Другие команды следующие:
Заказ | иллюстрировать |
---|---|
version | Формат - версия для создания докеров, информация о версии для печати. |
config | Проверьте правильность формата Compose. Если он правильный, отобразите конфигурацию. Если формат неверен, отобразите причину ошибки. |
exec | Введите указанный контейнер |
images | Список изображений, включенных в файл Compose |
down | Остановите контейнер, запущенный командой up, и удалите сеть. |
help | получить помощь с командой |
kill | Принудительно остановить сервисный контейнер, отправив сигнал SIGKILL |
pause | Формат docker-compose pause [SERVICE...], который приостанавливает контейнер службы. |
push | Push Service-зависимые изображения в репозиторий Docker Image |
start | Формат docker-compose start[SERVICE...] для запуска существующего сервисного контейнера. |
stop | Остановите существующий сервисный контейнер. |
top | Просмотр процессов, запущенных в каждом сервисном контейнере |
unpause | Формат: docker-compose unpause [SERVICE...], чтобы возобновить службу в приостановленном состоянии. |
Создать файл шаблона
Файл шаблона является ядром использования Compose, который представляет собой нечто большее, чем ключевое слово инструкции, большинство инструкций аналогичны значениям параметров, связанных с Docker RUN.
Имя файла шаблона по умолчанию — docker-compose.yml, а формат — формат YAML.
Обратите внимание, что каждая служба должна автоматически создавать сгенерированный образ, указав образ с помощью команды image или команды сборки (требуется Dockerfile) и т. д.
Если вы используете команду сборки, параметры, установленные в Dockerfile (например: CMD, EXPOSE, VOLUME, ENV и т. д.), будут автоматически получены, и вам не нужно будет устанавливать их снова в docker-compose.yml. Ниже описано использование общих команд.
version: '3'
services:
webapp:
build:
context: ./dir
dockerfile: Dockerfile-alternate
args:
buildno: 1
build
指令Dockerfile所在文件夹的路径(可以是绝对路径,或者相对docker-compose.yml文件的路径)。
Compose将会利用它自动构建这个镜像,然后使用这个镜像。
使用context指令指定Dockerfile所在文件夹的路径
使用dockerfile指令指定Dockerfile文件名
使用arg指令指定构建镜像时的变量
command
Переопределяет команду по умолчанию, выполняемую после запуска контейнера.
command:echo "hello world"
Container_name
Имя контейнера директивы. По умолчанию будет использоваться формат имя проекта_имя службы_серийный номер.
container_name:docker-web-container
configs
Используется только в режиме роя, режим роя страниц включится после подробностей.
deploy
Подробности о РЕЖИМЕ SWARM вернутся позже.
devices
Укажите сопоставление между устройствами.
devices:
- "/dev/ttyUSB1:/ttyUSB0"
depends_on
Решите проблемы зависимостей контейнеров и последовательности запуска.
dns
Пользовательский DNS-сервер. Может быть значением или списком.
dns: 8.8.8.8
dns:
- 8.8.8.8
- 114.114.114.114
environment
Установите переменные среды. Вы можете использовать формат массива или словаря. Только переменная с заданным именем автоматически получит значение соответствующей переменной на хосте, на котором работает Compose, что можно использовать для предотвращения ненужной утечки данных.
environment:
RACK_ENV: development
SESSION_SECRET:
environment:
- RACK_ENV=development
- SESSION_SECRET
expose
Порты открыты, но не сопоставлены с хостом, доступ к ним имеют только подключенные службы. В качестве параметров можно указать только внутренние порты.
expose:
- "3000"
- "8000"
extra_hosts
Подобно параметру --add-host в Docker, указывает дополнительную информацию о сопоставлении имени хоста. Запись будет добавлена в файл /etc/hosts в сервис-контейнере после запуска. 8.8.8.8 гуглднс
extra_hosts:
- "googledns:8.8.8.8"
healthcheck
Приказал ли контейнер здоров или нет.
healthcheck:
test:["CMD","curl","-f","http://localhost"]
interval:1m30s
timeout:10s
retries:3
image
Указывает имя зеркала или идентификатор зеркала. Если зеркало не существует локально, Compose попытается получить этот образ.
image:session-web:latest
lables
Добавьте в контейнер информацию о метаданных Docker (метаданные). Например, в контейнер можно добавить вспомогательную информацию описания.
labels:
com.study.department:"devops department"
com.study.release:"v1.0"
links
Подключиться к другим контейнерам. Примечание. Эта директива устарела. Вы должны использовать docker network, чтобы установить сеть, и docker run --network для подключения к определенной сети. Или используйте версию: «2» и более позднюю версию docker-compose.yml, чтобы напрямую определить пользовательскую сеть и использовать ее.
network_mode
Установите сетевой режим. Используйте то же значение, что и параметр --network запуска docker.
network_mode:"bridge"
network_mode:"host"
network_mode:"none"
networks
Настройте сеть, к которой подключен контейнер.
version:"3"
services:
some-service:
networks:
- some-network
networks:
some-network:
ports
Раскрыть информацию о порте. Либо используйте формат порт хоста:порт контейнера (HOST:CONTAINER), либо просто укажите порт контейнера (хост выберет порт случайным образом).
ports:
- "3000"
- "8000:8000"
volumes
В настройках пути для тома данных вы можете установить путь к хосту и одновременно поддерживать связанные пути.
volumes:
- /var/lib/mysql
- cache/:/tmp/cache
- ~/configs:/etc/configs/:ro
ulimits
Указывает предельное значение ulimits для контейнера. Например, укажите максимальное количество процессов как 65535, укажите количество дескрипторов файлов как 20000 (мягкое ограничение, приложение может быть изменено в любое время и не может превышать жесткое ограничение) и 40000 (системное жесткое ограничение, которое может только быть поднят пользователем root).
ulimits:
nproc: 65535
nofile:
soft: 20000
hard: 40000
Кроме того, есть команды, включающие имя домена, точку входа, имя хоста, ipc, mac_address, privived, read_only, shm_size, reboot, stdin_open, tty, user, working_dir и т. д., которые в основном совпадают с соответствующими параметрами в docker run.
Указывает файл записи, который будет выполняться после запуска сервисного контейнера.
entrypoint: /code/entrypoint.sh
Укажите имя пользователя для запуска приложения в контейнере
user:nginx
Указать рабочий каталог в контейнере
working_dir: /code
Поиск доменного имени, имени хоста, mac-адреса и т. д. в указанном контейнере.
domainname:your_website.com
hostname:test
mac_address:08-00-27-00-0C-0A
Разрешить судну выполнять некоторые привилегированные команды
privileged:true
Укажите политику перезапуска после выхода из контейнера, чтобы всегда перезапускаться. Рекомендуется настраивать всегда или без остановки в производственной среде.
restart:alwarys
Смонтировать корневую файловую систему контейнера в режиме только для чтения, что означает, что содержимое контейнера не может быть изменено.
read_only:true
Открытый стандартный ввод, может принимать внешний ввод
stdin_open:true
эмулировать псевдотерминал
tty:true
Файлы шаблонов Compose поддерживают динамическое чтение переменных среды хост-системы и переменных в файле .env в текущем каталоге. Например, следующий файл Compose будет считывать значение переменной ${MONGO_VERSION} из среды, в которой он запущен, и записывать его в выполняемую инструкцию.
version: "3"
services:
db:
image: "mongo:${MONGO_VERSION}"
Если выполняется MONGO_VERSION=3.2 docker-compose up, будет запущен контейнер с образом mongo:3.2. Если в текущем каталоге есть файл .env, переменные будут считаны из этого файла при выполнении команды docker-compose.