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

标签 mysql docker nginx docker-compose virtualhost

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

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

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

  • Ubuntu 18.04
  • LAMP(带有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,我确定了以下配置。
  • 我使用“nginx-proxy”和“mailhog”容器创建了一个docker-compose文件。我正在使用我发现的教程中的图像“jwilder / nginx-proxy:alpine”,因此可以为每个客户端的Web容器使用虚拟主机。
  • 每个客户端将拥有自己的Web容器,但根据其生产环境,每个客户端可能是不同的镜像。
  • 对所有数据库使用本地安装的MySql服务或一个MySql容器。

  • 主要的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
    

    回顾一下,这两个配置文件可以工作。我可以使用不同的文件,数据库和主机名并排运行两个站点/ Web容器。什么是行不通的:
  • 使用具有2 GB大型数据库的MySql容器或连接到本地MySql服务。
  • 能够通过https从端口443访问容器。

  • 我对其他配置持开放态度,任何建议都将不胜感激。同样,我的目标是让多个站点/容器具有不同的apache或PHP配置并排运行,并且可以由唯一的虚拟主机访问。

    最佳答案

    您无法同时使用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>
    

    希望这可以帮助...

    关于mysql - 使用Docker进行本地Web开发的HTTPS和MySql问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59989428/

    相关文章:

    mysql - SSRS 问题匹配日期与参数

    php - 在 Laravel 的 Eloquent 查询中指定一个选择子句

    MySQL 选择一个字段中的值与另一表中的值匹配的行

    tomcat - 具有反向代理的 NGINX 多服务器 block

    mysql - 有些 mySQL 语句仅在附加\g 之后才起作用,其他语句不介意吗?

    maven - Jenkins使用docker构建无法访问nexus的Maven镜像

    docker - kube-dns 无法解析 'kubernetes.default.svc.cluster.local'

    java - 如何像这样将 docker-compose 部署到网络上

    php - Nginx - 405 不允许 - fastcgi 超时

    python - Tornado nginx websockets 握手 400 错误