Как запустить файл docker compose

Обновлено: 07.07.2024

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

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

Общие понятия Docker и Docker Compose

Прежде чем приступить к работе с Docker Compose, нужно ознакомиться с основными понятиями Docker.

Образы Docker

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

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

Взаимодействие между образами Docker

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

Следующий метод – использование томов данных Docker. Тома Docker бывают двух видов – внутренние и общие. По умолчанию после перезагрузки или отключения контейнера данные будут потеряны; контейнер, по сути, возвращается в состояние, в котором он находился до запуска. Это удобно при тестировании или разработке (поскольку обеспечивает одинаковую среду при каждом новом запуске контейнера), однако совсем не подходит для среды производства (поскольку после перезапуска весь добавленный контент будет потерян). Внутренний том Docker позволяет сохранять данные определённой папки отдельного контейнера Docker. Например, чтобы сохранить содержимое лог-файлов после перезагрузки, можно создать внутренний том для /var/log.

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

Требования

Для выполнения руководства понадобится:

  • Сервер Ubuntu 14.04
  • Не-root пользователь с доступом к sudo (подробнее об этом – в руководстве по начальной настройке сервера).

1: Установка Docker

Установите Docker, если ранее он не был установлен.

Проще всего это сделать при помощи установочного скрипта; загрузите и установите его (будет запрошен пароль sudo):

Эта команда загрузит и выполнит скрипт, написанный командой Docker.

Для работы с Docker пользователя нужно настроить соответствующим образом. Добавьте пользователя в группу docker.

sudo usermod -aG docker $(whoami)

2: Установка Docker Compose

После установки Docker можно приступать к установке Docker Compose. Для начала установите python-pip:

sudo apt-get -y install python-pip

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

sudo pip install docker-compose

3: Запуск контейнера при помощи Docker Compose

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

Создайте каталог для YAML-файла:

Откройте этот каталог:

Создайте YAML-файл при помощи текстового редактора:

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

my-test:
image: hello-world

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

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

На экране должен появиться примерно такой вывод:

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:

  • Клиент Docker подключается к демону Docker.
  • Демон загружает образ hello-world с Docker Hub.
  • Демон создаёт из этого образа новый контейнер.
  • Демон передаёт полученный вывод клиенту Docker, а он возвращает его в терминал.

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

4: Команды Docker Compose

Рассмотрим команды, которые поддерживает Docker Compose.

Команда docker-compose работает на уровне каталога. На одной машине можно иметь несколько групп контейнеров; для этого нужно создать отдельный каталог и отдельный файл docker-compose.yml для каждого контейнера.

docker-compose up -d

Эта команда запускает docker-compose в фоновом режиме.

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

К примеру, вывод может иметь такой вид (этот вывод сообщает, что контейнер helloworld_my-test_1 отключен):

Name Command State Ports
-----------------------------------------------
helloworld_my-test_1 /hello Exit 0

Состояние запущенных контейнеров – Up:

Name Command State Ports
---------------------------------------------------------------
nginx_nginx_1 nginx -g daemon off; Up 443/tcp, 80/tcp

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

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

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

Если запустить эту команду в другом каталоге (не в том, в котором хранится контейнер Docker и yml-файл), команда вернёт ошибку:

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.

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

Создайте файл docker-compose.yml:

Вставьте в него следующий код:

nginx:
image: nginx

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

docker-compose up -d

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

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

На экране появится примерно такой вывод:

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 exec -it e90e12f70418 /bin/bash

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

Теперь можно взаимодействовать с контейнером из командной строки.

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

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

Большим преимуществом использования Compose является то, что можно определить стек приложения в файле, сохранить его в корне репозитория проекта (теперь поддерживается управление версиями) и легко предоставить другому пользователю возможность участвовать в проекте. Другому пользователю достаточно будет только клонировать репозиторий и начать создание приложения. Фактически в GitHub и GitLab можно увидеть достаточно много проектов, использующих эту возможность.

С чего же начать работу?

Установка Docker Compose

Если вы установили Docker Desktop для Windows или Mac, то у вас уже есть Docker Compose. В экземплярах "Play-with-Docker" уже установлен Docker Compose. Если вы используете компьютер Linux, необходимо установить Docker Compose с помощью приведенных здесь инструкций.

После установки вы сможете запустить следующую команду и просмотреть сведения о версии.

