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

1 min


докер

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

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

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

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

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

Конфигурация рабочего сервера с Docker.

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

Создать Dockerfile

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

touch Dockerfile

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

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

FROM ubuntu

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

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

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

docker exec -it  /bin/bash

И сохраните ваши изменения с:

docker commit  

Тем не менее, вы должны использовать это только для тестирования и делать все ваши фактические настройки в Dockerfile.

Команды Dockerfile

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

COPY

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

COPY  

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

COPY /config/nginx/ /etc/nginx/

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

БЕГАТЬ

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

RUN command

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

COPY install.sh .
RUN ./install.sh

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

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

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”Flag гарантирует, что это соединение доступно только для чтения, поэтому контейнер Docker не может вносить какие-либо изменения в хост-ОС. Это также можно использовать для предоставления контейнерам Docker доступа к постоянным данным, хранящимся в хост-ОС.


0 Comments

Ваш адрес email не будет опубликован. Обязательные поля помечены *