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

Вступление

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

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

В этом руководстве вы установите последнюю версию 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 с папкой на хост-компьютере. Это позволяет вам легкоshare files между контейнером Docker и хост-машиной.

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

Предпосылки

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

  • Сервер CentOS 7, настроенный пользователем без полномочий root с привилегиями sudo (подробности см. ВInitial Server Setup on CentOS 7)

  • Докер устанавливается в соответствии с инструкциями из Шага 1 и Шага 2How To Install and Use Docker on CentOS 7

Как только они будут на месте, вы будете готовы следовать.

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

Чтобы получить последний выпуск, возглавьтеDocker docs и установите Docker Compose из двоичного файла в репозитории Docker на GitHub.

Проверьтеcurrent release и, при необходимости, обновите его с помощью команды ниже:

sudo curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Далее, установите разрешения, чтобы сделать двоичный файл исполняемым:

sudo chmod +x /usr/local/bin/docker-compose

Затем убедитесь, что установка прошла успешно, проверив версию:

docker-compose --version

Это распечатает версию, которую вы установили:

Outputdocker-compose version 1.23.2, build 1110ad01

Теперь, когда у вас установлен Docker Compose, вы готовы запустить пример «Hello World».

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

Общедоступный реестр Docker, Docker Hub, содержит простой образ «Hello World» для демонстрации и тестирования. Он иллюстрирует минимальную конфигурацию, необходимую для запуска контейнера с использованием Docker Compose: файл YAML, который вызывает одно изображение.

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

mkdir hello-world

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

cd hello-world

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

vi docker-compose.yml

Войдите в режим вставки, нажавi, затем поместите в файл следующее содержимое:

docker-compose.yml

my-test:
  image: hello-world

Первая строка будет частью имени контейнера. Вторая строка указывает, какое изображение использовать для создания контейнера. Когда вы запускаете командуdocker-compose up, она будет искать локальный образ по указанному имениhello-world.

После этого нажмитеESC, чтобы выйти из режима вставки. Введите:x, затемENTER, чтобы сохранить и закрыть файл.

Чтобы вручную просмотреть изображения в вашей системе, используйте командуdocker images:

docker images

При отсутствии локальных изображений отображаются только заголовки столбцов:

OutputREPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

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

docker-compose up

Если при первом запуске команды нет локального образа с именемhello-world, Docker Compose извлечет его из общедоступного репозитория Docker Hub:

OutputPulling my-test (hello-world:)...
latest: Pulling from library/hello-world
1b930d010525: Pull complete
. . .

После извлечения образаdocker-compose создает контейнер, присоединяется и запускает программуhello, которая, в свою очередь, подтверждает, что установка работает:

Output. . .
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 |
. . .

Затем он напечатает объяснение того, что он сделал:

Output. . .
my-test_1  | To generate this message, Docker took the following steps:
my-test_1  |  1. The Docker client contacted the Docker daemon.
my-test_1  |  2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
my-test_1  |     (amd64)
my-test_1  |  3. The Docker daemon created a new container from that image which runs the
my-test_1  |     executable that produces the output you are currently reading.
my-test_1  |  4. The Docker daemon streamed that output to the Docker client, which sent it
my-test_1  |     to your terminal.
. . .

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

docker ps
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES

Используйте флаг-a, чтобы показать все контейнеры, а не только активные:

docker ps -a
OutputCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
50a99a0beebd        hello-world         "/hello"            3 minutes ago       Exited (0) 3 minutes ago                       hello-world_my-test_1

Теперь, когда вы протестировали запуск контейнера, вы можете перейти к изучению некоторых основных команд Docker Compose.

[[step-3-— learning-docker-compose-commands]] == Шаг 3. Изучение команд создания Docker

Чтобы начать работу с 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 -a

Если контейнер остановлен,State будет указан какExited, как показано в следующем примере:

Output        Name            Command   State    Ports
------------------------------------------------
hello-world_my-test_1   /hello    Exit 0

В работающем контейнере будет отображатьсяUp:

Output     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, он вернет ошибку:

OutputERROR:
        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

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

[[step-4-— accessing-the-docker-container-filesystem]] == Шаг 4. Доступ к файловой системе контейнера Docker

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

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

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

mkdir ~/nginx
cd ~/nginx

Затем создайте файлdocker-compose.yml в своем новом каталоге и откройте его в текстовом редакторе:

vi docker-compose.yml

Затем добавьте следующие строки в файл:

~/nginx/docker-compose.yml

nginx:
  image: nginx

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

docker-compose up -d

Docker Compose загрузит образ Nginx, и контейнер запустится в фоновом режиме.

Теперь вам понадобитсяCONTAINER ID для контейнера. Перечислите все контейнеры, которые работают с помощью следующей команды:

docker ps

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

Output of `docker ps`CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
b86b6699714c        nginx               "nginx -g 'daemon of…"   20 seconds ago      Up 19 seconds       80/tcp              nginx_nginx_1

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

docker exec -it b86b6699714c /bin/bash

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

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

root@b86b6699714c:/#

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

Заключение

Теперь вы установили Docker Compose, протестировали установку, выполнив пример «Hello World», и изучили некоторые основные команды.

Хотя пример «Hello World» подтвердил вашу установку, простая конфигурация не демонстрирует одно из основных преимуществ Docker Compose - возможность одновременного перемещения группы контейнеров Docker вверх и вниз. Чтобы увидеть мощь Docker Compose в действии, ознакомьтесь сHow To Secure a Containerized Node.js Application with Nginx, Let’s Encrypt, and Docker Compose иHow To Configure a Continuous Integration Testing Environment with Docker and Docker Compose on Ubuntu 16.04. Хотя эти руководства ориентированы на Ubuntu 16.04 и 18.04, шаги могут быть адаптированы для CentOS 7.

Related