<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Максим Кузнецов: заметки с тегом docker</title>
<link>https://maxkuznetsov.ru/tags/docker/</link>
<description>Простыми словами о веб-разработке</description>
<author>Максим Кузнецов</author>
<language>ru</language>
<generator>E2 (v3559; Aegea)</generator>

<itunes:owner>
<itunes:name>Максим Кузнецов</itunes:name>
<itunes:email></itunes:email>
</itunes:owner>
<itunes:subtitle>Простыми словами о веб-разработке</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit></itunes:explicit>

<item>
<title>Как подружить docker, localhost и HTTPS</title>
<guid isPermaLink="false">34</guid>
<link>https://maxkuznetsov.ru/all/docker-localhost-and-https/</link>
<pubDate>Tue, 26 May 2020 22:29:08 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/docker-localhost-and-https/</comments>
<description>
&lt;p&gt;Когда разрабатываешь веб-сервис, который крутится на проде по HTTPS, есть большой соблазн не запариваться и работать локально по HTTP. Потому что так проще, да и в целом же всё работает плюс-минус одинаково. Если сервис простой, то скорее всего никаких проблем не всплывёт, но если сервис не монолитный и зависит от внешних сервисов или сам предоставляет АПИ клиентам, то проблемы с CORS неизбежны. И обычно эти проблемы обнаруживаются слишком поздно — либо на стейджинге, либо даже после релиза на продакшен.&lt;/p&gt;
&lt;p&gt;Браузер начинает ругаться, что запросы с HTTPS на HTTP или наоборот не безопасны, сторонние сервисы перестают отвечать, так как по HTTP работали только тестовые стенды, с которыми вы и работали.&lt;/p&gt;
&lt;p&gt;Решение простое — нужно не лениться и максимально приблизить локальную среду к боевой. Благо это задача из серии один раз сделал и используешь для всех последующих проектов.&lt;/p&gt;
&lt;h2&gt;Docker на продакшене&lt;/h2&gt;
&lt;p class="remark"&gt;
Если у вас продакшен без Docker, то вам поможет статья — &lt;a href="https://maxkuznetsov.ru/all/nginx-free-ssl/"&gt;Как получить бесплатный SSL-сертификат и установить его на Nginx&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;В этой статье я рассматриваю только локальную сборку через docker-compose, потому что на продакшене, как ни странно, это немного проще. Достаточно выполнить понятную инструкцию &lt;a href="https://certbot.eff.org/lets-encrypt/ubuntuxenial-nginx"&gt;по настройке Certbot&lt;/a&gt; и/или добавить соответствующий  &lt;a href="https://hub.docker.com/r/certbot/certbot/"&gt;докер-образ с Docker Hub&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Docker на localhost&lt;/h2&gt;
&lt;p class="remark"&gt;См. как запустить сайт через docker-compose на примере &lt;a href="https://maxkuznetsov.ru/all/egeya-docker/"&gt;докеризации Эгеи&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;На локалхосте Certbot не подойдёт, так как ему нужно реально существующее доменное имя и доступный через интернет сайт. Поэтому прописать локальный адрес в /etc/hosts не поможет. Решение — выпустить свой самоподписанный сертификат. Да, он не будет приниматься никем, кроме нашей системы, но для локальной разработки этого и не нужно.&lt;/p&gt;
&lt;h3&gt;Создаём доменное имя&lt;/h3&gt;
&lt;p&gt;Во-первых, создадим локально доменное имя, чтобы оно было похожим на боевое, а не обычный и скучный localhost. Например, docker.loc для основного сайта и api.docker.loc для API:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$ sudo vim /etc/hosts
127.0.0.1       localhost
127.0.0.1       docker.loc
127.0.0.1       api.docker.loc
...&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если для вашего сервиса необходимо несколько доменов, то пропишите их ниже по аналогии.&lt;/p&gt;
&lt;h3&gt;Выпускаем свой SSL-сертификат&lt;/h3&gt;
&lt;p&gt;Для реальных сайтов SSL-сертификаты выдаются специальными сертификационными центрами за деньги. За это они потом могут подтвердить верность домена по запросу любого браузера. Мы же выпустим свой сертификат и сами его подтвердим.&lt;/p&gt;
&lt;p&gt;SSL-сертификат создаётся одной командой и состоит из двух частей: публичного сертификата и секретного ключа.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;openssl req -x509 -out docker.loc.crt -keyout docker.loc.key \
  -newkey rsa:2048 -nodes -sha256 \
  -subj '/CN=docker.loc' -extensions EXT -config &amp;lt;( \
   printf &amp;quot;[dn]\nCN=docker.loc\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:docker.loc\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth&amp;quot;)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Файлы docker.loc.crt и docker.loc.key будут сохранены в той папке, откуда вы запускаете команду.&lt;/p&gt;
