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

Вступление

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

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

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

Docker и Docker составляют концепции

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

Docker Images

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

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

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

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

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

Другой часто используемый метод - этоDocker data volume. Тома Docker бывают двух видов - внутренний и общий.

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

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

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

Предпосылки

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

  • Ubuntu 14.04 Droplet

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

[[step-1 -—- install-docker]] == Шаг 1. Установка Docker

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

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

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

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

sudo usermod -aG docker $(whoami)

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

[.note] #Note: Чтобы узнать больше о том, как использовать Docker, прочтите разделHow to Use Docker вHow To Install and Use Docker: Getting Started.
#

[[step-2 -—- install-docker-compose]] == Шаг 2 - Установка Docker Compose

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

sudo apt-get -y install python-pip

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

sudo pip install docker-compose

[[step-3 -—- running-a-container-with-docker-compose]] == Шаг 3. Запуск контейнера с помощью Docker Compose

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

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

mkdir hello-world

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

cd hello-world

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

nano docker-compose.yml

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

docker-compose.yml

my-test:
  image: hello-world

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

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

docker-compose up

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

Output of docker-compose upCreating 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 вытащил изображение «привет мира» из Docker Hub.

  3. Демон Docker создал новый контейнер из этого образа, который запускает исполняемый файл, который производит вывод, который вы сейчас читаете.

  4. Демон Docker направил этот вывод клиенту Docker, который отправил его на ваш терминал.

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

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

[[step-4-— learning-docker-compose-commands]] == Шаг 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

[.note] #Note: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

[[step-5-— accessing-the-docker-container-filesystem-optional]] == Шаг 5. Доступ к файловой системе контейнера Docker (необязательно)

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

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

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

mkdir ~/nginx && cd $_

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

nano docker-compose.yml

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

~/nginx/docker-compose.yml

nginx:
  image: nginx

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

docker-compose up -d

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

Теперь нам нуженCONTAINER ID для контейнера. Список всех запущенных контейнеров:

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

[.note] #Note: Только контейнерыrunning перечислены с помощью командыdocker ps.
#

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

docker exec -it e90e12f70418 /bin/bash

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

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

root@e90e12f70418:/#

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

Заключение

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

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

Related