Эти статьи были написаны по Docker 1.1.2. С тех пор в Docker появилось много полезного, о чем мы расскажем в этой статье. Также мы рассмотрим подробнее Docker Compose, утилиту, позволяющую определять мультиконтейнерное приложение со всеми зависимостями в одном файле и запускать это приложение в одну команду. Примеры будут продемонстрированы на облачном сервере в InfoboxCloud.
Установка Docker и Compose в InfoboxCloud
Мы рекомендуем создать сервер с Oracle Linux 7 для установки Docker в InfoboxCloud. Для работы Docker сейчас необходима именно виртуальная машина, поэтому при создании сервера обязательно установите галочку "Разрешить управление ядром ОС."
Использование облака очень удобно тем, что никакой абонентской платы нет. При регистрации вы единовременно пополняете счет минимум на 500 рублей (по аналогии с покупкой sim–карты у мобильного оператора) и далее можете использовать облако по необходимости. Быстро рассчитать сколько примерно будет стоить для вас облачный сервер в месяц можно тут (указывайте правильно размерности, например 2 гигагерца частоты, а не 2000 гигагерц). Оплата производится на почасовой основе и замораживается на вашем счету. Используя автомасштабирование или изменяя объем доступных ресурсов сервера вручную можно оплачивать только за необходимые ресурсы и дополнительно экономить и иметь возможность получить больше ресурсов, когда это необходимо.
После регистрации вы получите данные для доступа к панели управления на email. Войдите в панель управления по адресу: http://ift.tt/1C9oF8v
В разделе «Облачная инфраструктура» вашей подписки нажмите «Новый сервер» (при необходимости подписка меняется в правом верхнем углу в выпадающем меню).
Задайте необходимые параметры сервера. Обязательно выделите серверу 1 публичный IP–адрес и установите галочку «Разрешить управление ядром ОС», как показано на скриншоте ниже.
В списке доступных операционных систем выберите Oracle Linux 7 и завершите создание сервера.
После этого данные для доступа к серверу придут к вам на электронную почту.
После создания сервера с Oracle Linux 7 подключитесь к нему по SSH.
Мы подготовили скрипт, который позволит вам установить Docker и полезные утилиты для работы с Docker на такой сервер. Необходимые настройки будут выполнены автоматически.
Выполните команду для установки Docker и Compose:
bash <(curl -s http://ift.tt/1OoItJU)
1. Обновляет ОС.
2. Останавливает postfix и запрещает его автозапуск. Postfix занимает 25 порт, но этот порт может понадобиться вашим сервисам в docker.
3. Отключает SELinux, т.к. пока docker не работает с SELinux.
4. Устанавливает Docker Engine от Docker. Версия в репозиториях Oracle Linux более старая и менее надежная.
5. Устанавливает Docker Compose и разрешает его исполнение.
6. Запускает сервис Docker и добавляет его в автозагрузку.
Новые возможности Docker с версии 1.0
В данном разделе мы не будем касаться исправления ошибок и улучшения архитектуры docker, а поговорим только об основных новых возможностях для пользователя. Это поможет обновить знания о возможностях Docker.
1.1
Вы можете добавить файл .dockerignore файл рядом с вашим Dockerfile и докер проигнорирует файлы и директории, указанные в файле при отправке билд-контекста в демон докера.
Если вам нужно отключить эту возможность, используйте следующую команду:
docker commit --pause=false <container_id>
Раньше для просмотра логов использовалась команда, выводящая весь лог:
docker logs <container_id>
Теперь можно вывести например последние 10 строк лога командой:
docker logs --tail 10 <container_id>
Также вы можете следить за тем, что добавляется в лог сейчас без чтения всего лога:
docker logs --tail 0 -f <container_id>
Архив может быть использован для автоматизации сборки шаблонов докера, например:
cat context.tar | docker build -
или
docker run builder_image | docker build -
Например:
docker run -v /:/host ubuntu:ro ls /my_host
Тем не менее запрещено монтировать файловую систему хоста в корень файловой системы контейнера /, можно только в какую-то папку в контейнере.
1.2
Для команды docker run добавляется флаг --restart со следующими политиками:
- no – не перезапускать контейнер, если он упал (по-умолчанию).
- on–failure – перезапускать контейнер если он завершился с ненулевым кодом (т.е. нештатно). Также можно указать опцию количества попыток перезапуска (on-failure:5)
- always – всегда перезапускать контейнер вне зависимости от кода выхода.
Флаг --restart для докер-демона теперь объявлен устаревшим благодаря новым опциям.
Например, контейнер с Redis будет бесконечно пытаться подняться пока существует:
docker run --restart=always redis
Другой пример: если контейнер не штатно завершился а упал — 5 раз попробует подняться.
docker run --restart=on-failure:5 redis
В версии 1.2 появились два новых флага для использования с docker run: --cap-add и --cap-drop, которые дают вам более точный контроль над тем, что вы разрешаете контейнеру.
Например, для изменения статуса интерфейсов контейнера:
docker run --cap-add=NET_ADMIN ubuntu sh -c "ip link eth0 down"
Для запрещения chown в контейнере:
docker run --cap-drop=CHOWN ...
Для разрешения всего кроме mknod:
docker run --cap-add=ALL --cap–drop=MKNOD ...
Например, использование устройства внутри контейнера:
docker run --device=/dev/snd:/dev/snd ...
Заметьте, что изменения этих файлов не сохраняются в течении сборки контейнера и не будут представлены в результирующих образах. Изменения будут только проявляться в запущенных контейнерах.
1.3
Например так выглядит команда, создающая bash–сессию внутри контейнера:
docker exec -it ubuntu_bash bash
Основной рекомендуемый подход «одно приложение на контейнер» не изменился, но разработчики пошли навстречу пользователям, которые иногда нуждаются в служебных процессах для приложения.
Например:
docker create -t -i fedora bash
, создает слой контейнера и выводит ID контейнера, но не запускает его.Для запуска выполните:
docker start -a -i <container_id>
Таким образом команда docker create дает пользователю и/или процессу гибкость в использовании docker start и docker stop команд для управления жизненным циклом.
Например, ниже показана политика, позволяющая процессу контейнера слушать только порты Apache:
docker run --security-opt label:type:svirt_apache -i -t centos bash
Одно из преимуществ этой функции в том, что теперь пользователи могут запускать контейнеры docker в контейнерах docker без использования привилегированного режима на ядрах, поддерживающих SELinux и AppArmor. Не давая контейнеру права --privileged вы существенно снижаете поверхность атаки потенциальных угроз.
1.4
Этот релиз включает в себя существенные улучшения в безопасности.
1.5
С помощью флага --read-only можно сделать файловую систему контейнеров доступной только для чтения. Это позволяет ограничить места в контейнере, куда приложения могут записывать файлы. Используя эту функцию вместе с томами вы можете быть уверены, что контейнеры записывают данные только в управляемое вами и известное место.
Появилось API для статистики, предоставляющее данные по CPU, памяти, сетевому IO и дисковому IO контейнера. Таким образом теперь можно мониторить контейнеры.
Реализована одна из наиболее запрашиваемых функций — возможность использования docker build не только для файлов по-умолчанию. Используя docker build -f можно указать файл, из которого вы хотите собрать образ. Например, теперь можно использовать отдельные Dockerfile для тестирования и для использования в продакшне.
1.6
Теперь набор докер-утилит окончательно сформировался в отдельные Docker Engine, Registry, Compose, Swarm и Machine. О Compose рассказано в следующем разделе статьи. Об остальных утилитах будет рассказано в следующих статьях.
Метки позволяют вам добавлять определенные пользователями метаданные к контейнерам и образам, которые могут быть использованы вашими утилитами.
- json-file (по-умолчанию)
- syslog
- none
Также появилось API логгирования, позволяющее подключать сторонние логгеры.
Отличный юзкейс для использования дайджестов — патчи и обновления. Если вы хотите выпустить обновление безопасности, вы можете указать дайджест образа с обновлением безопасности, гарантируя, что на сервер будет установлени это обновление.
docker -d --default-ulimit nproc=1024:2048
Эта команда установит soft limit 1024 и hard limit в 2048 дочерних процессов для всех контейнеров. Можно использовать опцию многократно для разных параметров:
--default-ulimit nproc=1024:2048 --default-ulimit nofile=100:200
Эти настройки можно перегрузить при создании контейнера:
docker run -d -ulimit nproc=2048:4096 httpd
1.7
Этот релиз включает переписанные сетевую подсистему и подсистему томов, а так же повышение стабильности и драйвер ZFS.
Docker Compose
Распределенные приложения состоят как правило из нескольких небольших сервисов, которые работают вместе. Docker преобразует эти приложения в индивидуальные контейнеры и связывает вместе. Вместо построения, запуска и управления каждым контейнером, Docker Compose позволяет вам определять мультиконтейнерное приложение со всеми зависимостями в одном файле и запускать это приложение одной командой up. Хранение структуры и конфигурации приложения вместе позволяет просто и повторяемо запускать его везде.
Использование Compose обычно состоит из трех этапов:
- Определение окружений ваших приложений в Dockerfile.
- Определение сервисов, которые необходимо поднять для работы приложения в файле docker-compose.yml так, чтобы они могли запуститься вместе в изолированном окружении.
- Запуск команды docker-compose up. Docker Compose запустит ваши приложения.
С помощью Compose можно управлять жизненным циклом вашего приложения:
- Запускать, останавливать и перестраивать сервисы
- Просматривать статус запущенных сервисов
- Транслировать вывод логов запущенных сервисов
- Запускать необходимую команду на сервисе.
docker-compose.yml
Файл docker-compose.yml содержит в себе правила развертывания приложений в docker.
Каждый сервис в docker–compose.yml должен включать как минимум один образ (image) или скрипт для сборки (build). Все остальные параметры опциональны по аналогии с параметрами команды docker run.
Как и в случае с docker run, опции, указанные в Dockerfile (такие как CMD, EXPOSE, VOLUME, ENV) выполняются по-умолчанию, нет необходимости повторять их в docker-compose.yml.
Список доступных параметров docker–compose.yml описан в официальной документации.
Давайте сразу перейдем от теории к практике и напишем docker-compose для apache с PHP и MySQL.
web:
image: trukhinyuri/apache-php
ports:
- "80:80"
- "443:443"
volumes:
- ./apache/www/:/var/www/
# - ./apache/conf/sites-enabled/:/etc/apache2/sites-enabled/
links:
- db
restart: always
db:
image: centurylink/mysql:latest
volumes:
- ./mysql/conf/:/etc/mysql/conf.d/
- ./mysql/data/:/var/lib/mysql/
environment:
MYSQL_ROOT_PASSWORD: **********
# MYSQL_DATABASE: wordpress
restart: always
- В этом файле мы определяем 2 контейнера docker: web и db.
- Указываем образы, из которых они строятся или файлы Dockerfile. (Уже готовые образы бы можете найти на hub.docker.com)
- Каждому из образов указываем, что они должны всегда рестартовать, что бы не случилось.
- Для контейнера db указываем с помощью переменной окружения пароль для доступа к базе данных (переменную окружения мы узнали из документации к образу на Dockerhub).
- В каждом из образов мы монтируем папки, где хранятся данные и настройки на хост, чтобы легко бекапировать их и изменять, не трогая приложения в docker.
- В образе web мы указываем ссылку на образ db. Таким образом в файл /etc/hosts будет добавлен хост db автоматически и на нем будут доступны все открытые порты базы данных. При обращении к базе данных из веб-приложения можно в качестве MySQL сервера указать хост db и веб-приложение найдет базу данных.
- В контейнере web мы пробрасываем наружу порты 80 и 443, чтобы наш сайт был доступен по сети.
В смонтированные папки кладем файлы сайта, конфигурацию apache, базу данных сайта. Если сайт новый — можно раскомментировать переменную окружения с названием базы данных, она будет создана при старте контейнера. Теперь мы получили переносимый сайт, который очень быстро можно развернуть на сервере.
Допустим, мы создали сервер в InfoboxCloud и установили docker и compose с помощью одной команды, указанной в начале статьи. Теперь просто скопируем папку lamp с docker–compose.xml, папками сайта и базы данных и запустим команду
docker-compose up -d
Поднимется стек LAMP и в нем уже будет работать наш сайт. Вот так просто! Хотите переместить сайт на другой сервер или развернуть на десяти серверах? Просто скопируйте папку LAMP на другой сервер и запустите docker–compose снова.
Таким образом, docker и compose позволяют вам упаковывать приложения и целые системы в подготовленные окружения и прописывать конфигурацию их развертывания. При этом развертывание происходит в одну команду и это может сделать даже неподготовленный пользователь. Развертывание даже сложных систем в InfoboxCloud (и вообще облака IaaS) происходит с простотой PaaS, но вы контролируете все аспекты работы инфраструктуры. Именно такой способ развертывания использует OnlyOffice
Если при повторном развертывании с compose вы встретились с ошибкой Duplicate bind mount
В этом случае посмотрите, какие контейнеры созданы. Для этого воспользуйтесь командой:
docker ps -a
Вы увидите контейнер со странным именем кроме описанных в docker-compose.yml контейнеров. В данном случае имя «335698fa2d_lamp_db_1».
Удалите его командой:
docker rm 335698fa2d_lamp_db_1
, где 335698fa2d_lamp_db_1 замените на имя вашего контейнера со странным именем.После этого compose выполнит переразвертывание успешно.
Заключение
В следующих статьях мы рассмотрим и другие полезные утилиты для Docker. Если вы нашли ошибку в статье или у вас есть вопрос, напишите нам в ЛС или на email. Если вы не можете оставлять комментарии на Хабре — напишите в Сообществе.
Успешного использования Docker!
This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.
Комментариев нет:
Отправить комментарий