Поиск по сайту:

Как установить и использовать Docker Compose в Ubuntu 14.04


Введение

Docker — отличный инструмент, но чтобы полностью использовать его потенциал, лучше всего, если каждый компонент вашего приложения будет работать в своем собственном контейнере. Для сложных приложений с большим количеством компонентов организация одновременного запуска и закрытия всех контейнеров (не говоря уже о взаимодействии друг с другом) может быстро стать громоздкой.

Сообщество Docker придумало популярное решение под названием Fig, которое позволяло вам использовать один файл YAML для организации всех ваших контейнеров и конфигураций Docker. Это стало настолько популярным, что команда Docker в конце концов решила сделать свою собственную версию на основе исходного кода Fig. Они назвали его Docker Compose. Короче говоря, это упрощает работу с процессами оркестрации контейнеров Docker (такими как запуск, завершение работы и настройка внутриконтейнерных связей и томов).

К концу этой статьи у вас будут установлены Docker и Docker Compose, и вы будете иметь общее представление о том, как работает Docker Compose.

Концепции Docker и Docker Compose

Использование Docker Compose требует сочетания множества различных концепций Docker в одной, поэтому, прежде чем мы начнем, давайте уделим минутку обзору различных задействованных концепций. Если вы уже знакомы с такими понятиями Docker, как тома, ссылки и перенаправление портов, вы можете перейти к следующему разделу.

Докер-образы

Каждый контейнер Docker — это локальный экземпляр образа Docker. Вы можете думать об образе Docker как о полной установке Linux. Обычно минимальная установка содержит только самый минимум пакетов, необходимых для запуска образа. Эти образы используют ядро хост-системы, но, поскольку они работают внутри контейнера Docker и видят только свою собственную файловую систему, вполне возможно запустить дистрибутив, такой как CentOS, на хосте Ubuntu (или наоборот).

Большинство образов Docker распространяются через Docker Hub, который поддерживается командой Docker. Для большинства популярных проектов с открытым исходным кодом в реестр Docker загружен соответствующий образ, который можно использовать для развертывания программного обеспечения. Когда это возможно, лучше брать «официальные» образы, поскольку команда Docker гарантирует, что они будут следовать передовым практикам Docker.

Связь между образами Docker

Контейнеры Docker по умолчанию изолированы от хост-компьютера, что означает, что по умолчанию хост-компьютер не имеет доступа к файловой системе внутри контейнера Docker и каких-либо средств связи с ним через сеть. Излишне говорить, что это по умолчанию усложняет настройку и работу с образом, работающим внутри контейнера Docker.

У Docker есть три основных способа обойти это. Первый и наиболее распространенный способ — указать в Docker переменные среды, которые будут установлены внутри контейнера Docker. Затем код, работающий внутри контейнера Docker, будет проверять значения этих переменных среды при запуске и использовать их для правильной настройки.

Другим часто используемым методом является том данных Docker. Тома Docker бывают двух видов — внутренние и общие.

Указание внутреннего тома просто означает, что для папки, которую вы указываете для определенного контейнера Docker, данные будут сохраняться при удалении контейнера. Например, если вы хотите убедиться, что ваши файлы журнала зависают, вы можете указать внутренний том /var/log.

Общий том сопоставляет папку внутри контейнера Docker с папкой на хост-компьютере. Это позволяет вам легко обмениваться файлами между контейнером Docker и хост-компьютером, что мы рассмотрим в статье о томе данных Docker.

Третий способ связи с контейнером Docker — через сеть. Docker обеспечивает связь между различными контейнерами Docker через ссылки, а также переадресацию портов, что позволяет перенаправлять порты из контейнера Docker на порты на хост-сервере. Например, вы можете создать ссылку, позволяющую вашим контейнерам WordPress и MariaDB Docker взаимодействовать друг с другом, и переадресацию портов, чтобы открыть WordPress для внешнего мира, чтобы пользователи могли подключиться к нему.

Предпосылки

Чтобы следовать этой статье, вам понадобится следующее:

  • Дроплет Ubuntu 14.04
  • Пользователь без полномочий root с правами sudo (начальная настройка сервера с Ubuntu 14.04 объясняет, как это настроить).

