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

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

Скрытый контент
Комментарии (90)
Arunas
2019-12-22 20:19

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

Ответить
Arunas
2019-12-22 20:24

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

Ответить
Дмитрий Елисеев
2019-12-22 21:47

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

Ответить
Arunas
2019-12-23 06:50

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

Ответить
Юлия Елисеева
2019-12-28 05:58

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

Ответить
Антон
2020-04-30 19:19

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

Ответить
Антон
2020-04-30 20:17

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

Ответить
Александр
2019-12-22 21:37

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

Ответить
Дмитрий Елисеев
2019-12-22 21:47

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

Ответить
Дмитрий Ориховский
2019-12-23 07:45

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

Ответить
Роман
2019-12-23 12:32

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

Ответить
Альберт
2019-12-23 15:56

+

Ответить
Руслан
2019-12-23 16:14

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

Ответить
Максим
2019-12-23 17:24

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

Ответить
Ruslan
2019-12-24 09:27

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

Ответить
Дмитрий Елисеев
2019-12-24 12:51

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

Ответить
Дмитрий Елисеев
2019-12-28 06:32

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

Ответить
Software Engineer
2019-12-29 14:43

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

Ответить
Denis
2019-12-23 19:29

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

Ответить
Дмитрий Елисеев
2019-12-24 07:48

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

Ответить
<Котейка />
2019-12-24 09:28

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

Ответить
Sergei
2019-12-27 12:47

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

Ответить
Arunas
2019-12-24 11:15

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

Ответить
Дмитрий Елисеев
2019-12-24 13:34

Если 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
2019-12-24 17:38

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

Ответить
Дмитрий Елисеев
2019-12-24 20:38

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

Ответить
Ruslan
2019-12-26 11:46

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

Ответить
Дмитрий Елисеев
2019-12-28 06:35

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

Ответить
Dmitry
2020-05-20 13:53

А не лучше ли вместо 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
Ответить
Дмитрий Елисеев
2020-05-22 05:59

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

Ответить
Dmitry
2020-05-22 07:06

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

Ответить
Ruslan
2019-12-24 16:14

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

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

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

Ответить
Ruslan
2019-12-24 13:04

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

Ответить
Руслан
2019-12-25 14:30

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

Ответить
Дмитрий Елисеев
2019-12-25 14:34

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

Ответить
Maxim Niko
2019-12-25 17:50

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

Ответить
Виктор
2019-12-27 22:27

+++

Ответить
Дмитрий Елисеев
2019-12-28 19:37

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

Ответить
Sergei
2019-12-27 16:42

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

Ответить
Sergei
2019-12-29 17:10

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

Ответить
Дмитрий Елисеев
2019-12-29 18:57

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

Ответить
Sergei
2019-12-29 19:44

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

Ответить
Ildar
2019-12-30 10:45

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

Ответить
Дмитрий Елисеев
2019-12-30 11:33

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

Ответить
Ruslan
2020-01-01 22:18

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

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

Ответить
Дмитрий Елисеев
2020-01-02 07:09

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

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

Ответить
Ruslan
2020-01-02 15:23

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

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

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

Ответить
elmut
2020-03-07 17:03

переписал файл 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}"
Ответить
Павел
2020-01-10 16:11

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

Ответить
Дмитрий Елисеев
2020-01-10 16:16

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

Ответить
Александр
2020-01-03 17:04

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

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

Ответить
Ruslan
2020-01-04 09:51

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

Ответить
Александр
2020-01-04 10:09

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

Ответить
Ruslan
2020-01-05 22:28

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

Ответить
Павел
2020-01-09 19:21

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

Ответить
Сарибжанов Ильдар
2020-01-12 14:26

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

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

Ответить
Дмитрий Елисеев
2020-01-13 09:52

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

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

Ответить
Альберт
2020-01-13 10:52

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

Ответить
Дмитрий Елисеев
2020-01-13 10:57

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

Ответить
Альберт
2020-01-13 11:24

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

Ответить
Arunas
2020-01-26 15:26

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

Ответить
Дмитрий Елисеев
2020-01-26 16:06

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

Ответить
Arunas
2020-01-26 16:28

спасибо :)

Ответить
Konstantin
2020-01-30 17:44

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
2020-01-30 18:05

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

Ответить
elmut
2020-03-29 07:24
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
2020-01-31 04:45

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

Ответить
Николай
2020-02-08 00:18

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

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

Ответить
MaGu
2020-02-28 11:21

Спасибо.

Ответить
Konstantin
2020-03-05 11:56

Доброго дня!

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

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

Ответить
Дмитрий Елисеев
2020-03-05 16:47

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

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

Ответить
elmut
2020-03-06 16:11

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
2020-03-10 10:30

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

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

Ответить
Дмитрий Елисеев
2020-03-12 08:50

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

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

Ответить
Konstantin
2020-03-10 11:36

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

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

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

Ответить
Дмитрий Елисеев
2020-03-12 08:51

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

Ответить
Konstantin
2020-03-10 11:58

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

Ответить
Дмитрий Елисеев
2020-03-12 08:52

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

Ответить
MaGu
2020-03-10 16:19

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

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

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

Ответить
Дмитрий
2020-06-02 18:14

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

Ответить
liskar
2020-04-18 23:09

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

location / {
    root /app/public;
 }

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

Ответить
Sergei
2020-04-19 19:40

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

Ответить
ProMix
2020-04-30 20:50

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

Ответить
Дмитрий
2020-06-01 21:26

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

Ответить
Дмитрий Елисеев
2020-06-07 05:36

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

Ответить
Максим
2020-07-10 18:33

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

Ответить
Дмитрий Елисеев
2020-07-11 21:05

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

Ответить
Максим
2020-07-12 06:37

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

Ответить
Дмитрий Елисеев
2020-07-12 14:24

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

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