Как завернуть nginx приложение в docker
Docker – самое распространенное программное обеспечение для контейнеризации на сегодняшний день. Эта платформа позволяет разработчикам быстро пакетировать приложения вместе с необходимой средой, благодаря чему ускоряется итерация и повышается продуктивность ресурса. При этом каждый запуск выполняется в требуемой среде. Docker Compose – это инструмент для управления контейнерами, который отвечает современным требованиям приложений. Он позволяет запускать несколько взаимосвязанных контейнеров одновременно. В отличие от ручного запуска, инструменты оркестровки дают разработчикам возможность одновременно контролировать, масштабировать и расширять контейнер.
В этом мануале вы научитесь развертывать простое приложение Go. В качестве маршрутизатора запросов используется gorilla/mux, а в качестве веб-сервера – Nginx. Все это будет помещено в контейнеры Docker, организованные с помощью Docker Compose. В качестве обратного прокси используется nginx-proxy
Требования
1: Создание простого веб-приложения Go
На данном этапе нужно подготовить рабочее пространство и создать простое приложение Go, которое позже вы сможете контейнеризовать. Это приложение будет использовать гибкий и быстрый маршрутизатор запросов gorilla/mux.
Войдите как 8host:
В этом мануале данные будут храниться в каталоге
/go-docker. Создайте его:
Перейдите в этот каталог:
Код приложения Go будет храниться в файле по имени main.go. Создайте его:
Добавьте в него эти строки:
package main
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
)
func main() r := mux.NewRouter()
r.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) fmt.Fprintf(w, "<h1>This is the homepage. Try /hello and /hello/8host\n</h1>")
>)
r.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) fmt.Fprintf(w, "<h1>Hello from Docker!\n</h1>")
>)
r.HandleFunc("/hello/", func(w http.ResponseWriter, r *http.Request) vars := mux.Vars(r)
title := vars["name"] fmt.Fprintf(w, "<h1>Hello, %s!\n</h1>", title)
>)
http.ListenAndServe(":80", r)
>
Сохраните и закройте файл.
Перед запуском приложения Go сначала необходимо скомпилировать и упаковать его для работы внутри контейнера Docker. Go – это компилируемый язык, поэтому перед запуском программы компилятор переводит программный код в исполняемый машинный код.
Хранить конфигурацию Docker Compose для nginx-proxy нужно в файле nginx-proxy-compose.yaml. Создайте его:
Поместите в файл следующее:
version: '2'
services:
nginx-proxy:
restart: always
image: jwilder/nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- "/etc/nginx/vhost.d"
- "/usr/share/nginx/html"
- "/var/run/docker.sock:/tmp/docker.sock:ro"
- "/etc/nginx/certs"
letsencrypt-nginx-proxy-companion:
restart: always
image: jrcs/letsencrypt-nginx-proxy-companion
volumes:
- "/var/run/docker.sock:/var/run/docker.sock:ro"
volumes_from:
- "nginx-proxy"
Сохраните и закройте файл.
docker-compose -f nginx-proxy-compose.yaml up -d
Docker Compose принимает пользовательский именованный файл через флаг -f. Команда up запускает контейнеры, а флаг -d переводит их в фоновый режим.
Окончательный код будет выглядеть так:
Creating network "go-docker_default" with the default driver
Pulling nginx-proxy (jwilder/nginx-proxy:).
latest: Pulling from jwilder/nginx-proxy
a5a6f2f73cd8: Pull complete
2343eb083a4e: Pull complete
.
Digest: sha256:619f390f49c62ece1f21dfa162fa5748e6ada15742e034fb86127e6f443b40bd
Status: Downloaded newer image for jwilder/nginx-proxy:latest
Pulling letsencrypt-nginx-proxy-companion (jrcs/letsencrypt-nginx-proxy-companion:).
latest: Pulling from jrcs/letsencrypt-nginx-proxy-companion
.
Creating go-docker_nginx-proxy_1 . done
Creating go-docker_letsencrypt-nginx-proxy-companion_1 . done
3: Докеризация веб-приложения Go
На этом этапе вы создадите Dockerfile, содержащий инструкции о том, как Docker будет создавать постоянный образ для вашего веб-приложения Go. Docker создает постоянный образ приложения, похожий на снимок контейнера, используя инструкции из файла Dockerfile. Постоянство, неизменяемость образа гарантируют, что при каждом запуске контейнера на основе конкретного образа получается одно и то же окружение.
Поместите в него такой код:
FROM golang:alpine AS build
RUN apk --no-cache add gcc g++ make git
WORKDIR /go/src/app
COPY . .
RUN go get ./.
RUN GOOS=linux go build -ldflags="-s -w" -o ./bin/web-app ./main.go
FROM alpine:3.9
RUN apk --no-cache add ca-certificates
WORKDIR /usr/bin
COPY --from=build /go/src/app/bin /go/bin
EXPOSE 80
ENTRYPOINT /go/bin/web-app --port 80
Этот Dockerfile состоит из двух частей. На первом этапе используется база golang:alpine, которая содержит предустановленную версию Go на Alpine Linux.
Второй этап основан на alpine:3.9 (Alpine Linux 3.9). Он устанавливает сертификаты доверенного ЦС, копирует скомпилированные двоичные файлы приложения с первого этапа в текущий образ, открывает порт 80 и устанавливает двоичный файл приложения в качестве точки входа в образ.
Сохраните и закройте файл.
Вы создали Dockerfile для своего приложения Go, который будет извлекать пакеты, компилировать их для релиза и запускать приложение при создании контейнера. Теперь нужно будет создать yaml-файл Docker Compose и протестировать приложение, запустив его в Docker.
4: Создание и запуск файла Docker Compose
Теперь нужно создать файл для Docker Compose и написать конфигурацию для запуска образа Docker, созданного на предыдущем этапе. Затем мы его запустим и убедимся, что он работает правильно. В общем конфигурационный файл Docker Compose определяет контейнеры, их настройки, сети и тома, которые требуются приложению. Вы также можете указать, что эти элементы должны запускаться и останавливаться одновременно, как один.
Хранить конфигурацию Docker Compose для веб-приложения Go нужно в файле go-app-compose.yaml. Создайте его:
Добавьте следующие строки в этот файл:
Эта конфигурация Docker Compose содержит один контейнер (go-web-app), который будет вашим веб-приложением Go. Файл собирает приложение, используя Dockerfile, который вы создали на предыдущем этапе, и принимает в качестве контекста для сборки текущий каталог, содержащий исходный код. Кроме того, он устанавливает две переменные среды: VIRTUAL_HOST и LETSENCRYPT_HOST. nginx-proxy использует VIRTUAL_HOST, чтобы узнать, с какого домена принимать запросы. Переменная LETSENCRYPT_HOST указывает имя домена для генерации сертификатов TLS (оно должно совпадать с VIRTUAL_HOST, если домен указан без подстановочных знаков).
Теперь запустите веб-приложение Go в фоновом режиме с помощью Docker Compose:
docker-compose -f go-app-compose.yaml up -d
Окончательный результат будет выглядеть следующим образом:
Creating network "go-docker_default" with the default driver
Building go-web-app
Step 1/12 : FROM golang:alpine AS build
---> b97a72b8e97d
.
Successfully tagged go-docker_go-web-app:latest
WARNING: Image for service go-web-app was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating go-docker_go-web-app_1 . done
Если вы просмотрите вывод, представленный после выполнения команды, вы увидите, что Docker регистрирует каждый шаг сборки образа приложения в соответствии с конфигурацией в Dockerfile.
This is the homepage. Try /hello and /hello/8host
Hello from Docker!
Итак, вы создали файл Docker Compose и написали конфигурацию для запуска приложения Go внутри контейнера.
Заключение
Для начала нам нужно какое-то веб-приложение, которое будет обслуживаться сервером Nginx. Вы можете использовать любой JavaScript-фреймворк, в нашем примере мы используем демо-проект Angular:
В результате выполнения указанных команд будет создано новое приложение Angular, находящееся в папке $PWD/dist/angular-nginx-docker . Этот каталог содержит файл index.html и несколько типичных для одностраничного приложения JavaScript и CSS файлов. Приложение, весь код и команды из этой статьи находятся в GitHub-репозитории.
Nginx и Docker на удивление хорошо работают вместе. Вместо того чтобы устанавливать Nginx на нашу машину напрямую, мы будем запускать его в Docker на примере nginx:alpine.
Образ nginx:alpine очень производителен, хотя занимает лишь около 20 Мб дискового пространства. Для интерактивного запуска образа nginx: alpine в контейнере мы выполняем следующую команду:
Без дополнительных настроек Nginx использует дефолтные файлы конфигурации веб-сервера. Если вам интересно, вы можете использовать следующие команды для их изучения в Docker-образе:
Исходная конфигурация NGINX уже может обслуживать наше приложение. Но мы можем оптимизировать веб-сервер, создав папку .nginx и поместив в нее конфигурационный файл nginx.conf со следующим содержимым:
Каталог .nginx используется для организации файлов конфигурации для Nginx. По большей части файл конфигурации не требует пояснений, стоит упомянуть лишь о двух моментах:
Мы также можем использовать другие параметры конфигурации, которые повысят производительность, безопасность и масштабируемость Nginx. К примеру, для реальных приложений в файле nginx.conf понадобится настроить SSL-сертификат. Чтобы узнать больше о конфигурациях Nginx, ознакомьтесь с руководством для новичков в Nginx.
Чтобы Nginx мог использовать настроенный файл nginx.conf , запускаем следующую команду:
Эта команда подключает два read-only-тома к контейнеру Docker. Один том соответствует нашему приложению с контейнером, а другой – сопоставит файл nginx.conf в качестве файла конфигурации.
В предыдущем разделе мы научились работать с нашим одностраничным приложением, используя Nginx в контейнере. Мы также можем отправлять наше приложение вкупе с Nginx в виде Docker-образа в контейнеры других сред. Контейнерные приложения дают ряд преимуществ: простота обновления, локализация сбоев, простая смена технологии. Так что теперь мы создадим Docker-образ, содержащий и веб-приложение, и сервер Nginx, который при запуске Docker-образа будет его автоматически обслуживать.
Чтобы получить Docker-образ, создаём следующий Dockerfile :
Этот Dockerfile включает две фазы создания Docker-образа. Сначала он стягивает образ node:alpine для создания приложения Angular, которое публикуется по выходному пути /dist . Далее он переключается на образ nginx:alpine , заменяет дефолтный корень приложения Nginx приложением Angular и копирует кастомный файл nginx.conf в систему Nginx .
В последней строке указывается точка входа образа для команды: nginx -g daemon off; . Это гарантирует, что Nginx останется «на переднем плане», так что Docker сможет правильно отслеживать процесс (в противном случае контейнер остановится сразу после запуска).
Чтобы избежать во время сборки копирование лишних файлов из папки node_modules , можно добавить файл .dockerignore .С помощью описанного Dockerfile мы можем создать образ Docker и запустить его в контейнере, используя следующие команды:
Готово! В этой статье мы продемонстрировали, как обслуживать простые веб-приложения с использованием Nginx в контейнере, кратко рассказали о файле конфигурации для Nginx, а также о том, как можно вместе упаковать в один образ и приложение сервера, и frontend-часть.
За последний год в Docker Hub стало доступно уже более 100 000 образов, а загружались образы с Docker Hub уже более 300 миллионов раз. Из них более 20 миллионов загрузок пришлись на 70 официальных образов разработчиков Docker, таких как Oracle, CentOS и NGINX.
- как развернуть и использовать Docker-образ с NGINX.
- как быстро развернуть реверс-прокси на NGINX и несколько сайтов в Docker
- как развернуть геораспределенную инсталляцию, состоящую из нескольких сайтов и реверс-прокси в каждом из 3х регионов InfoboxCloud.
В конце статьи мы раздаем пробные версии InfoboxCloud бесплатно.
Подготовка окружения
1. Создайте сервер с CentOS 7 для установки Docker в InfoboxCloud. Для работы Docker сейчас необходима именно виртуальная машина, поэтому при создании сервера обязательно установите галочку «Разрешить управление ядром ОС».
Как правильно создать сервер в InfoboxCloud для DockerЕсли у вас еще нет доступа в InfoboxCloud – закажите его.
Задайте необходимые параметры сервера. Обязательно выделите серверу 1 публичный IP–адрес и установите галочку «Разрешить управление ядром ОС», как показано на скриншоте ниже.
В списке доступных операционных систем выберите CentOS 7 и завершите создание сервера.
После этого данные для доступа к серверу придут к вам на электронную почту.
После создания сервера с CentOS 7 подключитесь к нему по SSH.
Мы подготовили скрипт, который позволит вам установить Docker и полезные утилиты для работы с Docker на такой сервер. Необходимые настройки будут выполнены автоматически.
Выполните команду для установки Docker и Compose:
После этого docker и compose будут установлены. Можно создать образ с установленным docker в панели управления, нажав на сервер и далее «Создать образ».
После этого из образа с Docker можно будет создавать новые сервера и не выполнять этот шаг повторно.
Создание переносимого окружения
- Dockerfile – файла, описывающего процесс построения контейнера
- docker-compose.yml — файла, описывающего процесс запуска контейнера или набора контейнеров
- файлов сайта в директории html
- файлов конфигурации nginx в директории conf
Для работы с git установите его на сервере.
Скопируйте наше простое переносимое окружение из github командой:
Перейдите в директорию окружения командой:
Постройте образ Docker с помощью команды
Разверните образ в контейнер командой
Попробуйте зайти на сервер по IP. Преднастроенный статический сайт был успешно развернут.
Если выполнить можно увидеть сайт в списке контейнеров.
Давайте разберемся, из чего состоит переносимое окружение.
В файле conf/nginx.conf находится конфигурация nginx:
, где domain.tld нужно заменить на домен вашего сайта.
Конфигурация веб-сервера для сайта хранится в переносимом окружении, благодаря чему при развертывании не нужно заново настраивать веб-сервер каждый раз.
В корне переносимого окружения находится Dockerfile, который использует официальный образ NGINX и добавляет в него ваш сайт из папки html и конфигурацию NGINX из папки conf.
Подробнее о Dockerfile было рассказано в этой статье.
Также в корне папки переносимого окружения создайте файл docker-compose.yml со следующим содержимым:
В нем сказано, что нужно разворачивать окружение sitename, сперва построив его из Dockerfile в той же директории. Порт 80 контейнера необходимо пробросить на порт 80 хоста. В случае падения NGINX рестартовать его.
Подробнее о Compose было рассказано в этой статье.
Если вы измените сайт или файл конфигурации nginx – просто перестройте образ командой
И затем разверните образ в контейнер:
Нам не нужно каждый раз волноваться о настройке сервера. Однажды разработанное переносимое окружение с Docker позволит быстро делать развертывание.
Для выполнения рекомендаций из следующего раздела остановите и удалите развернутый контейнер, т.к. он занимает порт 80 на хосте, который нам потребуется.
Для этого выполните:
Скопируйте в буфер обмена container_id.
Остановите контейнер командой:
, где вместо bc88ee61a933 вставьте ваш container_id.
Удалите контейнер:
, где вместо bc88ee61a933 вставьте ваш container_id.
Разворачиваем несколько сайтов с реверс-прокси
Вариант 1. Настройте hosts
Этот вариант отлично подходит для тестирования, но будет работать только с вашего компьютера.
Добавьте записи о доменах в файл hosts вашего компьютера.
В OS X и Linux добавить записи можно в файл /etc/hosts.
В Windows нужно запустить блокнот от имени администратора. Для этого в поле поиска введите Notepad или «Блокнот» (в русской версии Windows) и выберите пункт запуска от имени администратора.
Откройте файл C:\Windows\System32\drivers\etc\hosts. Если в блокноте он будет не виден — выберите рядом с кнопкой «Открыть» тип файлов «Все файлы».
Добавьте необходимые записи и сохраните изменения. Не забудьте в качестве ip–адресов использовать адреса именно вашего сервера из панели управления.
После тестов не забудьте удалить эти записи из файла hosts.
Вариант 2. Приобретите необходимые домены
Теперь подключитесь к серверу с Docker в InfoboxCloud по SSH.
Клонируйте подготовленный репозиторий для 2х сайтов с балансировщиком нагрузки.
Перейдите в директорию переносимого окружения балансировщика:
Запустите построение балансировщика и зависимых образов одной командой:
Разверните балансировщик и зависимые образы:
Примечание: файлы docker-compose.yml в папках каждого из фронтендов в данном примере не используются.
Откройте в браузере домен первого сайта:
Теперь проверьте, что корректно открывается и второй сайт:
Разворачиваем несколько геораспределенных сайтов
Создайте по серверу с docker в каждом из регионов InfoboxCloud: Москва, Санкт-Петербург, Амстердам как показано в разделе «Подготовка окружения» и установите git командой:
В панели управления перейдите на главную страницу и нажмите «Заказать новую услугу».
Выберите услугу «Облачные серверы».
Выберите нужный регион и завершите процесс заказа до конца.
Подключение дополнительных регионов бесплатно, но требуется, чтобы на счету было более 500 рублей.
Переключаться между регионами можно в правом верхнем углу в панели управления в выпадающем меню.
Необходимые ip–адреса можно найти в панели управления InfoboxCloud.
Сохраните подготовленные переносимые окружения на каждый из серверов:
На каждом из серверов отредактируйте файл
Вместо ручного переименования можно выполнить команду на каждом из серверов:
nginx.conf после внесения изменений для Амстердама nginx.conf после внесения изменений для Санкт-ПетербургаТеперь для Москвы передите в соответствующую папку:
Для Амстердама передите в соответствующую папку:
На каждом из серверов запустите команды
Теперь можно зайти на каждый из сайтов и проверить их доступность:
Теперь из панели управления выключите сервер в любом из регионов. Сайты по-прежнему доступны.
Выключите сервер во втором регионе. Сайты по-прежнему доступны.
Пока доступен хоть один сервер — сайты будут работать. Если запрос попал на выключенный сервер, все современные браузеры делают попытку послать запрос на другой сервер из DNS. В итоге через несколько секунд сайт откроется.
Сделать процесс развертывания серверов и сайтов в нескольких регионах полностью автоматическим можно с помощью Ansible.
Часть 1.
Часть 2.
Часть 3.
Часть 4.
Часть 5.
Как получить пробную версию InfoboxCloud бесплатно?
Если у вас есть вопросы или замечания, напишите нам и мы с радостью ответим.
Если вы не можете оставлять комментарии на Хабре, напишите нам в Сообществе.
По данной инструкции мы настроим наш веб сервер в Docker следующим образом:
- В качестве веб-сервера будет использоваться NGINX.
- Будет поддержка приложений на PHP.
- Мы создадим 2 контейнера Docker — один для NGINX + PHP, второй для СУБД (MariaDB).
- Веб-приложение будет зашито в контейнере. Раздел для данных MariaDB будет монтироваться в качестве volume.
Данную конфигурацию можно использовать для быстрого развертывания сайтов или для локальной разработки.
Мы будем работать в системе на базе Linux. Предполагается, что Docker уже установлен.
NGINX + PHP + PHP-FPM
Рекомендуется каждый микросервис помещать в свой отдельный контейнер, но мы (для отдельного примера) веб-сервер с интерпретатором PHP поместим в один и тот же имидж, на основе которого будут создаваться контейнеры.
Создание образа
Создадим каталог, в котором будут находиться файлы для сборки образа веб-сервера:
mkdir -p /opt/docker/web-server
Переходим в созданный каталог:
* где:
1) указываем, какой берем базовый образ. В нашем случае, CentOS 8.
3) задаем для информации того, кто создал образ. Указываем свое имя и адрес электронной почты.
5) создаем переменную окружения TZ с указанием временной зоны (в нашем примере, московское время).
7) запускаем обновление системы.
8) устанавливаем пакеты: веб-сервер nginx, интерпретатор php, сервис php-fpm для обработки скриптов, модуль php-mysqli для работы php с СУБД MySQL/MariaDB.
9) удаляем скачанные пакеты и временные файлы, образовавшиеся во время установки.
10) добавляем в конфигурационный файл nginx строку daemon off, которая запретит веб-серверу автоматически запуститься в качестве демона.
11) создаем каталог /run/php-fpm — без него не сможет запуститься php-fpm.
13) копируем содержимое каталога html, который находится в том же каталоге, что и dockerfile, в каталог /usr/share/nginx/html/ внутри контейнера. В данной папке должен быть наше веб-приложение.
15) запускаем php-fpm и nginx. Команда CMD в dockerfile может быть только одна.
17) открываем порт 80 для работы веб-сервера.
В рабочем каталоге создаем папку html:
. а в ней — файл index.php:
* мы создали скрипт, который будет выводить информацию о php в браузере для примера. По идее, в данную папку мы должны положить сайт (веб-приложение).
Создаем первый билд для нашего образа:
docker build -t dmosk/webapp:v1 .
Новый образ должен появиться в системе:
docker login --username dmosk
docker tag dmosk/webapp:v1 dmosk/web:nginx_php7
docker push dmosk/web:nginx_php7
* первой командой мы прошли аутентификацию на портале докер-хаба (в качестве id/login мы используем dmosk — это учетная запись, которую мы зарегистрировали в Docker Hub). Вторая команда создает тег для нашего образа, где dmosk — учетная запись на dockerhub; web — имя репозитория; nginx_php7 — сам тег. Последняя команда заливает образ в репозиторий.
* подробнее про загрузку образа в репозиторий докера.
Запуск контейнера и проверка работы
Запускаем веб-сервер из созданного образа:
docker run --name web_server -d -p 80:80 dmosk/webapp:v1
Наш веб-сервер из Docker работает.
MariaDB
Для запуска СУБД мы будем использовать готовый образ mariadb. Так как после остановки контейнера, все данные внутри него удаляются, мы должны подключить внешний том, на котором будут храниться наши базы.
Сначала создаем том для докера:
docker volume create --name mariadb
* в данном примере мы создали том с именем mariadb. Будет создан каталог /var/lib/docker/volumes/mariadb/_data/ на хостовом сервере, куда будут размещаться наши файлы базы.
Выполним первый запуск нашего контейнера с mariadb:
docker run --rm --name maria_db -d -e MYSQL_ROOT_PASSWORD=password -v mariadb:/var/lib/mysql mariadb
- --rm — удалить контейнер после остановки. Это первый запуск для инициализации базы, после параметры запуска контейнера будут другими.
- --name maria_db — задаем имя контейнеру, по которому будем к нему обращаться.
- -e MYSQL_ROOT_PASSWORD=password — создаем системную переменную, содержащую пароль для пользователя root базы данных. Оставляем его таким, как в данной инструкции, так как следующим шагом мы его будем менять.
- -v mariadb:/var/lib/mysql — говорим, что для контейнера мы хотим использовать том mariadb, который будет примонтирован внутри контейнера по пути /var/lib/mysql.
- mariadb — в самом конце мы указываем имя образа, который нужно использовать для запуска контейнера. Это образ, который при первом запуске будет скачан с DockerHub.
В каталоге тома должны появиться файлы базы данных. В этом можно убедиться командой:
Теперь подключаемся к командной строке внутри контейнера с сервером базы данных:
docker exec -it maria_db /bin/bash
Подключаемся к mariadb:
Меняем пароль для учетной записи root:
Выходим из командной строки СУБД:
Выходим из контейнера:
Останавливаем сам контейнер — он нам больше не нужен с данными параметрами запуска:
docker stop maria_db
И запускаем его по новой, но уже без системной переменной с паролем и необходимостью его удаления после остановки:
docker run --name maria_db -d -v mariadb:/var/lib/mysql mariadb
Сервер баз данных готов к работе.
Подключение к базе из веб-сервера
По отдельности, наши серверы готовы к работе. Теперь настроим их таким образом, чтобы из веб-сервера можно было подключиться к СУБД.
Зайдем в контейнер с базой данных:
docker exec -it maria_db /bin/bash
Подключимся к mariadb:
Создадим базу данных, если таковой еще нет:
> CREATE DATABASE docker_db DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
* в данном примере мы создаем базу docker_db.
Создаем пользователя для доступа к нашей базе данных:
* и так, мы дали полные права на базу docker_db пользователю docker_db_user, который может подключаться от любого хоста (%). Пароль для данного пользователя — docker_db_password.
Отключаемся от СУБД:
Выходим из контейнера:
Теперь перезапустим наши контейнеры с новым параметром, который будет объединять наши контейнеры по внутренней сети.
Останавливаем работающие контейнеры и удаляем их:
docker stop maria_db web_server
docker rm maria_db web_server
docker network create net1
* мы создали сеть net1.
Создаем новые контейнеры из наших образов и добавляем опцию --net, которая указывает, какую сеть будет использовать контейнер:
docker run --name maria_db --net net1 -d -v mariadb:/var/lib/mysql mariadb
docker run --name web_server --net net1 -d -p 80:80 dmosk/webapp:v1
* указав опцию --net, наши контейнеры начинают видеть друг друга по своим именам, которые мы задаем опцией --name.
Готово. Для проверки соединения с базой данных в php мы можем использовать такой скрипт:
ini_set("display_startup_errors", 1);
ini_set("display_errors", 1);
ini_set("html_errors", 1);
ini_set("log_errors", 1);
error_reporting(E_ERROR | E_PARSE | E_WARNING);
* в данном примере мы подключаемся к базе docker_db на сервере maria_db с использованием учетной записи docker_db_user и паролем docker_db_password.
После его запуска, мы увидим либо пустой вывод (если подключение выполнено успешно), либо ошибку.
Использование docker-compose
В отличие от docker, с помощью docker-compose можно разворачивать проекты, состоящие из нескольких контейнеров, одной командой.
И так, автоматизируем запуск наших контейнеров с использованием docker-compose. Необходимо, чтобы он был установлен в системе.
Сначала удалим контейнеры, которые создали на предыдущих этапах:
docker rm -f web_server maria_db
Переходим в каталог для наших сборок:
Создаем yml-файл с инструкциями сборки контейнеров через docker-compose:
web_server:
build:
context: ./web-server/
args:
buildno: 1
container_name: web_server
restart: always
environment:
TZ: "Europe/Moscow"
ports:
- 80:80
maria_db:
image: mariadb
container_name: maria_db
restart: always
environment:
TZ: "Europe/Moscow"
volumes:
- /var/lib/docker/volumes/mariadb/_data/:/var/lib/mysql
* в формате yml очень важное значение имеют отступы. Если сделать лишний пробел, то мы получим ошибку.
* где:
Запускаем сборку наших контейнеров с помощью docker-compose:
Запускаем контейнеры в режиме демона:
docker-compose up -d
Проверяем, какие контейнеры запущены:
При внесении изменений можно перезапускать контейнеры командой:
docker-compose up --force-recreate --build -d
Просто пересоздать контейнеры:
или только для одного из сервисов:
docker-compose restart web_server
* где web_server — название сервиса в файле docker-compose.
Возможные проблемы
Рассмотрим некоторые проблемы, которые могут возникнуть в процессе настройки.
Ошибка возникает при попытке собрать имидж на Linux CentOS 8. Полный текст ошибки может быть такой:
Причина: система внутри контейнера не может разрешить dns-имена в IP-адрес.
Решение: в CentOS 8 запросы DNS могут блокироваться брандмауэром, когда в качестве серверной части (backend) стоит nftables. Переключение на iptables решает проблему. Открываем файл:
Есть несколько способов как это можно сделать:
Это использование файла Dockerfile для создания конфигурационного файла, который создаст контейнер. В этом файле можно указать почти все параметры и так же любые команды. Я расскажу как можно это сделать, но поговорим немного о самой структуре данного файла.
Dockerfile
Я возьму сейчас минимальную конфигурацию для Dockerfile, которая даст возможность установить nginx который будет работает в контейнере. Я объясню основы, пожалуйста, обратитесь к официальной документации Dockerfile для полного обзора (если потребуется).
FROM
Должна быть первая запись в вашем Dockerfile. Эта строчка сообщает Docker на базе которого дистрибутива будит создан новой образ.
MAINTAINER
Если Вы выкладываете (публикуете) свои образы, то стоит прописать данную строку. Она даст возможность видеть кто автор данного образа или контейнера.
ADD
Я поддерживаю кастомную сборку Nginx + ModSecurity для своих потребностей. Мне нужно извлечь файл конфигурации хранилища. Я буду все ставить именно с данного репозитория.
RUN
Используется для настройки вашего контейнера. Вы можете установить столько, сколько вы хотите в вашем Dockerfile.
ПРИМЕЧАНИЕ: На данный момент, я не уверен, но, как я буду интегрировать Chef с Докер. Т.к не сильно много пользовательских конфигураций.
RUN yum -y install nginx
Обратите вниманиена foreground vs background
По пути к докеру, на вашем контейнере должна работать только одна служба. Вот и вся цель использования контейнеров в конце концов. Таким образом вы запускаете ваши услуги на передний план (foreground), но не наbackground. Вы в основном работаете с одной командой, это единственная цель вашего контейнера. Очень простодушный контейнер 🙂
Таким образом, мы должны сказать Nginx-у, чтобы он выполнил это!
EXPOSE
Пробрасывает порты наружу.
ПРИМЕЧАНИЕ: Это внутренний порт. Это будет отличаться один, который будет использоваться снаружи. Это назначается динамически Докер.
CMD
Сердце и душа вашего контейнера. Что он делает. Это цель жизни!
CMD /usr/sbin/nginx -c /etc/nginx/nginx.conf
Теперь я соберу все до кучи:
Содержимое моего докерфайла:
Сборка контейнера.
Когда все необходимое прописать в файл Dockerfile, можно приступить к сборке контейнера:
После данной команды, начнется скачивание образа на CentOS и установки в него nginx. После завершения Вы должны увидеть ваш новый докер в имеющихся образах:
Как видно на рисунке, что образ создан и готов к первому тестовому запуску. Итак, запустим его:
Но лучше указывать еще порт (можно так же указать и ИП адрес), но перед этим я указал имя:
Но есть одно но, необходимо переопределять (желательно):
То есть, должно запускаться следующим образом:
Как вы можете видеть, каждый раз когда вы запустите контейнер, Docker генерирует новый идентификатор для этого. Давайте посмотрим, если это действительно работает:
На рисунке видны все созданные контейнера, чтобы увидеть запущенные контейнера, выполните:
Наша контейнер работает. С помощью curl проверим работу:
Это использование готового контейнера на ОС (например, CentOS или Debian\Ubuntu).
Этот способ самы простой, но он имеет достаточно большой обьем образа ( пока не нашел как его уменьшить).
-
Готовый образ контейнера с nginx
Я не думаю что нужно рассказывать как это сделать для данного примера ( я описывал в своей предыдущей статье).
One thought on “ Установка nginx в контейнере на Docker ”
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine 36f3464a2197 2 weeks ago 18.6MB
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.
Читайте также: