Запуск и деплой сайта с Docker

Практическое использование Docker. Построение сетевой структуры сайта. Использование контенеров для локальной разработки. Сборка образов для продакшена и методы деплоя.

Скрытый контент
Комментарии (102)
Arunas

Спасибо большое.

Ответить
Arunas

где можно найти код?

Ответить
Дмитрий Елисеев

Добавили ссылку.

Ответить
Arunas

Спасибо, Вы самие лучшие.

Ответить
Юлия Елисеева

Спасибо за высокую оценку нашей работы!

Ответить
Антон

Не могу найти ссылку, где она?

Ответить
Антон

Все, я понял, это платно

Ответить
Александр Кулик

Вопрос поддерживаю.

Ответить
Дмитрий Елисеев

Добавили ссылку.

Ответить
Дмитрий Ориховский

Спасибо Дмитрий! Курс топ! Если будет возможность можешь раскатать как настроить Xdebug + Phpstorm + Docker. Спасибо!

Ответить
Роман

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

Ответить
Альберт

+

Ответить
Руслан

Было бы супер, у самого постоянные проблемы с докером и x-debug

Ответить
Максим

Поддерживаю про Xdebug

Ответить
Ruslan

Ребята, Вы вообще охренели? Здесь курсы о Программировании, как настроить Xdebug + Phpstorm на youtube посмотрите может и с Docker найдете. Разница в том, что нужно 9000 порт прокинуть, но вы же о Docker видео внимательно смотрели сообразите.

Ответить
Дмитрий Елисеев

Да, прокинуть 9000 порт. Но не снаружи внутрь, а изнутри наружу. Это сложнее.

Ответить
Дмитрий Елисеев

Да, добавил в седьмой эпизод.

Ответить
Software Engineer

Поддерживаю про Xdebug

Ответить
Denis

А почему изменилась темная тема на светлую? В чем причина?

Ответить
Дмитрий Елисеев

Многие жаловались, что частое переключение с тёмного редактора на светлый браузер неприятно.

Ответить
Aёct'ann

Нужно просто в браузере темную тему выставить и все будет гуд )

Ответить
Sergei

Есть замечательный плагин для хрома Dark reader. Делает все темным xD

Ответить
Arunas

про nginx, certbot, gateway: если gateway принцип с nginx и SSL сделать снаружи, вместе с certbot, letsendcrypt, а в докере оставить полный функционал сайта, ведь простом nginx ( не в докере) легче - проще следит за логами, запросами клиентов, делать certbot renew (с cron) , restart nginx...

Ответить
Дмитрий Елисеев

Если gateway с nginx и SSL сделать снаружи

Да, можно поднять отдельно снаружи без Docker. Но тогда нужно будет настраивать и обновлять его вручную или отдельными скриптами. Также придётся задавать контейнерам фиксированные IP-адреса, чтобы их указывать в proxy_pass такого прокси-сервера. А если ссылаемся на порты, то закрывать их от прямого доступа снаружи.

Так что дело вкуса и как всем будет удобнее. Если нужно вынести, то можно установить отдельно. Если не выносить, то отдельная работа с ним не нужна.

Делать certbot renew (с cron), restart nginx

Сам certbot с renew так и будет снаружи. А вместо service nginx restart можно также вызывать docker-compose restart gateway.

А в общем чтобы не возиться с Lets Encrypt на всех хостах проще один раз купить wildcard сертификат на год или два и его закидывать при деплое.

Проще следить за логами, запросами клиентов

Логи всё равно в итоге собираются из всех источников в одну кучу. Так что по удобству разницы нет.

Ответить
Arunas

Спасибо. А будут (хотя очень кратко) про логи - как: "итоге собираются из всех источников в одну кучу"?

Ответить
Дмитрий Елисеев

Да, когда дойдём до мониторинга.

Ответить
Ruslan

А правильно программировать учится будем ? :) Какой-то у вас план охватить весь производственный цикл? Это круто конечно, но праграммировать тоже хочется :)

Ответить
Дмитрий Елисеев

Да, здесь план охватить всё, как и анонсировали перед началом.

Ответить
Dmitry

А не лучше ли вместо apache воспользоваться внутренним механизмом certbot, да еще и его под docker'ом использовать?

Пример:

docker run -it --rm --name certbot \
            -v "/etc/letsencrypt:/etc/letsencrypt" \
            -v "/var/lib/letsencrypt:/var/lib/letsencrypt" \
	    -p 80:80 \
            certbot/certbot certonly --standalone \
              --email user@example.com \
              --agree-tos --no-eff-email \
              -d example.com
Ответить
Дмитрий Елисеев

Можно. Но тогда нужно будет как-то обойти ситуацию, когда появится новый поддомен и standalone повторно уже на поднятом проекте не сработает.

Ответить
Dmitry

Ну... А запустить больше одного раза? (для разных доменов)...

Ответить
Ruslan

Дмитрий всё написал уже, я бы добавил: wildcard сертификат - можно получить от Lets Encrypt через API домен диллера и через Ansible раскатать его повсюду логи: я тоже иногда туда заглядываю. Для дев машины :

docker exec -it web bash
web - название инстанца к которому вы хотите подключится.

а для хайлоуда всё пишется на удаленный сервер, чтобы не грузить диск.

Ответить
Ruslan

Супер материал.

Ответить
Руслан

Спасибо, все супер, когда ожидается следующий выпуск?

Ответить
Дмитрий Елисеев

Уже монтируем. Завтра будет.

Ответить
Maxim Niko

Спасибо, выпуск очень понравился! Если можно - сделайте шрифт побольше, а то даже с большого дисплея телефона 6.2" нужно всматриваться.

Ответить
Виктор

+++

Ответить
Дмитрий Елисеев

На смартфоне можно зумить видео.

Ответить
Sergei

Столько нюансов на докере, разгребать не просто :)

Ответить
Sergei

У меня есть вопрос: как очистить порты от предыдущего проекта? У меня на 8080 висят до симфони докера. Хочется не переименовывать порыт в конфигурации, а просто вычистить старые.

Ответить
Дмитрий Елисеев

Зайти в предыдущий и там выполнить docker-compose down

Ответить
Sergei

Спасибо за оперативность :)

Ответить
Ildar

Спасибо. все отлично, вопрос про продакшен: с какой целью копируется папка public (nginx) в докер контейнере?

Ответить
Дмитрий Елисеев

Чтобы скопировать favicon.ico.

Ответить
Ruslan

Вы не могли бы описать платформу на которой вы запускаете Докер, это Mac?

И еще, добавьте как на youtube like - dislake :) а то в ленте большая часть с благодарностями, и сложно искать полезные вопрос - ответы. Я так понимаю отдельного слак канала или форума нет.

Ответить
Дмитрий Елисеев

Эпизоды разрабатываю и записываю на компьютере с Ubuntu. Дома запускаю на MacBook.

Функциональность комментариев доработаю. Добавлю что-то вроде избранного.

Ответить
Ruslan

Тогда наших трудностей не видать (я о Винде)

Может кому пригодится я искал как удобно использовать VirtualBox and Docker, вот две статьи

Скрипты для этого занятия у меня отработали. (соврал, полностью не заработало). WSL 2 - чуть ли не единственный вариант для нормальной работы.

Ответить
elmut

переписал файл start.sh чтобы ручками постоянно не создавать

    win_to_unix_path(){ 
	wd="$(pwd)"
	cd "$1"
		the_path="$(pwd)"
	cd "$wd"
	echo $the_path
    }

    #VM=${DOCKER_MACHINE_NAME-default}
    VM=My-app
    VIRTUALBOX_CPU_COUNT=2
    VIRTUALBOX_MEMORY_SIZE=2024
    SHARE="C:\OSPanel\domains\Slim_Mobile_Framework\\"
    VIRTUALBOX_SHARE_FOLDE="${SHARE}\:$(win_to_unix_path "${SHARE}")"
    "${DOCKER_MACHINE}" create --driver=virtualbox --virtualbox-no-vtx-check --virtualbox-share-folder "${VIRTUALBOX_SHARE_FOLDE}" --virtualbox-cpu-count "${VIRTUALBOX_CPU_COUNT}" --virtualbox-memory "${VIRTUALBOX_MEMORY_SIZE}" $PROXY_ENV "${VM}"