Шаг 1 — Установка Докера

Сначала установите Docker, если вы еще этого не сделали. Самый быстрый способ установить Docker — загрузить и установить их установочный скрипт (вам будет предложено ввести пароль sudo).

  1. wget -qO- https://get.docker.com/ | sh

Приведенная выше команда загружает и выполняет небольшой установочный скрипт, написанный командой Docker. Если вы не доверяете сторонним сценариям или хотите получить более подробную информацию о том, что делает сценарий, ознакомьтесь с инструкциями в документации по установке.

Работа с Docker усложняется, если ваш пользователь настроен неправильно, поэтому добавьте своего пользователя в группу docker с помощью следующей команды.

sudo usermod -aG docker $(whoami)

Выйдите и войдите со своего сервера, чтобы активировать новые группы.

Примечание. Чтобы узнать больше о том, как использовать Docker, прочитайте раздел Как использовать Docker документа Как установить и использовать Docker: Начало работы.

Шаг 2 — Установка Docker Compose

Теперь, когда у вас установлен Docker, давайте продолжим и установим Docker Compose. Сначала установите python-pip в качестве предварительного условия:

  1. sudo apt-get -y install python-pip

Затем вы можете установить Docker Compose:

  1. sudo pip install docker-compose

Шаг 3 — Запуск контейнера с помощью Docker Compose

Общедоступный реестр Docker, Docker Hub, содержит простой образ Hello World. Теперь, когда у нас установлен Docker Compose, давайте проверим его на очень простом примере.

Сначала создайте каталог для нашего файла YAML:

  1. mkdir hello-world

Затем перейдите в каталог:

  1. cd hello-world

Теперь создайте файл YAML с помощью вашего любимого текстового редактора (мы будем использовать nano):

  1. nano docker-compose.yml

Поместите в файл следующее содержимое, сохраните файл и выйдите из текстового редактора:

my-test:
  image: hello-world

Первая строка будет использоваться как часть имени контейнера. Вторая строка указывает, какой образ использовать для создания контейнера. Образ будет загружен из официального репозитория Docker Hub.

Находясь в каталоге ~/hello-world, выполните следующую команду, чтобы создать контейнер:

  1. docker-compose up

Вывод должен начинаться со следующего:

Output of docker-compose up
Creating helloworld_my-test_1... Attaching to helloworld_my-test_1 my-test_1 | my-test_1 | Hello from Docker. my-test_1 | This message shows that your installation appears to be working correctly. my-test_1 |

Затем вывод объясняет, что делает Docker:

  1. Клиент Docker связался с демоном Docker.
  2. Демон Docker извлек образ hello-world из Docker Hub.
  3. Демон Docker создал новый контейнер из этого образа, который запускает исполняемый файл, который создает выходные данные, которые вы сейчас читаете.
  4. Демон Docker передал этот вывод клиенту Docker, который отправил его на ваш терминал.

Если процесс не завершается сам по себе, нажмите CTRL-C.

Этот простой тест не показывает одно из основных преимуществ Docker Compose — возможность одновременно запускать и отключать группу контейнеров Docker. В статьях How To Install Wordpress и PhpMyAdmin с Docker Compose в Ubuntu 14.04 показано, как использовать Docker Compose для запуска трех контейнеров как одной группы приложений.

Шаг 4. Изучение команд Docker Compose

Давайте рассмотрим команды, которые поддерживает инструмент docker-compose.

Команда docker-compose работает для каждого каталога отдельно. У вас может быть несколько групп контейнеров Docker, работающих на одном компьютере — просто создайте один каталог для каждого контейнера и один файл docker-compose.yml для каждого контейнера внутри его каталога.

До сих пор мы запускали docker-compose up самостоятельно и использовали CTRL-C, чтобы закрыть его. Это позволяет отображать отладочные сообщения в окне терминала. Однако это не идеально, так как при работе в продакшене вы захотите, чтобы docker-compose действовал больше как сервис. Один простой способ сделать это — просто добавить параметр -d при up сеансе:

docker-compose up -d

docker-compose теперь будет переходить в фоновый режим.

Чтобы отобразить вашу группу контейнеров Docker (как остановленных, так и запущенных в данный момент), используйте следующую команду:

