Начало работы с Docker — использование docker compose

Docker

Введение в компоновку

Проект 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.