Ответить
Павел

Дмитрий, вы как-то решали проблему медленной работы монтируемых VOLUMES под MAC OS X?

Ответить
Дмитрий Елисеев

Вариант обсуждали в комментариях.

Ответить
Александр Кулик

Кто работает на винде, как решить проблему с запуском команд из Makefile?

Он ругается, что docker-compose не найден, хотя алиас настроен и если из консоли, то все нормально работает.

Ответить
Ruslan

Установите в git в Windows

Ответить
Александр Кулик

Установлено, что дальше?

Ответить
Ruslan

Если ответить на ваш вопрос, то возьмите отсюда нужную часть, установите choco и потом Маке, кстати идея Шоколада мне понравилась. Но сразу хочу предупредить, путь через VirtualBox не будет простым и вам всегда придется думать о том, что вы сначала монтируете папку в виртуалку, а потом папку виртуалки в контейнер. В ссылке на статью вы найдете, что можно сунуть докер в старую винду, со старыми версиями и в текущей не работает. Опять "Но" - если установите WSL 2, то всё заработает. (Точнее я xdebug еще не тестил, но хочется верить что работает :) )

Ответить
Павел

Если кто-то будет пытаться запустить Docker на виртуальном сервере Используйте KVM а не OpenVZ Виртуализация OpenVZ работает на уровне ядра Linux также как и docker, т.е. docker там не запускается

Ответить
Сарибжанов Ильдар

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

Но это, конечно же, ИМХО.

Ответить
Дмитрий Елисеев

Проект строится именно под ключ, как и анонсировали в блоге перед его началом.

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

Ответить
Альберт

Подскажите почему не создается контейнер, вылетает с ошибкой php-cli_1 exited with code 0.

Ответить
Дмитрий Елисеев

Если код 0, то это не ошибка, а обычное завершение работы. Контейнер php-cli не запускается навечно как php-fpm, поэтому запускается и сразу завершается.

Ответить
Альберт

Спасибо чет тупанул )

Ответить
Arunas

в каком образе, в каком месте (при билде для прода) собырается-копируется каталог api/src? Напр. api/public копируется в api/docker/production/nginx/Dockerfile (стр.: COPY ./public ./public), а где есть (COPY ./crc ./src) ни где ненашёл :(...

Ответить
Дмитрий Елисеев

В php-образах копируется всё содержимое папки api в /app строкой COPY ./ ./

Ответить
Arunas

спасибо :)

Ответить
Konstantin

localhost:8080 открывается, а localhost:8081 - "Не удается получить доступ к сайту".

version: "3.3"
services:
  subproject1:
    build:
      context: subproject1/docker/development/nginx
    ports:
      - "8080:80"
    volumes:
      - ./subproject1:/app

  subproject2:
    build:
      context: subproject2/docker/development/nginx
    ports:
      - "8081:80"
    volumes:
      - ./subproject2:/app
    depends_on:
      - subproject2-php-fpm

  subproject2-php-fpm:
    build:
      context: subproject2/docker/development/php-fpm
    volumes:
      - ./subproject2:/app
"Containers": {
            "935768a945a1041daa9daa047c298cbe52ce81c489d6f7dd2cba50544cdb52cc": {
                "Name": "myproject_subproject2-php-fpm_1",
                "EndpointID": "c7d7c45d690a733c4212ae66e655bf8667f2558f1de2fa1559c4366fc7cc8fdc",
                "MacAddress": "02:42:c0:a8:10:02",
                "IPv4Address": "192.168.16.2/20",
                "IPv6Address": ""
            },
            "f140b5c683ae7a8ae0f754a3a7bf5b400dc2d9c3e778f5a6647a92e0b847ba6d": {
                "Name": "myproject_subproject1_1",
                "EndpointID": "38de8c3f33fca4ac7ad28a8796d2f1e1d7bdfa31a3391746db3bc157c804ce65",
                "MacAddress": "02:42:c0:a8:10:03",
                "IPv4Address": "192.168.16.3/20",
                "IPv6Address": ""
            }
        },