docker-compose ps

Например, ниже показано, что контейнер helloworld_my-test_1 остановлен:

Output of `docker-compose ps`
Name Command State Ports ----------------------------------------------- helloworld_my-test_1 /hello Exit 0

Запущенный контейнер покажет состояние Up:

Output of `docker-compose ps`
Name Command State Ports --------------------------------------------------------------- nginx_nginx_1 nginx -g daemon off; Up 443/tcp, 80/tcp

Чтобы остановить все запущенные контейнеры Docker для группы приложений, введите следующую команду в том же каталоге, где находится файл docker-compose.yml, используемый для запуска группы Docker:

docker-compose stop

Примечание. docker-compose kill также доступен, если вам нужно завершить работу более принудительно.

В некоторых случаях контейнеры Docker будут хранить свою старую информацию во внутреннем томе. Если вы хотите начать с нуля, вы можете использовать команду rm, чтобы полностью удалить все контейнеры, составляющие вашу группу контейнеров:

docker-compose rm 

Если вы попробуете любую из этих команд из каталога, отличного от каталога, содержащего контейнер Docker и файл .yml, он выдаст сообщение об ошибке и не покажет вам ваши контейнеры:

Output from wrong directory
Can't find a suitable configuration file in this directory or any parent. Are you in the right directory? Supported filenames: docker-compose.yml, docker-compose.yaml, fig.yml, fig.yaml

Шаг 5. Доступ к файловой системе контейнера Docker (необязательно)

Если вам нужно работать с командной строкой внутри контейнера, вы можете использовать команду docker exec.

Пример Hello World! завершает работу после запуска, поэтому нам нужно запустить контейнер, который будет продолжать работать, чтобы затем мы могли использовать docker exec для доступа к файловой системе контейнера. . Давайте посмотрим на образ Nginx из Docker Hub.

Создайте для него новый каталог и перейдите в него:

  1. mkdir ~/nginx && cd $_

Создайте файл docker-compose.yml в нашем новом каталоге:

  1. nano docker-compose.yml

и вставьте следующее:

nginx:
  image: nginx

Сохраните файл и выйдите. Нам просто нужно запустить контейнер Nginx как фоновый процесс с помощью следующей команды:

  1. docker-compose up -d

Образ Nginx будет загружен, а затем контейнер будет запущен в фоновом режиме.

Теперь нам нужен ID КОНТЕЙНЕРА для контейнера. Список всех запущенных контейнеров:

  1. docker ps

Вы увидите что-то похожее на следующее:

Output of `docker ps`
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e90e12f70418 nginx "nginx -g 'daemon off" 6 minutes ago Up 5 minutes 80/tcp, 443/tcp nginx_nginx_1

Примечание. В списке с командой docker ps отображаются только запущенные контейнеры.

Если бы мы хотели внести изменения в файловую систему внутри этого контейнера, мы бы взяли его идентификатор (в этом примере e90e12f70418) и использовали docker exec для запуска оболочки внутри контейнера. контейнер:

  1. docker exec -it e90e12f70418 /bin/bash

Параметр -t открывает терминал, а параметр -i делает его интерактивным. Параметры /bin/bash открывают оболочку bash для работающего контейнера. Обязательно используйте идентификатор для своего контейнера.

Вы увидите приглашение bash для контейнера, похожее на:

root@e90e12f70418:/#

Отсюда вы можете работать из командной строки. Однако имейте в виду, что если вы не находитесь в каталоге, сохраненном как часть тома данных, ваши изменения исчезнут, как только контейнер будет перезапущен. Еще одно предостережение заключается в том, что большинство образов Docker создаются с минимальными установками Linux, поэтому некоторые утилиты и инструменты командной строки, к которым вы привыкли, могут отсутствовать.

Заключение

Отлично, это охватывает основные концепции Docker Compose и способы его установки и запуска. Ознакомьтесь с руководством по развертыванию Wordpress и PHPMyAdmin с помощью Docker Compose в Ubuntu 14.04, где представлен более сложный пример развертывания приложения с помощью Docker Compose.

Полный список параметров конфигурации для файла docker-compose.yml см. в справочнике по файлу Compose.