&lt;h3&gt;Добавляем сертификаты в ОС&lt;/h3&gt;
&lt;p&gt;Ниже пример, как это сделать на Mac OS X.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Найдите сертификат docker.loc.crt в Finder (или можно в нужной папке консоли ввести «open .»)&lt;/li&gt;
&lt;li&gt;Дважды кликните по нему, появится окно.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://maxkuznetsov.ru/pictures/Screen-Shot-2020-05-26-at-22.04.11.png" width="1294" height="834" alt="" /&gt;
&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Введите пароль администратора&lt;/li&gt;
&lt;li&gt;Теперь нужно найти этот сертификат в Keychain Access и выбрать Trust Always&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://maxkuznetsov.ru/pictures/Screen-Shot-2020-05-26-at-22.09.28.png" width="1870" height="1386" alt="" /&gt;
&lt;/div&gt;
&lt;h3&gt;Добавляем сертификаты в docker-compose сборку&lt;/h3&gt;
&lt;p&gt;Сертификаты нужно положить в контейнер с веб-сервером. Я приведу пример для Nginx и сборки по типу &lt;a href="https://github.com/pluseg/e2-docker."&gt;https://github.com/pluseg/e2-docker.&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Расположение сертификатов и конфигов&lt;/h3&gt;
&lt;p&gt;В этой сборке папки из app/docker/nginx монтируются прямо в nginx-контейнер. Поэтому удобно расположить файлы так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;&amp;lt;project root&amp;gt;
- app
--- docker
----- nginx
------- conf.d
--------- docker.loc.conf
------- ssl
--------- docker.loc.crt
--------- docker.loc.key&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Пример docker.loc.conf (проект на PHP + Symfony)&lt;/h3&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="yaml"&gt;# лучше с php соединять через socket
upstream php-upstream { server web:9000; }