Создание файла Compose

В корне проекта приложения создайте файл с именем docker-compose.yml .

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

Затем определим список служб (или контейнеров), которые требуется использовать как часть приложения.

Теперь приступим к переносу службы в файл Compose.

Определение службы приложений

Напомним, что эту команду вы использовали для определения контейнера приложения (замените в Windows PowerShell символы \ на символы ` ).

Сначала определите запись службы и образ для контейнера. Для службы можно выбрать любое имя. Имя будет автоматически преобразовано в сетевой псевдоним, что будет полезно при определении службы MySQL.

Как правило, команда будет похожа на определение image , хотя для упорядочивания нет требований. Итак, добавьте это в файл.

Перенесите часть команды -p 3000:3000 , определив параметры ports службы. Здесь мы будем использовать короткий синтаксис, но также доступен более подробный длинный синтаксис.

Затем перенесите рабочий каталог ( -w /app ) и сопоставление томов ( -v $:/app ) с помощью определений working_dir и volumes . Для томов также существует короткий и длинный синтаксис.

Одним из преимуществ определений томов Docker Compose является использование относительных путей из текущего каталога.

Наконец, перенесите определения переменных среды с помощью ключа environment .

Определение службы MySQL

Теперь пора определить службу MySQL. Для этого контейнера использовалась следующая команда (замените в Windows PowerShell символы \ на символы ` ).

Сначала определите новую службу и назовите ее mysql , чтобы она автоматически получила сетевой псевдоним. Укажите также используемый образ.

Затем определите сопоставление томов. При запуске контейнера с помощью команды docker run именованный том создавался автоматически. Однако это не происходит при запуске через Compose. Необходимо определить том в разделе верхнего уровня volumes: , а затем указать точку подключения в конфигурации службы. Если указать только имя тома, будут использоваться параметры по умолчанию. Но есть и много других доступных параметров.

Наконец, осталось указать переменные среды.

На этом этапе полный файл docker-compose.yml должен выглядеть следующим образом.

Запуск стека приложений

Теперь, когда у вас есть файл docker-compose.yml , его можно запустить.

Сначала убедитесь, что никакие другие копии приложения и базы данных не запущены ( docker ps и docker rm -f <ids> ).

Запустите стек приложений с помощью команды docker-compose up . Добавьте флаг -d , чтобы выполнить все в фоновом режиме. Либо можно щелкнуть правой кнопкой мыши файл Compose и выбрать параметр Compose Up (запустить Compose) на боковой панели VS Code.

После запуска должны отобразиться примерно следующие выходные данные.

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

Просмотрите журналы с помощью команды docker-compose logs -f . Отобразятся журналы каждой из служб, которые чередуются в одном потоке. Это чрезвычайно полезно, когда необходимо отслеживать проблемы, связанные с временем. Флаг -f дает команду "следовать за журналом", поэтому выходные данные будут выдаваться в режиме реального времени по мере их создания.

Если вы еще этого не сделали, вы увидите следующий результат.

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

На этом этапе вы сможете открыть приложение и увидеть, что оно запускается. И постойте! Вы сделали это с помощью одной команды!

Просмотр стека приложений в расширении Docker

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

Расширение VS с Compose

Если развернуть сеть, вы увидите два контейнера, которые вы определили в файле Compose.

Расширение VS с развернутым Compose

Завершение работы

Когда необходимо завершить работу, просто выполните команду docker-compose down или щелкните правой кнопкой мыши приложение в списке контейнеров в расширении Docker VS Code и выберите Compose Down (завершить Compose). Контейнеры будут остановлены, а сеть удалена.

Удаление томов. По умолчанию именованные тома в файле Compose не удаляются при выполнении команды docker-compose down . Если вы хотите удалить тома, необходимо добавить флаг --volumes .

После завершения работы можно переключиться на другой проект, запустить docker-compose up и подготовиться к работе с этим проектом. На самом деле нет ничего проще!

Резюме

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

Сейчас начинается завершающий этап обучения. Однако есть несколько рекомендаций по созданию образов, которые необходимо осветить, поскольку есть большая проблема с Dockerfile, который вы использовали. Так что давайте взглянем на это.


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

Мы установим его, напишем простой файл Compose и запустим контейнер.

Затем мы увидим, как запустить несколько контейнеров.

Вступление

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

