Docker для ленивых: Локальная разработка сайтов. Часть 2

Люди не понимают потрясающих возможностей разумного использования технологий.

Жак Фреско

Это продолжение статьи Docker для ленивых: Локальная разработка сайтов. Часть 1 и в ней мы разберемся как запустить несколько сайтов параллельно используя для каждого свой docker-compose.yml

Что мы будем делать?

Мы выведем Traefik и Portainer в отдельный проект (для этого создадим папку traefik) и  файл docker-compose.yml, так как все новые и старые проекты будут при запуске присоединены к ним, таким образом мы сразу получаем контроль над всеми запущенными нами проектами!

Для этого перед стартом нам нужно будет создать свою виртуальную сеть “gateway” (название можете выбрать сами) следующей командой в терминале или командной строке:

docker network create --driver=bridge --attachable --internal=false gateway

После этого запишем в docker-compose.yml следующие инструкции:

version: "3.3"

services:
  # Настройки для Traefik
  traefik:
    image: traefik
    container_name: global_traefik
    restart: "always"
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    command: --api.insecure=true --providers.docker
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    # Указываем что Traefik будет работать с нашей виртуальной сетью
    networks:
      - default

  # Настройки для Portainer
  portainer:
    image: portainer/portainer
    container_name: "global_portainer"
    command: --no-auth -H unix:///var/run/docker.sock
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    labels:
      - "traefik.http.routers.global_portainer.rule=Host(`portainer.localhost`)"
    # Указываем что Portainer будет работать с нашей виртуальной сетью
    networks:
      - default

# Объявляем Docker'у как default ранее созданную нами виртуальную сеть с именем "gateway"
networks:
  default:
    external:
      name: gateway

# Перед запуском этого файлане забываем создать виртуальную сеть с именем "gateway" следующей командой:
# docker network create --driver=bridge --attachable --internal=false gateway

Сохраняем файл.

Теперь добавляем к файлу HOSTS следующие домены:

127.0.0.1 localhost
127.0.0.1 portainer.localhost

 И запускаем файл traefik/docker-compose.yml командой:

docker-compose up -d

Теперь у нас есть доступ к двум доменам:

http://localhost:8080/dashboard/#/ - графический контроль над прокси сервером Traefik
http://portainer.localhost/#/home - графический контроль над Portainer’ом

Как теперь присоединить новый или ранее созданный сайт к нашей виртуальной сети?

Это можно сделать немного изменив файл docker-compose.yml в созданном нами ранее проекте my-project, это было описано в предыдущей статье Docker для ленивых: Локальная разработка сайтов. Часть 1.

Заходим в папку my-project и открываем docker-compose.yml и заменяем его содержимое следующими инструкциями:

version: "3.3"