# Редиректим HTTP на HTTPS
server {
       listen         80;
       listen    [::]:80;
       server_name    docker.loc;
       return         301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    root /var/www/html/docs;

    server_name            docker.loc;
    ssl_certificate          /etc/nginx/ssl/docker.loc.crt;
    ssl_certificate_key   /etc/nginx/ssl/docker.loc.key;
    ssl_protocols           TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers         EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

    location / {
    	try_files $uri /index.php$is_args$args;
    }

    location ~ ^/(index|app|app_dev|config)\.php(/|$) {
        fastcgi_pass php-upstream;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_read_timeout 300;
    }

    error_log /var/log/nginx/docker.loc-error.log;
    access_log /var/log/nginx/docker.loc-access.log;
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Пример docker-compose.yml&lt;/h3&gt;
&lt;p&gt;Добавляем 443 порт и несколько volume с конфигами и сертификатами.&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="yaml"&gt;version: '3.2'
services:
    ...
    nginx:
        image: nginx:latest
        ports:
            - 80:80
            - 443:443
        volumes:
            - ./app/docker/nginx/conf.d:/etc/nginx/conf.d
            - ./app/docker/nginx/ssl:/etc/nginx/ssl
            - ./:/var/www/html
            - ./var/logs/nginx:/var/log/nginx
        command: /bin/bash -c &amp;quot;exec nginx -g 'daemon off;'&amp;quot;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Запускаем и проверяем&lt;/h3&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;docker-compose up -d --build&lt;/code&gt;&lt;/pre&gt;</description>
</item>

<item>
<title>Запускаем Эгею через Docker и забываем про технические проблемы на 10 лет вперёд</title>
<guid isPermaLink="false">29</guid>
<link>https://maxkuznetsov.ru/all/egeya-docker/</link>
<pubDate>Tue, 28 Apr 2020 01:37:47 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/egeya-docker/</comments>
<description>
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://maxkuznetsov.ru/pictures/Screen-Shot-2020-04-28-at-01.29.37.png" width="1205" height="658" alt="" /&gt;
&lt;/div&gt;
&lt;p class="remark"&gt;&lt;b&gt;Про работу с Docker&lt;/b&gt; можно посмотреть &lt;a href="https://maxkuznetsov.ru/all/docker-basic/"&gt;часовое видео&lt;/a&gt;. С Docker вам не нужно заботиться о конфигурациях веб-сервера, базы данных и правах доступа к файлам и папкам. Одна команда — и готово.&lt;/p&gt;
&lt;p&gt;В официальной документации Эгеи есть две ссылки на запуск блога с помощью Докера, но оба способа имеют свои недостатки. По крайней мере один из них устарел и просто не заведётся из коробки, плюс используется старый, медленный ПХП 5, а второй использует веб-сервер caddle, который не столь популярен и хорошо описан, как Nginx или официально поддерживаемый Эгеей Apache.&lt;/p&gt;
&lt;h2&gt;Блог за 5 шагов&lt;/h2&gt;
&lt;p&gt;Вот, что вам нужно, чтобы установить последнюю версию блога.&lt;/p&gt;
&lt;ol start="1"&gt;
&lt;li&gt;Установленные на целевой машине docker и docker-compose — это может быть и локальная машина, и продакшн. А также наличие домена, если поднимаете на продакшене.&lt;/li&gt;
&lt;li&gt;Склонировать репозиторий &lt;a href="https://github.com/pluseg/e2-docker"&gt;https://github.com/pluseg/e2-docker&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;git clone git@github.com:pluseg/e2-docker.git /path/to/blog/folder&lt;/code&gt;&lt;/pre&gt;&lt;ol start="3"&gt;
&lt;li&gt;Создать файл .env&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;cp .env.example .env&lt;/code&gt;&lt;/pre&gt;&lt;ol start="4"&gt;
&lt;li&gt;И указать в нём нужные версии PHP, MySQL, Эгеи (на сегодняшний день они актуальные и их менять и не надо) и домен VIRTUAL_HOST (для локали можно оставить localhost.&lt;/li&gt;
&lt;li&gt;Запускаем всё это хозяйство с помощью docker-compose&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;docker-compose up -d --build&lt;/code&gt;&lt;/pre&gt;&lt;ol start="5"&gt;
&lt;li&gt;Заходим на домен, указанный в VIRTUAL_HOST, и заполняем небольшую форму&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;DB Host: db
   DB User: root
   DB Pass: egeya
   DB Database: &amp;lt;выбрать из списка &amp;quot;egeya&amp;quot;&amp;gt;
   Admin pass: &amp;lt;укажите ваш админский пароль&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;ol start="6"&gt;
&lt;li&gt;Готово.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Дополнительные плюшки&lt;/h2&gt;
&lt;p&gt;В этой сборке я вынес версии всех зависимостей в .env файл, так что теперь обновить версию блога, ПХП или mysql — дело одной минуты. Достаточно обновить их в .env файле и перезапустить контейнеры с флагом пересборки:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;docker-compose up -d --build&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если понадобится перенести блог в другое место — не проблема. Достаточно перенести папку с блогом куда нужно и запустить ту же самую команду docker-compose.&lt;/p&gt;
&lt;p&gt;Все файлы, которые должны сохраниться между обновлениями сохранятся. Они лежат в папке ./data:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;data/pictures — картинки&lt;/li&gt;
&lt;li&gt;data/user — всё, что касается пользователя, включая shared шаблоны и настройки&lt;/li&gt;
&lt;li&gt;data/theme — ваша кастомная тема, если понадобится. Она добавляется в папку к остальным комплектным темам /themes&lt;/li&gt;
&lt;li&gt;data/mysql — данные из базы&lt;/li&gt;
&lt;/ul&gt;
</description>
</item>

<item>
<title>Принципы работы docker и примеры использования docker-compose</title>
<guid isPermaLink="false">14</guid>
<link>https://maxkuznetsov.ru/all/docker-basic/</link>
<pubDate>Mon, 23 Mar 2020 13:32:17 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/docker-basic/</comments>
<description>
&lt;p&gt;Артём Матяшов записал отличный полуторачасовой урок про основы докера. Можно посмотреть на x1.5 за час.&lt;/p&gt;
&lt;div style="max-width: 640px;"&gt;&lt;div class="e2-text-video"&gt;
&lt;iframe src="https://www.youtube.com/embed/QF4ZF857m44" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Подойдёт начинающим бэкендерам, а также фронтендерам, верстальщикам и всем, кому нужно развернуть проект на один раз и удалить без захламления системы.&lt;/p&gt;
&lt;p&gt;Однозначно лайк!&lt;/p&gt;
</description>
</item>

<item>
<title>Как ускорить docker-compose на Mac OS X — docker-sync</title>
<guid isPermaLink="false">12</guid>
<link>https://maxkuznetsov.ru/all/docker-on-mac-speed/</link>
<pubDate>Fri, 20 Mar 2020 16:33:26 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/docker-on-mac-speed/</comments>
<description>
&lt;p&gt;Хорошая статья про настройку docker-sync — короче и ёмче, чем в официальной документации:&lt;br /&gt;
&lt;a href="https://dev.to/kovah/cut-your-docker-for-mac-response-times-in-half-with-docker-sync-1e8j"&gt;https://dev.to/kovah/cut-your-docker-for-mac-response-times-in-half-with-docker-sync-1e8j&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;1. Установка через терминал&lt;/h3&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;
gem install --user-install docker-sync
# or globally via
sudo gem install docker-sync
&lt;/code&gt;
&lt;/pre&gt;
&lt;h3&gt;2. Добавить файл &lt;span style="font-family: monospace;"&gt;docker-sync.yml&lt;/span&gt; в корень проекта (пример для Symfony)&lt;/h3&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="yaml"&gt;
version: "2"

options:
    compose-dev-file-path: 'docker-compose-sync.yml' # Если хочется изменить дефолтный файл docker-compose-dev.yml
syncs:
    PROJECT-data-sync:  # Это надо заменить на любое уникальное имя
        src: './'
        host_disk_mount_mode: 'cached'
        sync_excludes:
            - '.git'
            - '.idea'
            - 'app/cache/*'
            - 'app/logs/*'
&lt;/code&gt;
&lt;/pre&gt;
&lt;h3&gt;3. Добавить файл &lt;span style="font-family: monospace;"&gt;docker-compose-sync.yml&lt;/span&gt; (или &lt;span style="font-family: monospace;"&gt;*-dev.yml&lt;/span&gt; по умолчанию) в корень проекта:&lt;/h3&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="yaml"&gt;
version: '3.2'

services:
    web:
        volumes:
            - ./composer.json:/var/www/html/composer.json
            - ./composer.lock:/var/www/html/composer.lock
            - PROJECT-data-sync:/var/www/html:nocopy

volumes:
    PROJECT-data-sync:
        external: true
&lt;/code&gt;
&lt;/pre&gt;
&lt;h3&gt;4. Запускаем в терминале в корне проекта&lt;/h3&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;
docker-sync start
# нужно подождать, пока всё синхронизируется
docker-compose -f docker-compose.yml -f docker-compose-sync.yml up -d
&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Запуск через &lt;span style="font-family: monospace;"&gt;docker-sync-stack start&lt;/span&gt; делает две команды выше, но остаётся висеть в консоли, а не уходит в фоновые процессы.&lt;/p&gt;
&lt;p&gt;Чтобы остановить, делаем ровно обратное&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="bash"&gt;
docker-compose stop
docker-sync stop
&lt;/code&gt;
&lt;/pre&gt;
</description>
</item>

<item>
<title>Как удалить всё, что создал docker-compose</title>
<guid isPermaLink="false">11</guid>
<link>https://maxkuznetsov.ru/all/kak-udalit-vsyo-chto-sozdal-docker-compose/</link>
<pubDate>Fri, 20 Mar 2020 01:16:51 +0300</pubDate>
<author>Максим Кузнецов</author>
<comments>https://maxkuznetsov.ru/all/kak-udalit-vsyo-chto-sozdal-docker-compose/</comments>
<description>
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;cd path/to/project
docker-compose stop
docker-compose down -v --rmi all --remove-orphans&lt;/code&gt;&lt;/pre&gt;</description>
</item>


</channel>
</rss>