Но часто приложения требуют, чтобы разные контейнеры работали и общались друг с другом.

Соединяя их через сеть, заставляя их совместно использовать тома диска, и передавая переменные среды, можно легко превратить в последовательность команд, которые сложно документировать и поддерживать с течением времени.

Тут на помощь приходит Docker Compose.

Давайте начнем его устанавливать, а затем напишем файл Compose.

Установка Docker Compose

В Ubuntu 18.04 установить Docker Composer просто:

Чтобы проверить установку, вы можете проверить его версию:

Версии Docker Engine и Docker Compose важны, так как их выпуски встречаются часто, а функции добавляются и удаляются.

Показанная выше версия (1.17.1) была выпущена в ноябре 2017 года.

Если вам нужен более новый выпуск, вы можете либо включить репозиторий Ubuntu Universe и получить более новый пакет, либо даже загрузить и установить последний выпуск непосредственно с веб-сайта Docker Compose:

Файл Docker Compose

Docker Compose читает файл YAML, который обычно называется docker-compose.yml.

В начале, синтаксическая версия сообщается как 3.

Далее, в разделе служб указан только один контейнер (apache), а теги image, container_name, ports и volume используются для описания того, как он должен выполняться.

Теперь создайте каталог с именем www и поместите этот файл index.html внутрь.

Команды Docker Compose

Команда up позаботится обо всем: загрузить зобразы из Docker Hub, если они еще не существуют в локальном кэше, создать пользовательские образа (что не так; мы рассмотрим это в следующем разделе) и запустить контейнеры.

Ключ -d указывает Docker Compose запускать контейнеры в фоновом режиме.

Если вместо docker-compose.yml используется другое имя файла, это можно сообщить с помощью -f.

Обратите внимание, что команда запуска намного проще, чем аналог запуска Docker.

У него есть еще два преимущества: он не изменяется независимо от содержимого файла Compose, и если в файле Compose указано более одного контейнера, все они будут запущены.

Для сравнения команда docker run будет выглядеть так:

Если вы получаете синтаксические ошибки, проверьте синтаксис YAML с помощью онлайн-парсера, такого как этот.

Вы можете проверить, работает ли контейнер.

Запуск нескольких контейнеров

Давайте теперь посмотрим на более сложный файл Compose.

Давайте представим, что мы собираемся настроить локальную среду для разработки приложения LAMP.

Нам нужен контейнер с Apache и PHP, другой контейнер с MySQL и, возможно, контейнер PHPMyAdmin для взаимодействия с MySQL. Docker-compose.yml будет:

Этот файл Compose запускает три контейнера, каждый из которых имеет раздел под службами.

Обратите внимание, что мы определяем некоторые переменные окружения под окружением.

Определение restart: всегда указывает Docker автоматически запускать контейнеры при запуске службы Docker (например, в случае перезагрузки).

Команда для запуска трех контейнеров такая же, как в предыдущем простом примере.

Легко запомнить, верно?

Проверьте, созданы ли контейнеры.

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

Например, мы не открывали порт 3306 службы MySQL (как видно из приведенного выше вывода), но PHPMyAdmin может получить доступ к этому порту.

Создание образов с помощью Docker Compose

Если вам нужно создать образ, а не использовать существующее, просто добавьте тег сборки.

В приведенном ниже примере мы говорим Docker Compose найти текущий каталог для Dockerfile.

Тег образа будет использоваться для названия нового образа.

Переопределение с использованием нескольких файлов Docker Compose

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

Вам просто нужно создать вызываемые файлы переопределения и запустить контейнеры, указав их.

Они перезапишут предыдущие определения, сделанные в базовом файле Compose.

Например, давайте создадим файл переопределения с именем docker-compose-prod.yml и определим другой пароль для MySQL.

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

И тогда вы можете выполнить команду ниже.

Важно следить за порядком файлов.

Можно использовать несколько файлов.

В нашем примере будет переопределен только раздел среды службы mysql.

После проверки работы контейнеров попробуйте получить доступ к PHPMyAdmin с использованием новых учетных данных.

Заключение

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

Существует множество возможностей, и настоятельно рекомендуется прочитать руководство по Docker Compose.

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

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