services:

  # Настроавиваем контейнер для PHP
  php:
    # Выбираем образ wodby/drupal-php так как в нем уже все настроено и установлены компоненты для PHP Вот документация https://github.com/wodby/drupal-php
    # Если вы будете работать не с Drupal то моищите на https://hub.docker.com/ подходящий образ для Вашей CMS.
    image: wodby/drupal-php:$PHP_TAG
    # Задаем понятное нам имя для контейнера используя переменную которую мы объявили в ранее созданном файле .env
    container_name: "${PROJECT_NAME}_php"
    # Теперь задаем настройки для самого PHP
    environment:
      PHP_SENDMAIL_PATH: /usr/sbin/sendmail -t -i -S opensmtpd:25
      DB_HOST: $DB_HOST
      DB_PORT: $DB_PORT
      DB_USER: $DB_USER
      DB_PASSWORD: $DB_PASSWORD
      DB_NAME: $DB_NAME
      DB_DRIVER: $DB_DRIVER
      PHP_FPM_USER: wodby
      PHP_FPM_GROUP: wodby
    # Даем доступ PHP к нашей папки WWW где будет размещен сайт
    volumes:
      - ./www:/var/www/html:cached
    # Добавляем к контейнеру внутреннюю виртуальную сеть, объединяющие наши контейнеры
    networks:
      - network

  # Настроавиваем контейнер для MySQL
  mysql:
    # здесь все так же как и в PHP, указываем нужный нам образ, задаем версию MySQL, имя для контейнера и настройки
    image: mysql:$MYSQL_TAG
    container_name: "${PROJECT_NAME}_mysql"
    environment:
      MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
      MYSQL_PASSWORD: $DB_PASSWORD
      MYSQL_USER: $DB_USER
      MYSQL_DATABASE: $DB_NAME
    # Позволяем MySQL хранить Базу данных test в папке db которая автоматически будет создана в папке нашего проекта my-project
    volumes:
      - ./db:/var/lib/mysql
    # Добавляем к контейнеру внутреннюю виртуальную сеть, объединяющие наши контейнеры
    networks:
      - network

  # Настроавиваем контейнер для PHPMySQLAdmin
  pma:
    image: phpmyadmin/phpmyadmin
    container_name: "${PROJECT_NAME}_pma"
    environment:
      PMA_HOST: $DB_HOST
      PMA_USER: $DB_USER
      PMA_PASSWORD: $DB_PASSWORD
      UPLOAD_LIMIT: 1G
      PMA_PORT: $DB_PORT
    # А вот тут мы задаем поддомен для PHPMySQLAdmin в виде http://pma.my-project.local используя Traefik
    labels:
      - "traefik.http.routers.${PROJECT_NAME}_pma.rule=Host(`pma.${PROJECT_BASE_URL}`)"
    # Объясняем Docker что PHPMySQLAdmin не можетработать без MySQL
    depends_on:
      - mysql
    # Так как наш контейнер с PHPMySQLAdmin должен иметь возможность отдавать данные нам в браузер, то мы должны его присоединить не только в внутренней сети нашего проекта, но и к ранее созданной сети "gateway"!
    networks:
      - default
      - network

  # Настроавиваем контейнер для Apache, здесь мы будем использовать образ wodby/apache, так как он уже настроен под Drupal. Вот документация https://github.com/wodby/apache
  apache:
    image: wodby/apache:$APACHE_TAG
    container_name: "${PROJECT_NAME}_apache"
    # Объявляем необходимость контейнера с PHP
    depends_on:
      - php
    environment:
      APACHE_LOG_LEVEL: debug
      APACHE_BACKEND_HOST: php
      APACHE_VHOST_PRESET: php
      APACHE_DOCUMENT_ROOT: /var/www/html
    # Указываем Apache что наш проект будет лежать в папке my-project/www
    volumes:
      - ./www:/var/www/html
    # Инструкция для Traefik чтобы сайт открывался по адресу http://my-project.local который мы задали в .env
    labels:
      - "traefik.http.routers.${PROJECT_NAME}_apache.rule=Host(`${PROJECT_BASE_URL}`)"
    # Так как наш контейнер с Apache должен иметь возможность отдавать данные нам в браузер, то мы должны его присоединить не только в внутренней сети нашего проекта, но и к ранее созданной сети "gateway"!
    networks:
      - default
      - network

# Объявляем сети, как ранее созданную сеть "gateway" так и частную виртуальную сеть для нашего проекта
networks:
  default:
    external:
      name: gateway
  network:
    internal: true

Как видите по сравнению с ранее использованными инструкциями мы добавили сети и убрали Traefik и Portainer, так как они у нас уже запущены и работают!

Теперь давайте поправим наш HOSTS файл убрав из него вот эту строку (отмечена перечеркиванием), так как Portainer теперь у нас работает по адресу http://portainer.localhost:

127.0.0.1 my-project.local
127.0.0.1 pma.my-project.local
127.0.0.1 portainer.my-project.local

Отлично! Давайте запустим наш проект уже ставшей привычной нам командой:

docker-compose up -d

В результате мы получим доступ к двум доменам:

http://my-project.local
http://pma.my-project.local

А перейдя на страницу Portainer’а http://portainer.localhost Вы сможете увидеть все созданные нами сети, контейнеры, образы, виртуальные папки и управлять ими прямо из графического интерфейса:

Снимок экрана

На главной странице Portainer’а Вы увидите краткую сводку, а в левом меню сможете просмотреть всю детальную информацию о том что запущено и используется Docker’ом в режиме реального времени.

И в качестве самостоятельного задания попробуйте сами отредактировать docker-compose.yml в нашем втором проекте my-site, который мы создавали в прошлой статье! Так же добавляйте сети к контейнерам, убирайте trafick и portainer и запускайте!

Результат вы увидите на странице Portainer’а.

Если у Вас появились вопросы, не стесняйтесь пишите мне!
Оставьте Ваш комментарий