nmap показывает PORT STATE SERVICE 8080/tcp open http-proxy

PORT STATE SERVICE 8081/tcp closed blackice-icecap

Ответить
Konstantin

IP адреса 192.168.16.2 и 192.168.16.3 пингуются. В чем же дело? Порт 8081 закрыт? Как же его открыть?

Ответить
elmut
VBoxManage controlvm "${VM}" natpf1 "frontend,tcp,127.0.0.1,8080,,8080"
VBoxManage controlvm "${VM}" natpf1 "app,tcp,127.0.0.1,8081,,8081"
VBoxManage controlvm "${VM}" natpf1 "gateway-frontend,tcp,127.0.0.1,8085,,8085"
VBoxManage controlvm "${VM}" natpf1 "gateway-app,tcp,127.0.0.1,8086,,8086"
VBoxManage controlvm "${VM}" natpf1 "postgres,tcp,127.0.0.1,5432,,54321"
proxy_pass        http://frontend;
proxy_pass        http://app-nginx:81;
http://127.0.0.1:8086
http://127.0.0.1:8085
Ответить
Konstantin

Обнаружил одну странность. Выполнил инициализацию docker-compose - make init. Устал, хотел поиграть в CSS. Docker-compose еще запущен. Запускаю Steam, а он не может пройти авторизацию - что-то с сетью случилось. Остановил docker-compose - male down, после чего Steam удалось пройти авторизацию. Данное видео просмотрел 25 минут от начала.

Ответить
Николай

Рекомендую фичу: Я смотрю ваши видео с десктопа и планшета. На десктопе в браузере стоит расширение "The Great Suspender", которое "суспендит" неактивные вкладки и выгружает их из памяти, но когда я повторно открываю (перезапускаю) эту вкладку, то видео начинается с начала, а не с того места, где я остановился.

Youtube, например, запоминает момент на котором я остановился, более того, он запоминает это не только на текущем устройстве, а на всех (в аккаунте), таким образом, закрыв видео и открыв его на другом устройстве, оно начнет проигрываться с того момента, где закрыл.

Ответить
MaGu

Спасибо.

Ответить
Konstantin

Доброго дня!

Почему в случае development путь к conf.d: COPY ./common/nginx/conf.d /etc/nginx/conf.d, а в prod ./docker/common/nginx/conf.d /etc/nginx/conf.d?

Я расматриваю frontend

Ответить
Дмитрий Елисеев

Потому что указываются разные изначальные пути сборки в build: context: для дева и в docker build для прода.

В прод через COPY надо вкопировать файлы проекта, поэтому ему указываем корневую папку сборки frontend. А для дева копировать ничего из корня не нужно, поэтому можем указать frontend/docker.

Ответить
elmut

windows-10

docker-machine ip -- это IP виртуальной машины он может быть случайным docker is configured to use the default machine with IP 192.168.99.106

как его сделать localhost (127.0.0.1)

ответ:

ports:
    - "8080:80"

как переопределяли на 80 он выйдет нас 192.168.99.106:80

что бы изменить надо в Oracle VM VirtualBox изменить сеть. http://joxi.ru/J2bkO4LuGqd3gA

Ответить
Konstantin

Не могу найти в документации, как подключить блок кода в Dockerfile?

В Dockerfile перед командами (сразу после from ...) надо задать ENV для proxy. Это надо прописать в каждый Dockerfile. Хотел бы в одном месте пропиcать адреса proxy и их использовать уже в Dockerfile.

Ответить
Дмитрий Елисеев

Если нужно что-то передать в образ именно в момент сборки, то можно использовать build-arg.

