HTTPS и MySql проблемы с использованием Docker для локальной веб-разработки - PullRequest
1 голос
/ 30 января 2020

Моя цель состоит в том, чтобы несколько сайтов / контейнеров с различными конфигурациями apache или PHP работали бок о бок и были доступны для уникальных виртуальных хостов. Таким образом, я могу быстро переключаться между сайтами / клиентами / контейнерами по мере необходимости.

В настоящее время я использую LAMP при локальной разработке веб-сайтов и приложений. Иногда мне нужно установить дополнительные PHP пакеты или переключаться между PHP версиями. В последнее время мне пришлось много переключаться, и даже у меня был сайт, на котором был установлен Memcache. Я пытался использовать Docker, мне нравится идея иметь файл конфигурации, который можно сохранить для каждого проекта, поэтому, когда клиент возвращается через 6 месяцев, я могу быстро настроить ту же среду.

Я настроил Docker и создал несколько контейнеров, чтобы узнать, как его использовать. Но я столкнулся с несколькими проблемами с моей текущей конфигурацией. Моя локальная установка:

  • Ubuntu 18.04
  • LAMP (w / MySql)
  • Apache с VirtualHosts

Я прочитал несколько учебных пособий, посмотрел несколько часов видео об обучении в LinkedIn и начал с установки WordPress, чтобы быстро подтвердить, что и MySql, и веб-контейнеры работают. Я обнаружил следующие проблемы.

  • Мне нужно было остановить локальные службы MySql и Apache. Запуск LAMP и docker рядом не удавался каждый раз. Не проблема, потому что цель состоит в том, чтобы перейти на Docker.
  • Я работаю на нескольких сайтах / клиентах каждый день, поэтому мне понадобится несколько веб-контейнеров, работающих бок о бок, используя виртуальные хосты вместо 127.0.0.1. Каждое учебное пособие показывает одну docker -компонованную конфигурацию с веб-контейнерами и MySql контейнерами.
  • Наличие контейнера MySql для каждого проекта не является идеальным из-за конфликтов портов. Вместо этого я бы предпочел иметь один контейнер MySql для всех проектов или подключиться к локально установленной службе MySql.
  • Я попытался создать один контейнер MySql для всех контейнеров, к которым можно подключиться. Это работало, но я не смог импортировать большую 2 ГБ клиентскую базу данных, поэтому я сдался и вместо этого хотел бы использовать локально установленную службу MySql. Пробовал, но похоже, что docker на Linux имеет проблемы с подключением к локальной машине.
  • Мне нужно иметь доступ к веб-контейнерам через порты 80 и 443 для http и https. Мне не нужна настройка сертификата SSL, и предупреждение браузера выдается каждый раз, когда я go обращаюсь к виртуальному хосту через https. Но что-то не так с файлом docker -compose моего клиента, потому что недоступно 443.

Из того, что я прочитал, и из игры с docker -compose я остановился на следующем Конфигурация.

  1. Я создал docker -композитный файл с контейнерами "nginx -proxy" и "mailhog". Я использую образ "jwilder / nginx -proxy: alpine" из учебника, который я нашел, чтобы я мог использовать виртуальный хост для веб-контейнера каждого клиента.
  2. Каждый клиент будет иметь свой собственный веб-контейнер, но может быть разными образами для каждого в зависимости от их производственной среды.
  3. Используйте локально установленную службу MySql или один контейнер MySql для всех баз данных.

Main NGINX docker -compose.yml

version: "3.1"
services:

  # ngix so we can have multiple sites running with virtualhosts
  nginx-proxy:
    container_name: nginx
    image: jwilder/nginx-proxy:alpine
    ports:
      - "80:80"
      - "443:443"
      #- "3305:3305"
      #- "8025:8025"
    extra_hosts:
      - "dockerhost:192.100.10.3"
    volumes:
      - ./certs:/etc/nginx/certs
      - /var/run/docker.sock:/tmp/docker.sock:ro
    restart: unless-stopped

  # mailhog
  mailhog:
    container_name: mailhog
    image: mailhog/mailhog
    ports: 
      - 8025:8025 # web ui
    environment:
      VIRTUAL_PORT: 8025
    expose:
      - 8025

# stop here
networks:
  default:
    external:
      name: nginx-proxy

Клиенты docker -compose.yml

version: '3.1'

# containers/ instances
services:

  # wordpress container
  wordpress:
    container_name: clientname
    image: wordpress:latest
    restart: unless-stopped
    environment:
      WORDPRESS_DB_HOST: mysqldb
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_PASSWORD: password
      WORDPRESS_DB_NAME: wptest
      VIRTUAL_HOST: docker-second-text.local
      VIRTUAL_PORT: 80
    volumes:
      - ./wordpress:/var/www/html
    expose:
      - 80
      - 443

# stop here
volumes:
  wordpress: {}

networks:
  default:
    external:
      name: nginx-proxy

Повторим, два файла конфигурации работают. Я могу запустить два сайта / веб-контейнера рядом с разными файлами, базами данных и именами хостов. Не работает:

  1. Использование контейнера MySql с большой базой данных 2 ГБ или подключение к локальной службе MySql.
  2. Возможность доступа к контейнеру из порта 443 через https.

Я открыт для другой конфигурации, и любые предложения приветствуются. Опять же, моя цель состоит в том, чтобы несколько сайтов / контейнеров с различными конфигурациями apache или PHP работали бок о бок и были доступны для уникальных виртуальных хостов.

1 Ответ

0 голосов
/ 31 января 2020

Причина, по которой вы не можете одновременно использовать apache и контейнер, заключается в том, что вы открываете порты в своем docker -compose.yml. Так что порты заблокированы. Expose означает, что ваш контейнер будет доступен по протоколу hostIP: Port, но порт может использоваться только одним приложением одновременно.

Я думаю, у вас запущена запрошенная настройка. Я использую nginx в качестве обратного прокси-сервера, установленного на хосте docker, чтобы выставить другой контейнер под поддоменами, например. app1.example.com, app2.example.com

Я использую разные docker сети для контейнера, поэтому они остаются изолированными.

Сначала создайте внешние docker сети:

docker network create --driver=bridge --subnet=192.168.1.0/29 --gateway=192.168.1.1 app1net
docker network create --driver=bridge --subnet=192.168.1.8/29 --gateway=192.168.1.9 app2net

Вы можете использовать меньшие или большие сети, если это необходимо. Не забудьте разрешить traffi c в и из сетей проходить через межсетевой экран вашего хоста.

Пример docker -compose.yml:

version: '3.1'

services:

  wordpress:
    image: wordpress:5.3.2-php7.4-apache
    restart: always

    links:
      - db:db
    environment:
                  WORDPRESS_DB_HOST: db:3306
                  WORDPRESS_DB_USER: wordpress
                  WORDPRESS_DB_PASSWORD: Pa$$w0rd
                  WORDPRESS_DB_NAME: wordpressdb
                  WORDPRESS_TABLE_PREFIX: wp_
    volumes:
        - ./html:/var/www/html
    networks:
            app1net:
                ipv4_address: 192.168.1.2

  phpmyadmin:
      image: phpmyadmin/phpmyadmin

      links:
        - db:db
      networks:
              app1net:
                ipv4_address: 192.168.1.3

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: wordpressdb
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: Pa$$w0rd
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - ./mysql:/var/lib/mysql
    networks:
            app1net:
                    ipv4_address: 192.168.1.4

networks:
        app1net: 
                external: 
                        name: app1net

Доступны различные сервисы через 192.168.1.0/29 net с хоста.

Далее настройте сервер nginx virtal, но вы также можете использовать apache в качестве прокси:

NGINX прокси:

server {
    listen 1.2.3.4:80 http2;
    listen 1.2.3.4:443 ssl http2;
    server_name app1.example.com;
    index index.php index.html index.htm;

    ssl_certificate /ssl/sslcert.pem;
    ssl_certificate_key /ssl/privkey.pem;

    location / {
        try_files $uri @wordpress;
    }
    location / {
        try_files $uri @phpmyadmin;
    }


    location @wordpress{
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://192.168.1.2;
    }
    location @phpmyadmin{
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host;
        proxy_pass http://192.168.1.3;
    }

}

прокси Apache2:

<VirtualHost 1.2.3.4:443>
    ServerName app1.example.com

    SSLEngine on
    SSLHonorCipherOrder on
    SSLCertificateFile /ssl/sslcert.pem
    SSLCertificateKeyFile /ssl/privkey.pem

    ProxyPreserveHost On
    ProxyPass / http://192.168.1.2
    ProxyPassReverse / http://192.168.1.2             
</VirtualHost>
<VirtualHost 1.2.3.4:80>
    ServerName app1.example.com

    ProxyPreserveHost On
    ProxyPass / http://192.168.1.2
    ProxyPassReverse / http://192.168.1.2             
</VirtualHost>

Возможно, вам придется отредактировать конфигурацию по умолчанию apache в /etc/apache2/ports.conf, чтобы установить прослушиваемые ip / ports или отключить apache завершено. Вот почему вы не можете запустить оба сервера одновременно. Apache использует их. Но если вы используете apache в качестве прокси, это не нужно.

Listen 127.0.0.1:80

<IfModule ssl_module>
        Listen 127.0.0.1:443

</IfModule>

<IfModule mod_gnutls.c>
    Listen 127.0.0.1:443
</IfModule>

Надеюсь, это поможет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...