Например, для веб-приложения уже нужна база данных, веб-сервер, и возможно ещё интерпретатор PHP. Это уже три контейнера, настраивать и запускать их вручную не удобно, поэтому была придумана утилита docker-compose, которая позволяет управлять группами контейнеров, создавать их, настраивать, а также удалять одной командой. В этой статье мы разберемся как пользоваться docker для чайников. Подробно рассмотрим docker-compose, а также реальное применение утилиты.

Использование Docker для чайников

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

1. Установка docker-compose

Если программа ещё не установлена, её необходимо установить. Для этого надо просто скачать исполняемый файл из официального сайта разработчиков:

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

И дать ему права на выполнение:

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

После этого вы сможете посмотреть её версию:

2. Создание проекта

Если вы уже видели проекты, использующие docker, то, наверное, замечали, что в папке с проектом лежит файл под названием docker-compose.yaml. Именно в этом файле настраиваются контейнеры, которые надо создать для вашего проекта, потом они будут созданы автоматически с помощью docker-compose. Файл использует синтаксис YAML и должен содержать такие данные:

Версия указывает на версию синтаксиса файла, в разных версиях доступны разные ключевые слова, это сделано для обратной совместимости. Мы будем использовать версию 3.5. Далее нужно перечислить хранилища (volumes), сети (networks) и сами контейнеры.

Синтаксис YAML похож на JSON, здесь тоже есть пары ключ: значение, разделенные двоеточием, только тут значение может быть вообще нулевым, может содержать другие ключи, а также оно может быть массивом значений, тогда каждый элемент массива начинается с чёрточки "-". Но в отличие от JSON, здесь очень важны отступы, чтобы показать вложенность значений, поэтому не теряйте их.

Давайте создадим папку losst-docker и создадим в ней файл docker-compose.yaml:

version: '3.5'
services:


3. Добавление контейнеров

Рассмотрим содержимое самого простого пункта настройки контейнера:

Здесь нам обязательно надо указать имя будущего контейнера, а также образ, на основании которого он будет создан. Через двоеточие можно указывать версию контейнера. Версии можно посмотреть на Dockerhub они там отмечены как tags. Если версия не указана используется latest, последняя.

Например, добавим контейнер для веб-сервера Nginx:


Уже имея эти данные в конфигурационном файле можно запускать контейнер.

4. Запуск контейнеров

Когда настройка docker завершена, надо запускать полученные контейнеры. Чтобы запустить группу контейнеров, настроенную в docker-compose.yaml необходимо перейти в папку, где находится этот файл конфигурации и выполнить там команду docker-compose up. Например:


После этого контейнеры будут запущены, все их потоки вывода будут объединены в один и вам будет выводится информация в терминал. Чтобы остановить контейнеры достаточно нажать Ctrl+C. Если вы хотите запустить контейнеры в фоновом режиме используйте опцию -d:

docker-compose up -d


Остановить контейнеры, запущенные в фоновом режиме можно командой stop:

Команда down не просто останавливает все запущенные контейнеры, но и удаляет их:


Остановите пока этот контейнер, мы продолжим его настройку.

5. Порты контейнера

Контейнер работает, но толку пока нам от него мало. С помощью docker мы можем пробросить порт 80 контейнера в основную операционную систему и получить к нему доступ. Для этого используйте директиву ports. Синтаксис такой:

ports:
- внешний_порт : внутренний порт

Например, пробросим порт 80 как 8094:



Но это все ещё не интересно, потому что мы не можем размещать там свои файлы. Сейчас это исправим.

6. Монтирование папок

Для монтирования хранилищ или внешних папок хоста используется пункт volumes. Синтаксис очень похож на работу с портами:

volumes:
- /путь/к/внешней/папке : /путь/к/внутренней/папке

Например, давайте создадим в текущей папке проекта файл index.html и смонтируем эту папку вместо папки /usr/share/nginx/html/ контейнера:

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


7. Настройка хранилищ

Мы можем монтировать к контейнеру не только внешние папки, но и хранилища, создаваемые в docker. Для этого сначала надо добавить хранилище в главную секцию volumes. Например losst-vl:

Большинству веб приложений необходима база данных, например, MySQL. Добавим ещё один контейнер для этой базы данных и добавим в него наше хранилище. Хранилище добавляется также, как и внешняя папка, только вместо папки указывается название хранилища:


Здесь мы ещё добавили пункт environment, в котором задали переменные окружения для контейнера. Они необходимы, для того, чтобы указать имя базы данных и пароль root, которые будут использоваться по умолчанию. Как видите, с переменными окружения нет ничего сложного.