А вообще чтобы такие вещи передавать через environments можно изначально расставить вместо значений плейсхолдеры и при запуске подменять их в своём ENTRYPOINT c помошью утилиты sed.

Ответить
Konstantin

Ребята, ребята, как решить проблему composer'а

[RuntimeException]
  Could not scan for classes inside "database/seeds" which does not appear to be a file nor a folder.

я в api поставил Laravel

Ответить
Дмитрий Елисеев

Указать правильно путь к database/seeds.

Ответить
Konstantin

Смотрю production/php-fpm/Dockerfile. Там написано copy ./composer.json ./composer.lock ./ и ниже composer install. Получается в пустую директорию копируются вот эти два файла и выполняется установка пакетов. А где будут лежать файлы проекта? Я смотрю build production.

Ответить
Дмитрий Елисеев

Файлы проекта докопируются уже ниже командой COPY ./ ./.

Ответить
MaGu

У кого 10 винда и doker для винды установлен. И все вроде норм, но команда make как и Makefile бесполезен => тут я 2 варианта нашел.

Проект оперсорс.

Все по инструкции и добавить установленную папку в переменный среды винды PATH.
Только в каждый проект надо 3 файла добавлять в рабочую папку проекта. Ну и соответственно их надо в гитИгнор кинуть

Ответить
Дмитрий

Спасибо, работает :)

Ответить
liskar

У меня почему то без

location / {
    root /app/public;
 }

в default.conf не работало

Ответить
Sergei

Там на офиц сайте докера появилась некая эксперbментальная версия Edge. Обещают, что будет работать лучше с виндой, но это не точно :)

Ответить
ProMix

А будет где-то репак с кодом?

Ответить
Дмитрий

Почему nginx для веб-сервера?

Ответить
Дмитрий Елисеев

Потому что это производительный и легковесный сервер.

Ответить
Максим

Как насчёт редеплоя отдельного сервиса?

Ответить
Дмитрий Елисеев

Что имеется в виду?

Ответить
Максим

Как передеплоить отдельный сервис? Если изменения в одном сервисе из n сервисов, зачем перезапускать все сервисы.

Ответить
Дмитрий Елисеев

Тогда нужно каждому сервису вручную прописывать отдельную версию. Но это неудобно.

Ответить
Ivan

Чем вообще отличается php-fpm от apache? Почему юзаем фпм а не апач?

Ответить
Дмитрий Елисеев

Для PHP используют либо Apache с mod_php, либо Nginx с php-fpm.

Nginx легковеснее, универсальнее и более удобен в конфигурации.

Ответить
Ivan

ну я имею в виду по принципу работы - php-fpm чем-то отличается от мод пхп?

Ответить
Дмитрий Елисеев

Пакет mod_php – это просто плагин к Apache.
А php-fpm – это отдельно запускаемый на своём порту процесс.

Ответить
Ivan

Да, я понимаю. Я имею в виду - что из этого следует? mod_php как-то по-другому обрабатывает php нежели php-fpm? Расскажите пожалуйста подробнее про принцип работы

Ответить
Дмитрий Елисеев

Есть внутренние различия работы с выделением процессов.

Ответить
Дмитрий

Дима, если попытаться зайти на сайт через www.demo-auction.deworker.pro, то получаем ошибку

Не удается получить доступ к сайту
Не удалось найти IP-адрес сервера www.demo-auction.deworker.pro
Ответить
Дмитрий Елисеев

Добавил CNAME запись в DNS. Теперь открывается.

Ответить
Ivan

А где в production api conf обращение к php fpm для файлов php?

Ответить
Ivan

А, все правильно. он по 80 порту

Ответить
Дмитрий Елисеев

В конфигурации Nginx настроено проксирование на php-fpm:9000.

Ответить
Ivan

Спасибо, все в порядке ) я смотрел не туда (в самом api-nginx это есть- я смотрел на gateway и перепутал)

Ответить
Зарегистрируйтесь или войдите чтобы оставить комментарий