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

Как упаковать инфраструктуру вашего приложения с помощью Docker


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

Что такое Docker и почему он полезен?

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

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

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

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

Создать Dockerfile

Точка входа для сборки вашего контейнера называется Dockerfile. Создайте новый каталог проекта для размещения ваших файлов, а затем создайте новый файл Dockerfile с простым именем Dockerfile без расширения:

touch Dockerfile

Откройте этот файл в вашем любимом текстовом редакторе.

Вы, вероятно, не хотите начинать все с нуля, поэтому вы можете разветвить существующий образ из Docker Hub, например Ubuntu:

FROM ubuntu

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

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

Вы можете выполнить большинство этих команд из командной строки и настроить образ вручную. Если вы хотите получить оболочку bash в контейнере, вы можете запустить:

docker exec -it <container> /bin/bash

И сохраните изменения с помощью:

docker commit <container> <name>

Однако вы должны использовать это только для тестирования и выполнять всю свою фактическую настройку в Dockerfile.

Команды Dockerfile

Мы рассмотрим большинство распространенных команд и объясним их использование и рекомендации по их применению. Для получения более подробной информации вы можете обратиться к этой памятке или к записи документации «Лучшие методы написания файлов Dockerfile».

КОПИРОВАТЬ

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

COPY <source> <destination>

Например, если у вас есть папка в каталоге вашего проекта с именем /config/nginx/ , содержащая ваш nginx.conf, sites-available/ , и другие каталоги, вы можете скопировать его в расположение конфигурации nginx по умолчанию в вашем контейнере:

COPY /config/nginx/ /etc/nginx/

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

БЕГАТЬ

Инструкция RUN запускает команду в вашем контейнере и сохраняет изменения в файловой системе контейнера.

RUN command

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

COPY install.sh .
RUN ./install.sh

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

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

CMD

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

CMD executable

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

docker run container executable [args]

ВХОДНАЯ ТОЧКА

ENTRYPOINT – это специальная версия CMD , позволяющая запускать контейнер как исполняемый файл. Например, если все, что делает контейнер, — это запуск nginx, вы можете указать nginx в качестве ENTRYPOINT:

ENTRYPOINT nginx

А затем запустите этот контейнер в командной строке, передав аргументы в качестве аргументов точке входа:

docker run container [args]

РАЗОБЛАЧАТЬ

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

EXPOSE 80

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

Запуск вашего приложения

Во-первых, вам нужно создать свой образ:

docker build -t container .

Вы можете запустить свой контейнер с помощью docker run:

docker run container

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

docker run -p 3000:80 nginx

Это запустит контейнер nginx и привяжет вывод HTTP контейнера к порту 3000 на локальном компьютере.

Однако при стандартной настройке вам придется перестраивать контейнер Docker каждый раз, когда вы вносите изменения в свое приложение. Очевидно, что это далеко не идеально, но, к счастью, есть способы обойти это. Один из способов — смонтировать том в вашем контейнере, чтобы сформировать связь в реальном времени между вашим контейнером и хост-ОС (где вы занимаетесь разработкой). Например, если ваш исходный код HTML находится в папке src/html/ каталога вашего проекта Docker, вы можете смонтировать его в /usr/local/nginx/html/ с помощью :

docker run -p 80:80 -v ./src/html/:/usr/local/nginx/html:ro container

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