8. Настройка сети

Контейнеры должны взаимодействовать между собой. У нас уже есть Nginx и MySQL, им пока не нужно обращаться друг к другу, но как только у нас появится контейнер для PhpMyAdmin, которому надо обращаться к MariaDB ситуация поменяется. Для взаимодействия между контейнерами используются виртуальные сети, они добавляются похожим образом на хранилища. Сначала добавьте сеть в глобальную секцию networks:

Затем для каждого контейнера, которые будут иметь доступ к этой сети, надо добавить сеть в раздел networks.

Далее контейнеры будут доступны по сети по их имени. Например, добавим PhpMyAdmin и дадим ему доступ к базе данных:



9. Модификация контейнера

Это уже более сложные вещи, но зато вы разберетесь с Docker на практике. В большинстве случаев можно обойтись без модификации контейнера, иногда туда надо скопировать специфические конфигурационные файлы либо установить дополнительное программное обеспечение, для таких случаев docker-compose позволяет создавать свои контейнеры на основе уже существующих образов. Для этого надо создать файл Dockerfile на основе которого будет создаваться контейнер. Давайте добавим контейнер php-fpm и установим в него несколько расширений php с помощью Dockerfile.

Сначала создадим папку для файлов контейнера:

FROM php:7.2.26-fpm-stretch
RUN docker-php-ext-install pdo pdo_mysql pcntl

Вот основные директивы, которые можно использовать в этом файле:

  • FROM - образ, на основе которого будет создаваться наш образ;
  • RUN - выполнить команду в окружении образа;
  • COPY - скопировать файл в образ;
  • WORKDIR - задать рабочую папку для образа;
  • ENV - задать переменную окружения образа;
  • CMD - задать основной процесс образа;

Теперь надо добавить новую секцию в наш docker-compose.yaml. Здесь вместо image мы используем директиву build, которой надо передать путь к папке с конфигурацией образа:

Дальше, раз мы уже добавили php-fpm надо примонтировать для Nginx верный конфиг, который будет поддерживать php-fpm. Создайте папку nginx и поместите в неё такой конфигурационный файл:

server listen 80;
server_name _ !default;
root /var/www/;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
index index.html index.htm index.php;
charset utf-8;
location / try_files $uri $uri/ /index.php?$query_string;
>
error_page 404 /index.php;
location

\.php$ fastcgi_pass docker-php-fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
>
>


Осталось создать файл index.php и можно тестировать:

Теперь можно запускать контейнеры:


В отличие от предыдущего раза, теперь перед запуском будет собран новый контейнер на основе файла Dockerfile. Такие контейнеры собираются только первый раз, если они не существуют. Чтобы их пересобрать используйте опцию --build:

docker-compose up --build

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

10. Подключение к контейнеру

С помощью docker-compose вы можете подключится к любому контейнеру из группы. Для этого просто используйте команду exec. Например, запустите проект в фоновом режиме:

docker-compose up -d

И используйте docker-compose exec. Подключимся к контейнеру с Nginx:

docker-compose exec docker-nginx /bin/bash


Перед вами откроется оболочка Bash этого контейнера. Устанавливать здесь что-то вручную не рекомендуется, так как всё сотрётся после удаления контейнера, но для тестирования работы чего либо такая возможность будет очень кстати.

Выводы

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

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.


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

И еще одно определение докера:


Сущности Docker: docker daemon, container, image, Dockerfile, Docker Registry

В Docker используется архитектура клиент/сервер, в соответствии с которой клиент взаимодействует с демоном Docker, а тот предоставляет все необходимые клиенту услуги.


Рассмотрим компоненты рабочего процесса и инструменты для управления контейнерами и их развертывания, составляющие экосистему Docker:

Что такое docker image (образ)

Образ Docker состоит из набора файлов, которые объединяют воедино все необходимое, например installations, application code, и dependencies, необходимые для настройки полностью работоспособной среды контейнера. Вы можете создать образ Docker одним из двух способов:

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


  • Dockerfile: путем создания текстового файла, известного как Dockerfile, который предоставляет спецификации для создания образа Docker.


С физической точки зрения docker image состоит из набора слоев, доступных только для чтения (read-only layers). Слои image работают следующим образом:

Читайте также: