[使用Docker进行本地Web开发的HTTPS和MySql问题

问题描述 投票:1回答:1

我的目标是让多个具有不同apache或PHP配置的站点/容器并排运行,并且可以由唯一的虚拟主机访问。这样,我可以根据需要在站点/客户端/容器之间快速切换。

我目前在本地开发网站和应用程序时使用LAMP。有时我需要安装额外的PHP软件包或在PHP版本之间切换。最近,我需要进行很多切换,甚至还需要安装需要Memcache的站点。我一直在研究使用Docker,我喜欢一个可以为每个项目保存的配置文件的想法,因此当客户端在6个月后回来时,我可以快速设置相同的环境。

我已经安装了Docker,并创建了一些容器来学习如何使用它。但是我在当前配置中遇到了一些问题。我的本地设置是:

  • Ubuntu 18.04
  • LAMP(w / MySql)
  • 带有VirtualHosts的Apache

我读了一堆教程,观看了几个小时的LinkedIn学习视频,并从WordPress设置开始,以快速确认MySql和Web容器是否正常工作。我发现了以下问题。

  • 我需要停止本地MySql和Apache服务。每次并排运行LAMP和docker失败。这不是问题,因为目标是迁移到Docker。
  • 我每天在多个站点/客户端上工作,因此我需要使用虚拟主机而不是127.0.0.1并排运行的多个Web容器。每个在线教程都显示了一个使用Web和MySql容器的docker-compose配置。
  • 由于端口冲突,为每个项目使用MySql容器并不理想。相反,我希望所有项目都具有一个MySql容器,或者连接到本地安装的MySql服务。
  • 我试图为所有要连接的容器创建一个MySql容器。它可以工作,但是我无法导入客户端的2 GB大数据库,因此我放弃了,而是想使用本地安装的MySql服务。尝试过,但是Linux上的docker似乎无法连接到本地计算机。
  • 我需要能够通过端口80和443访问http和https的Web容器。我不需要SSL证书设置,每次我通过https进入虚拟主机时,浏览器警告都很好。但是我的客户端的docker-compose文件出了问题,因为443不可用。

[从我读过的东西以及从docker-compose的学习中,我已经确定了以下配置。

  1. 我用“ nginx-proxy”和“ mailhog”容器创建了一个docker-compose文件。我正在使用我发现的教程中的图像“ jwilder / nginx-proxy:alpine”,因此可以为每个客户端的Web容器使用虚拟主机。
  2. 每个客户都有自己的Web容器,但根据他们的生产环境,每个客户可能会有不同的图像。
  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

Clients 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

回顾一下,两个配置文件正常工作。我可以使用不同的文件,数据库和主机名并排运行两个站点/ Web容器。什么是行不通的:

  1. 使用具有2 GB大型数据库的MySql容器或连接到本地MySql服务。
  2. 能够通过https从端口443访问容器。

我愿意接受其他配置,任何建议都值得赞赏。同样,我的目标是让多个站点/容器具有不同的apache或PHP配置并排运行,并且可以由唯一的虚拟主机访问。

mysql docker nginx docker-compose virtualhost
1个回答
0
投票

您无法同时使用apache和容器的原因是,您在docker-compose.yml中公开了端口。因此端口被阻塞。公开意味着您的容器将可以在hostIP:Port下访问,但是一个端口只能同时被一个应用程序使用。

我想,我正在运行您请求的设置。我将nginx用作安装在docker主机上的反向代理,以在subdmoains下公开不同的容器,例如。 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

如果需要,您可以使用较小或较大的蚊帐。不要忘了允许进出网络的流量通过您的主机防火墙。

样本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网络访问不同的服务。

接下来配置nginx虚拟服务器,但您也可以将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>

您可能必须在/etc/apache2/ports.conf下编辑apache默认配置,以设置侦听ip /端口或禁用apache complete。这就是为什么您不能同时运行两个服务器的原因。 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>

希望这有帮助...

© www.soinside.com 2019 - 2024. All rights reserved.