Введение
Сразу скажу, что мной двигала лень самостоятельной настройки всего этого хозяйства. В связи с этим я искал готовые контейнеры, которым можно было бы доверять и не заботиться об их обновлении и поддержке. На долю секунды у меня возникла мысль собрать контейнеры самостоятельно, но я ее быстро отбросил Тогда мне было бы проще и быстрее настраивать все без докера банальным башем или ансиблом.
Для самого web сервера под wordpress нет проблем, так как docker контейнер предоставляет сама wordpress. А вот с let’s encrypt возникли некоторые затруднения. Чего-то простого и легковесного не попадалось. В итоге остановился вот на этом проекте — https://docs.linuxserver.io/general/swag. Это многофункциональный web сервер, который больше заточен на проксирование запросов. Я сначала хотел использовать только его в том числе и в качестве веб сервера, но в итоге решил все же остаться на стандартном контейнере от wordpress.
Проект linuxserver достаточно известный. У них много готовых контейнеров на все случаи жизни, так что решил остановиться на нем. Немного поковырялся внутри, посмотрел, как все устроено. Когда разобрался, начал реализацию изначальной идеи — автоматизировать установку wordpress через docker сразу по https с бесплатными сертификатами от let’s encrypt. Запускать все буду через docker-compose. Если у вас еще не установлен докер и композ к нему, используйте мою статью — установка docker на centos.
Подготовка конфигов
В начале подготовим конфиг nginx для проксирования запросов из контейнера с swag в wordpress. Назовем его nginx-default, так как он будет заменять дефолтный конфиг nginx.
server { listen 80; listen :80; server_name 253197.simplecloud.ru; return 301 https://$host$request_uri; } server { listen 443 ssl http2 default_server; listen :443 ssl http2 default_server; root /var/www/html/example; index index.html index.htm index.php; server_name 253197.simplecloud.ru; include /config/nginx/proxy-confs/*.subfolder.conf; include /config/nginx/ssl.conf; client_max_body_size 64M; location / { try_files $uri $uri/ /index.php?$args @app; } location @app { proxy_pass http://wordpress; proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Real-IP $remote_addr; } }
Вам нужно будет в нем заменить только имя сервера — 253197.simplecloud.ru. Это dns запись vds на simplecloud, которые я обычно использую для теста. Мало того, что есть возможность почасовой аренды, так сразу же с виртуалкой идет прописанное dns имя. В итоге такие vds очень удобно использовать для тестов и временного размещения чего-либо. Рекомендую.
Далее я подготовил конфиг configure-wp.sh для установки и первоначальной настройки wordpress с помощью инструмента wp-cli, который запускается в отдельном контейнере. После того, как он все выполнит, завершает свою работу.
retries=0 while : do if wp core install --url="253197.simplecloud.ru" --title="test blog" --admin_user="admin" --admin_password="pass" --admin_email="[email protected]" then break else retries=$((retries+1)) echo "Couldn't connect to DB. Try - ${retries}. Sleeping 5 seconds and will retry ..." sleep 5 fi if then echo "Couldn't connect to DB 30 times. Exiting." exit 1 fi done wp theme install donovan --activate wp theme uninstall twentynineteen wp theme uninstall twentyseventeen wp theme uninstall twentytwenty wp plugin install wordpress-importer --activate #wp plugin install classic-editor --activate #wp plugin install wp-mail-smtp --activate #wp plugin install cyr3lat --activate #wp plugin install wordpress-seo --activate wp plugin uninstall akismet wp plugin uninstall hello wp language core install ru_RU --activate
Так же я отдельно подготовил файл .htaccess с конфигурацией веб сервера apache, который используется в контейнере wordpress.
# BEGIN WordPress RewriteEngine On RewriteBase / RewriteRule ^index\.php$ - RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php # END WordPress php_value memory_limit 256M php_value upload_max_filesize 64M php_value post_max_size 64M php_value max_execution_time 300 php_value max_input_time 1000
Подготовка окончена, можно переходить к непосредственно установке wordpress через docker.
Dockerfile
В предыдущем разделе мы работали с уже готовыми образами Docker, которые мы загружали с DockerHub. В этом разделе рассмотрим процесс создания собственного сценария по созданию образа. Этот сценарий пишется в текстовом формате и называется Dockerfile, в нем вы описываете набор инструкций по созданию образа.
Создадим простейший файл Dockerfile:
root@dedicated:~# mkdir /opt/freehost-image root@dedicated:~# cd /opt/freehost-image root@dedicated:/opt/freehost-image# nano Dockerfile
содержимое Dockerfile:
FROM debian:latest MAINTAINER Dmitry Shestak <[email protected]> RUN apt-get update RUN apt-get install -y nginx mc curl atop EXPOSE 80
Сохраните файл, и находясь в каталоге с ним, запустите создание образа:
docker build . -t freehost-image
В консоли Вы увидите подробный вывод того, что происходит внутри контейнера. А происходит следующее: поле FROM указывает исходный образ операционной системы, на основе которого будет сформирован наш собственный образ. Поле MAINTAINER указывает автора образа. Поле RUN запускает оболочку командной строки, внутри которой система сначала обновит индекс пакетов, а затем установит перечисленное программное обеспечение.
Теперь посмотрим список доступных образов:
root@dedicated:~# docker images
В списке мы видим наш образ который мы создали: freehost-image (id 21f738109e09). Выполним в него вход и запустим что-нибудь из программного обеспечения, которое мы перечислили в сценарии.
root@dedicated:~# docker run -it freehost-image root@5199cfa793af:/# atop
Сборка нового образа
Сборка начинается с создания файла Dockerfile — он содержит инструкции того, что должно быть в контейнере. В качестве примера, соберем свой веб-сервер nginx.
И так, чтобы создать свой образ с нуля, создаем каталог для размещения Dockerfile:
mkdir -p /opt/docker/mynginx
* где /opt/docker/mynginx — полный путь до каталога, где будем создавать образ.
… переходим в данный каталог:
cd /opt/docker/mynginx
… и создаем Dockerfile:
vi Dockerfile
FROM centos:7
MAINTAINER Dmitriy Mosk <[email protected]>
ENV TZ=Europe/Moscow
RUN yum install -y epel-release && yum install -y nginx
RUN yum clean all
RUN echo «daemon off;» >> /etc/nginx/nginx.conf
RUN sed -i «0,/nginx/s/nginx/docker-nginx/i» /usr/share/nginx/html/index.html
CMD
* в данном файле мы:
- используем базовый образ centos 7;
- в качестве автора образа указываем Dmitriy Mosk;
- задаем временную зону внутри контейнера Europe/Moscow.
- устанавливаем epel-release и nginx;
- чистим систему от метаданных и кэша пакетов после установки;
- указываем nginx запускаться на переднем плане (daemon off);
- в индексном файле меняем первое вхождение nginx на docker-nginx;
- запускаем nginx.
* подробное описание инструкций Dockerfile смотрите .
Запускаем сборку:
docker build -t dmosk/nginx:v1 .
* где dmosk — имя автора; nginx — название для сборки; v1 — тег с указанием версии. Точка на конце указывает, что поиск Dockerfile выполняем в текущей директории.
… начнется процесс сборки образа — после его завершения мы должны увидеть что-то на подобие:
Successfully built eae801eaeff2
Successfully tagged dmosk/nginx:v1
Посмотреть список образов можно командой:
docker images
Создаем и запускаем контейнер из образа:
docker run -d -p 8080:80 dmosk/nginx:v1
* в данном примере мы запустим контейнер из образа dmosk/nginx:v1 и укажем, что необходимо опубликовать внешний порт 8080, который будет перенаправлять трафик на порт 80 внутри контейнера.
Открываем браузер и переходим по адресу http://<IP-адрес нашего докера>:8080 — мы должны увидеть страницу приветствия с нашим docker-nginx:
Посмотреть созданные контейнеры можно командой:
docker ps -a
Запустить или остановить контейнеры можно командами:
docker stop 5fe78aca2e1d
docker start 5fe78aca2e1d
* где 5fe78aca2e1d — идентификатор контейнера.
php + apache + nginx + mariadb + phpmyadmin
https://hub.docker.com/_/nginx/https://hub.docker.com/_/php/https://hub.docker.com/_/httpd/https://hub.docker.com/_/mariadb/https://hub.docker.com/r/phpmyadmin/phpmyadmin/
Ну, а теперь совмещаем наши конфиги, и получаем неплохое веб-окружение:
Для php мы добавили директиву build (), в которой указали директорию php, где хранится Dockerfile со следующим содержанием:
В данном файле мы обновляем репозитории и устанавливаем php модули ().
Также мы слинковали конфиг php, чтобы можно было его настроить нужным нам образом.
Содержимое php.ini можно взять, например, здесь.
Запускаем, проверяем, радуемся!
Если все сделано правильно, то index.php отработает без ошибок, а в директории project/mysql появятся служебные файлы базы.
Docker
Dockerfile
Одна из важнейшей характеристик образа — это его размер. Компактный образ быстрее скачается с удаленного репозитория, займет меньше места, и ваш сервис быстрее стартует. Любой образ строится на основании базового образа, и рекомендуется выбирать наиболее минималистичный вариант. Хорошим вариантом является Alpine — полноценный дистрибутив Linux с минимумом пакетов.
Для начала попробуем написать Dockerfile «в лоб» (сразу скажу, что это плохой способ, не делайте так):
Здесь мы используем базовый образ на основе Alpine с уже установленным JDK для сборки нашего проекта. Командой ADD мы добавляем в образ текущую директорию src, отмечаем ее рабочей (WORKDIR) и запускаем сборку. Команда EXPOSE 8080 сигнализирует докеру, что приложение в контейнере будет использовать его порт 8080 (это не сделает приложение доступным извне, но позволит обратиться к приложению, например, из другого контейнера в той же сети докера).
Чтобы упаковать сервисы в образы надо выполнить команды из корня каждого проекта:
В результате получаем образ размером в 456 Мбайт (из них базовый образ JDK 340 занял Мбайт). И все притом, что классов в нашем проекте по пальцем пересчитать. Чтобы уменьшить размер нашего образа:
- Используем многошаговую сборку. На первом шаге соберем проект, на втором установим JRE, а третим шагом скопируем все это в новый чистый Alpine образ. Итого в финальном образе окажутся только необходимые компоненты.
- Воспользуемся модуляризацией java. Начиная с Java 9, можно с помощью инструмента jlink создать JRE только из нужных модулей
Для любознательных, вот хорошая статья про подходы уменьшения размеров образа https://habr.com/ru/company/ruvds/blog/485650/.
Итоговый Dockerfile:
Пересоздаем образ, и он в итоге похудел в 6 раз, составив 77 МБайт. Неплохо. После, готовые образы можно загрузить в реестр образов, чтобы ваши образы были доступны для скачивания из интернета.
Совместный запуск сервисов в Docker
Для начала наши сервисы должны быть в одной сети. В докере существует несколько типов сетей, и мы используем самый примитивный из них — bridge, позволяющий объединять в сеть контейнеры, запущенные на одном хосте. Создадим сеть следующей командой:
Далее запустим контейнер бекенда с именем ‘backend’ с образом microservices-backend:1.0.0:
Запускаем шлюз:
В этой команде мы указываем, что мы пробрасываем 80 порт нашего хоста на 8080 порт контейнера. Опции env мы используем для установки переменных среды, которые автоматически будут вычитаны спрингом и переопределят свойства из application.properties.
Версии Docker
Docker в основном поставляется в двух версиях, в Community и ENterprise.
Community версия поставляется с бесплатным набором продуктов Docker. ENterprise корпоративная версия представляет собой сертифицированную контейнерную платформу, которая предоставляет коммерческим пользователям дополнительные функции, такие как безопасность образов, управление образами, оркестровка и управление средой выполнения контейнеров, но по разумной цене.
Мы начнем наше обучение с Community Edition. Контейнеры Docker, работающие в конкретной операционной системе, совместно используют ядро ОС. Это означает, что мы не можем использовать ядро Windows (хост) для запуска контейнеров Linux или наоборот. Чтобы проделать это, у нас есть Docker Desktop для Windows и MAC.
Предстартовая готовность
Осталось совсем немного для запуска приложения. Создавать и запускать контейнеры можно в разных средах, в том числе и на вашей платформе. Однако, для целей разработки, удобнее использовать виртуальные машины. Для того чтобы запустить Docker Engine на виртуальном хосте, существует специальный инструмент Docker Machine.
1. Используя синтаксис инструмента, создадим виртуальную машину на базе VirtualBox:
$ docker-machine create
До того как выполнить код выше, необходимо установить VirtualBox в свою систему. Достаточно скачать установочный файл с официального сайта и выполнить инсталляцию.
2. После успешного создания машины, мы сможем увидеть её в списке доступных машин воспользовавшись командой:
$ docker-machine ls
3. Следующим шагом необходимо переключиться в контекст созданной виртуальной машины:
$ eval "$(docker-machine env vb)"
В случае, если машина не запущена, перед переключением контекста, необходимо выполнить команду «старт»:
$ docker-machine start vb
4. Увидеть основные параметры запущенной виртуальной машины возможно использовав команду:
$ docker-machine env vb
Здесь же будет указан IP адрес и порт, по которым будет доступен запущенный экземпляр приложения.
Описание инструкций Dockerfile
Инструкция | Описание | Пример |
---|---|---|
FROM | Указывает, какой базовый образ нужно использовать. Обязательная инструкция для Dockerfile | FROM ubuntu:16.04 |
MAINTAINER | Автор образа. | MAINTAINER DMosk <[email protected]> |
RUN | Выполняет команду в новом слое при построении образа. | RUN apt-get install python |
CMD | Запускает команду каждый раз при запуске контейнера. Может быть вызвана только один раз. Если в Dockerfile указать несколько таких инструкций, то выполнена будет последняя. | CMD |
LABEL | Добавляет метаданные. | LABEL version=»2″ |
EXPOSE | Указывает, какой порт должно использовать приложение внутри контейнера. | EXPOSE 8080 |
ENV | Задает переменные окружения в образе. | ENV PGPASSWORD pass |
ADD | Добавляет файлы/папки из текущего окружения в образ. Если в качестве копируемого файла указать архив, то он будет добавлен в образ в распакованном виде. Также в качестве источника принимает URL. | ADD /root/.ssh/{id_rsa,id_rsa.pub} /root/.ssh/ |
COPY | Также как и ADD добавляет файлы в образ, но обладает меньшими функциями — не принимает URL и не распаковывает архивы. Рекомендован для использования в случаях, где не требуются возможности ADD или когда нужно перенести архив, как архив. | COPY ./mypasswd /root/ |
ENTRYPOINT | Указывает команду, которой будет передаваться параметр при запуске контейнера. | ENTRYPOINT [«/sbin/apache2»] |
VOLUME | Добавляет том в контейнер. | VOLUME [«/opt/myapp»] |
USER | Задает пользователя, от которого будет запущен образ. | USER user:group |
WORKDIR | Можно задать каталог, откуда будут запускаться команды ENTRYPOINT и CMD. | WORKDIR /opt/apps |
ARG | Создает переменную, которую может использовать сборщик. | ARG folder=/opt/apps WORKDIR $folder |
ONBUILD | Действия, которые выполняются, если наш образ используется как базовый для другой сборки. | ONBUILD ADD . /app/src |
STOPSIGNAL | Переопределяет сигнал SIGTERM для завершения контейнера. | STOPSIGNAL SIGINT |
HEALTHCHECK | Команда, которая будет проверять работоспособность контейнера. | HEALTHCHECK —interval=5m —timeout=3s CMD curl -f http://localhost/ || exit 1 |
SHELL | Позволяет заменить стандартную оболочку для выполнения команд на пользовательскую. | SHELL [«/bin/sh», «-c»] |
Запуск контейнеров
Чтобы убедиться, что Docker правильно установлен и работает должным образом, запустим простой контейнер busybox, который всего лишь выведет в консоль переданное сообщение и завершит свое выполнение
Хорошо. Давайте сделаем что-то более интересное. Например, запустим контейнер rabbitmq
Разберем выполненную команду:
— запускает контейнер из образа. Если данный образ отсутствует локально, то предварительно он будет загружен из репозитория Docker Hub
— присваивает запускаемому контейнеру имя rabbit1
— пробрасывает порт с хоста в контейнер. 8080 — порт на хосте, 15672 — порт в контейнере
— имя образа и его тег/версия, разделенные двоеточием
Теперь мы можем извне контейнера взаимодействовать с сервером RabbitMQ через порт 5672 и получить доступ к управлению из браузера через порт 8080
Посмотреть статус контейнеров, в том числе остановленных, можно с помощью команд или
Чтобы остановить наш контейнер: . Запустить вновь:
Развёртывание дампов MySQL, PostgreSQL и MongoDB
Если для работы web-проектов требуются перенести данные в хранилища, то следуйте описанным ниже инструкциям.
Как развернуть дамп PostgreSQL?
Выполните следующую команду на локальной машине:
Или зайдите в контейнер postgres и выполните:
user_name — имя пользователя. Значение postgres_USER (см. файл .env).
database_name — название базы данных. Значение postgres_DB (см. файл .env).
Как развернуть дамп MySQL?
Существует два варианта.
Вариант 1
Если требуется создать дополнительных пользователей, то следует это сделать перед началом процедуры загрузки дампа.
В файле mysql/conf.d/config-file.cnf отключите лог медленных запросов slow_query_log=0 или установите большое значение long_query_time, например 1000.
Если дамп сжат утилитой gzip, сначала следует распаковать архив:
Затем можно развернуть дамп, выполнив на локальном компьютере команду:
Указывать пароль в командной строке — плохая практика, не делайте так в производственной среде.
MySQL выдаст справедливое предупреждение:
mysql: Using a password on the command line interface can be insecure
Ключ —force говорит MySQL, что ошибки следует проигнорировать и продолжить развёртывание дампа. Этот ключ иногда может пригодится, но лучше его без необходимости не применять.
Вариант 2
Воспользоваться утилитой Percona XtraBackup.
Percona XtraBackup — это утилита для горячего резервного копирования баз данных MySQL.
Как развернуть дамп MongoDB?
-
Скопируйте фалы дампа в каталог mongo/dump.
-
Войдите в контейнер mongo:
Выполните следующую команду, чтобы развернуть дамп базы database_name:
Шаг 5. Исправляем ссылки
ОК, проблема на самом деле большая. Вот как я заставлял ссылки работать на nginx в «продакшене»:
nginx try_files
Shell
try_files $uri $uri/ /index.php?q=$request_uri&$args;
1 | try_files$uri$uri//index.php?q=$request_uri&$args; |
Но в контейнером WordPress используется Apache! У него наверняка есть что-нибудь похожее, но я не настолько фанат или спец в Апаче, чтобы с ним ковыряться. Я хочу свой nginx назад!
Очередной сеанс гугла, и снова есть решение. Образ WordPress существует в нескольких вариантах, в том числе и fpm, к которому можно прикручивать собственные сервера. А один хороший человек даже подготовил образ с nginx для этого — rault/nginx-wordpress. Буду пробовать.
Опять же, сначала убиваем старые контейнеры:
Shell
docker-compose down
1 | docker-compose down |
Теперь, меняем образ на и добавляем новый сервис — nginx:
docker-compose.yml with nginx
Shell
version: ‘2’
services:
nginx:
image: raulr/nginx-wordpress
ports:
— 80:80
volumes:
— ./codeblog.dotsandbrackets.com:/var/www/html
wordpress:
image: wordpress:fpm
environment:
WORDPRESS_DB_PASSWORD: ${WP_DB_USER_PASSWORD}
WORDPRESS_DB_NAME: ${WP_DB_NAME}
volumes:
— ./codeblog.dotsandbrackets.com:/var/www/html
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: ${WP_DB_USER_PASSWORD}
MYSQL_DATABASE: ${WP_DB_NAME}
volumes:
— ./codeblog.dotsandbrackets.com.20170808-024302.sql.gz:/docker-entrypoint-initdb.d/backup.sql.gz
— ./migrate.sql:/docker-entrypoint-initdb.d/migrate.sql
1 10 13 |
version’2′ services nginx imageraulr/nginx-wordpress ports -8080 volumes
wordpress environment WORDPRESS_DB_PASSWORD${WP_DB_USER_PASSWORD} WORDPRESS_DB_NAME${WP_DB_NAME} volumes -./codeblog.dotsandbrackets.com/var/www/html mysql imagemysql environment MYSQL_ROOT_PASSWORD${WP_DB_USER_PASSWORD} MYSQL_DATABASE${WP_DB_NAME} volumes -./codeblog.dotsandbrackets.com.20170808-024302.sql.gz/docker-entrypoint-initdb.d/backup.sql.gz -./migrate.sql/docker-entrypoint-initdb.d/migrate.sql |
Наконец, запускаем контейнера и скрещиваем все доступные пальцы на удачу, потому что разродиться альтернативным решением среди ночи я не смогу. Это просто должно сработать.
Start web server
Shell
docker-compose up -d
open http://127.0.0.1
1 |
docker-compose up-d open http//127.0.0.1 |
JetPack снова поругался и снова отправился в страну вечной охоты. Но в остальном всё вроде работает.
Я прокликал все очевидные ссылки, и всё ОК. Всё в докере, и всё ОК!
Отладка .NET приложения запущенного в контейнере
Для нашего примера нам понадобится отдельная сеть, т.к. мы запустим целых два контейнера, которые будут взаимодействовать между собой. На самом деле все запускаемые контейнеры по умолчанию попадают в уже существующую сеть с именем bridge, но т.к. в своей сети мы без лишних проблем сможешь обращаться из одного контейнера к другому прямо по имени, создадим сеть с названием mynet типа bridge
Далее запустим redis и подключим его к ранее созданной сети. Благодаря параметру процесс в контейнере будет запущен в фоновом режиме
Далее с помощью Visual Studio 2019 создадим новый проект ASP.NET Core Web API, который будет использован для демонстрации отладки
Добавим для взаимодействия с Redis пакет StackExchange.Redis через Package Manager Console
Мы не будем акцентироваться на правильности и красоте дизайна, а быстро создадим рабочий пример
Добавим в проект файл RandomWeatherService.cs, где будет находится служба для выдачи не очень точного прогноза
Добавим файл RedisRepository.cs, где будет находится служба кеширования сформированных прогнозов
Зарегистрируем созданные службы в классе Startup
И наконец, изменим созданный автоматически единственный контроллер WeatherForecastController следующим образом
Помимо прочего в проект автоматически был добавлен файл Dockerfile с инструкциями для Docker. Оставим его без изменений
В результате получим следующую структуру проекта
Если по какой-то невероятной причине Вам понадобятся исходники, то они здесь
Запустим наше приложение в контейнере под отладкой
После того как контейнер будет запущен, также подключим его к сети mynet
После убедимся, что все необходимые контейнеры находятся в одной сети
Далее установим Breakpoint в единственном методе контроллера и пошлем запрос через Postman, или через любой браузер
Кстати, используемый порт в Вашем случае может отличаться и его можно посмотреть в окне Containers
Результат в окне Postman
Дополнительно убедимся, что значение зафиксировано в redis, подключившись с помощью консоли redis-cli
Устранение неполадок
Нерекомендуемый контекст DOCKER WSL
Если вы использовали предварительную ознакомительную версию DOCKER для WSL, возможно, у вас есть контекст DOCKER с именем «WSL», который теперь устарел и больше не используется. Можно проверить с помощью команды: . Вы можете удалить контекст «WSL», чтобы избежать ошибок с помощью команды: так, как вы хотите использовать контекст по умолчанию для Windows и WSL2.
Возможные ошибки, которые могут возникнуть при работе с этим нерекомендуемым контекстом WSL, включают: или
Дополнительные сведения об этой ошибке см. в статье Настройка DOCKER в Windows System для Linux (WSL2) в Windows 10.
Не удается найти папку хранилища образов DOCKER
DOCKER создает две папки дистрибутив для хранения данных:
- \WSL $ \доккер-десктоп
- \WSL $ \доккер-десктоп-Дата
Эти папки можно найти, открыв дистрибутив WSL Linux и введя: для просмотра папки в проводнике Windows. Введите: замените именем вашего распространения (IE. Ubuntu-20,04) для просмотра этих папок.
Дополнительные сведения о поиске расположений хранилищ DOCKER в WSL см. в этой статье из РЕПОЗИТОРИЯ WSL или этой стакковерлов записи.
Дополнительные сведения об устранении общих проблем в WSL см. в документации по устранению неполадок .
Пример 2: Nginx
Начиная с этого примера, вам понадобятся несколько дополнительных файлов, которые вы можете найти в Github-репозитории. Скачать файл можно, нажав на эту ссылку.
Настало время создать и запустить более полезный контейнер типа Nginx.
Сменим директорию на :
Вывод консоли:
- — преобразование портов .
- — монтирование тома .
Важно: команда принимает только абсолютные пути. В нашем примере мы использовали , чтобы установить абсолютный путь текущей директории
Теперь вы можете открыть localhost в вашем браузере.
Или можно изменить (который смонтирован как том в внутри контейнера) и обновить страницу.
Получим информацию о контейнере :
Эта команда показывает широкую системную информацию об установке Docker. Эта информация включает в себя версию ядра, количество контейнеров и образов, открытые порты, смонтированные тома и так далее.
Шаг 2: Подключаем веб-контент к контейнеру
Я полазил в Dockerfile для WordPress образа, и, судя по всему, его авторы будут обновлять настройки (имя базы, логин, и т. п.) в вордпрессовском wp-config.php, если те передать в контейнер с переменными окружения. Удобно. Значит я могу не заморачиваться переносом mysql аккаунтов с «продакшен» машины, а создать новые или даже использовать root (значение по умолчанию).
В том же Dockerfile я заметил, что вордпрессовский контент будет лежать в папке (это ещё и volume). По идее, можно просто подключить туда мой бэкап, и вебовская часть контента будет восстановлена.
Наконец, моя прогрессирующая интернет паранойя больше не позволяет мне ложить имена и пароли открытым текстом в Docker-файлы, так что я лучше их положу в локальные переменные окружения и буду импортировать уже оттуда:
Add env variables with secrets
Shell
echo «export WP_DB_NAME=’****'» >> ~/.profile
echo «export WP_DB_USER_PASSWORD=’****'» >> ~/.profile
source ~/.profile
1 |
echo»export WP_DB_NAME=’****'»>>~/.profile echo»export WP_DB_USER_PASSWORD=’****'»>>~/.profile source~/.profile |
Теперь распаковываем бэкап с вэб-контентом, подкручиваем его к docker-compose.yml, задаём там же пустую базу данных, и пробуем запустить (кстати, всё это происходит на маке, но на никсе будет то же самое):
Extract www archive
Shell
$ tar -xzf codeblog/codeblog.dotsandbrackets.com.20170808-023746.tar.gz \
—strip-components=2 # skip /home/%USER% path component
# Writes to `pwd`/codeblog.dotsandbrackets.com
1 |
$tar-xzf codeblog/codeblog.dotsandbrackets.com.20170808-023746.tar.gz\ —strip-components=2# skip /home/%USER% path component # Writes to `pwd`/codeblog.dotsandbrackets.com |
docker-compose.yml
Shell
version: ‘2’
services:
wordpress:
image: wordpress
environment:
WORDPRESS_DB_PASSWORD: ${WP_DB_USER_PASSWORD}
WORDPRESS_DB_NAME: ${WP_DB_NAME}
volumes:
— ./codeblog.dotsandbrackets.com:/var/www/html
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: ${WP_DB_USER_PASSWORD}
MYSQL_DATABASE: ${WP_DB_NAME}
1 9 11 |
version’2′ services wordpress imagewordpress environment WORDPRESS_DB_PASSWORD${WP_DB_USER_PASSWORD} volumes
mysql imagemysql environment MYSQL_ROOT_PASSWORD${WP_DB_USER_PASSWORD} |
Start the web site
Shell
docker-compose up -d
# Give ~20-30 seconds to finish
open http://127.0.0.1
1 |
docker-compose up-d # Give ~20-30 seconds to finish open http//127.0.0.1 |
Ну, Вордпресс определённо запустился. Но как определить, это он «мой» контент использует сейчас, или «свой»? Можно, конечно, влезть в контейнер и посмотреть внутри, но лучше я подключу настоящую базу, и всё сразу станет яснее. Так что останавливаем запущенные контейнеры и вперёд к импорту данных:
Shutdown the web site
Shell
docker-compose down
1 | docker-compose down |
Образ API
В папке api мы описываем взаимодействие с любыми динамически меняющимися данными:
project_folder/ api/ Dockerfile app.js package.json data/.. ..
В нашем случае образы серверов статического и динамического контента не отличаются. Что касается самого сервера, то код его следующий:
"use strict";const express = require('express');const bodyParser = require('body-parser');const http = require('http');const app = express();const server = http.Server(app);const path = require('path');const AppRouter = require('./Routers/App.router');app.use('/api'.concat('/demo'), AppRouter);server.listen(8080);
Простой маршрутизатор (Router), может выглядеть следующим образом:
const express = require('express');const router = express.Router();router.get('/demo', function (req, res, next) { res.status(200).json({ success: true, process: 'started', });})module.exports = router;
Установка Docker на Windows 10
Существует два варианта установки Docker на Windows:
Приложение «Docker Toolbox for Windows».
Приложение «Docker for Windows».
Примечание: Обратите внимание, что «Docker Toolbox for Windows» является устаревшим решением, которым вы можете воспользоваться, если ваш компьютер не удовлетворяет требованиям установки «Docker for Windows». Более детально об установке Docker Toolbox вы можете прочитать здесь
На этом уроке мы установим Docker через приложение «Docker for Windows», так как это решение является наиболее стабильным и надежным. Итак, сначала нам нужно скачать установщик.
Далее запускаем инсталлятор . Следуйте инструкциям мастера установки, дайте установщику разрешение на использование прав администратора и дождитесь окончания установки.
Примечание: Приложению Docker права администратора нужны для того, чтобы установить сетевые компоненты, создать ссылки на само приложение и дать возможность Hyper-V управлять виртуальными машинами.
Чтобы запустить Docker Desktop, воспользуйтесь поиском в Windows:
Индикатором запуска Docker является иконка «кита», появившаяся в системном трее:
Если иконка «кита» скрыта в системном трее, то нажмите на стрелочку вверх, чтобы посмотреть все иконки. После установки Docker Desktop вы также получите всплывающее уведомление о том, что Docker установлен и готов к работе:
После того, как инициализация закончена, нажмите на иконку «кита» в системном трее и выберите пункт , чтобы проверить, что вы используете последнюю версию Docker.
Поздравляю! Вы успешно установили Docker Desktop на Windows.
Поддерживаемые платформы
Linux является нативной платформой Docker, так как последний основан на особенностях, предоставляемых ядром операционной системы. Несмотря на это, вы можете запустить его на macOS или Windows. Разница состоит лишь в том, что Docker на них инкапсулирован в маленькую виртуальную машину. В настоящий момент Docker для этих ОС достиг значительного уровня удобства использования и очень похож на нативное приложение.
Более того, есть много дополнительных приложений, таких как Kitematic или Docker Machine, которые помогут установить Docker и управлять им на отличных от Linux платформах.
Сертификаты
Сертификат из центра сертификации необходим для размещения в рабочей среде для домена. Let’s Encrypt — Это центр сертификации, предлагающий бесплатные сертификаты.
В этом документе используются самозаверяющие сертификаты разработки для размещения предварительно созданных образов . Инструкции аналогичны использованию рабочих сертификатов.
Для рабочих сертификатов:
- Средство не требуется.
- Сертификаты не нужно хранить в расположении, используемом в инструкциях. Храните сертификаты в любом расположении за пределами каталога сайта.
Инструкции, приведенные в следующем разделе, содержат сведения о подключении сертификатов в контейнеры с помощью свойства в DOCKER-Compose. yml. Вы можете добавить сертификаты в образы контейнеров с помощью команды в Dockerfile, но это не рекомендуется. Копирование сертификатов в образ не рекомендуется по следующим причинам:
- Это затрудняет использование одного и того же образа для тестирования с помощью сертификатов разработчика.
- Это затрудняет использование одного и того же образа для размещения с производственными сертификатами.
- Существует значительный риск раскрытия сертификата.
Заключение
Итак, вы познакомились с Docker, получили представление о его возможностях и научились создавать несложные приложения. Современное IT уже слабо представляется без использования контейнеров. Продолжив изучение технологии, вы сможете перейти к созданию более сложных приложений. Темп развития современного IT давно трансформировал такое понятия как «востребованные знания» в «необходимые знания». Docker — это не сложно. И он является тем фундаментом, который освоить необходимо, если вы желаете идти в ногу со временем.
Обратите внимание, Docker не требователен к ресурсам, для его использования вам подойдет любой из предлагаемых нами тарифов VPS хостинга или аренда выделенного сервера. Для тарифов, начиная с Cloud1, нами создан шаблон сервера, со всеми необходимыми надстройками Docker+Portainer
Заказав услугу аренды VPS, после её активации, вы сможете уже через 10 минут приступить к работе c Docker. В случае возникших вопросов по настройке сервера, вы можете обратиться в нашу круглосуточную службу технической поддержки и наши специалисты оперативно отреагируют на ваше обращение.