【问题标题】:Docker-compose for mysql, phpmyadmin and nginx用于 mysql、phpmyadmin 和 nginx 的 Docker-compose
【发布时间】:2020-06-19 17:07:33
【问题描述】:

我想使用一个 dockerized SQL 数据库服务器、一个额外的客户端(这里是:phpmyadmin)和一个反向代理来使客户端接口可以从外部服务器访问。

到目前为止,我使用了这个 docker-compose 文件:

version: '3'

services:
        mariatest:
                image: mysql
                restart: always
                networks:
                       - dbnet
                environment:
                        MYSQL_ROOT_PASSWORD: password
                        MYSQL_DATABASE: test
                        MYSQL_USER: test
                        MYSQL_PASSWORD: test

        phpmatest:
                depends_on:
                        - mariatest
                image: phpmyadmin/phpmyadmin
                restart: always
                networks:
                        - dbnet
                ports:
                        - "9080:80"
                environment:
                        MYSQL_ROOT_PASSWORD: password
                        PMA_HOST: mariatest

        reverse:
                image: nginx
                networks:
                        - dbnet
                ports:
                        - "8000:80"
                volumes:
                        - /var/dockervolumes/nginx:/etc/nginx

networks:
     dbnet:

从卷中取出我得到的 nginx default.conf 文件为

server {
    listen       80;
    server_name  localhost;

    location / {
        proxy_set_header X-Real-IP  $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://localhost:9080/;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

当使用带有http://localhost:9080 的本地机器时,我可以毫无问题地使用 PMA。尝试使用反向代理地址 (http://localhost:8000) 时,我只收到一个 nginx 错误,我正在寻找的页面不可用。在日志中,我看到反向代理在 connect() 上失败,连接被拒绝。

这样的设置我缺少什么?

【问题讨论】:

    标签: docker nginx docker-compose


    【解决方案1】:

    很可能是因为 localhost 是基于容器的。您是否尝试过输入您的主机的 IP 地址,例如:

    proxy_pass http://[HOSTIP]:9080/;
    

    您可能需要静态化容器 IP 或通过主机名请求它们。要使用 DNS,请设置容器主机名(一种方法是设置 container_name),例如:

    services:
        phpmatest:
            container_name: phpmatest
    

    在 nginx 配置文件中:

    proxy_pass http://phpmatest:80/;
    

    应该可以工作,因为它们在同一个容器网络上。

    您还需要设置 nginx 以从 docker 接收 DNS,以防容器需要重新启动或更改。在其他地方有关于如何做到这一点的教程。

    【讨论】:

    • 我添加了容器名称和容器名称的 nginx conf - 重新启动后,nginx 处理 url 中的名称,但在连接到上游时失败并出现“连接被拒绝”
    • 您是否从您的 nginx 容器内部测试过连接性? curl phpmatest:80
    • 好的,我发现我的误解了。我想,nginx 必须针对暴露的端口,但是 phpmate:80 是正确的,因为它通过 dbnet 网络直接连接。感谢您的澄清和帮助!
    【解决方案2】:

    您的代码有两个问题:

    第一:-

    /var/dockervolumes/nginx:/etc/nginx 这不会让 nginx 在容器内启动,因为由于卷绑定,nginx 配置不会自动创建。

    尝试使用docker ps 命令进行验证。

    使用/var/dockervolumes/nginx:/etc/nginx/conf.d 有效

    我假设您会将 default.conf 文件放在 conf.d 文件夹中

    注意:如果将容器内的任何目录绑定到主机系统, 该目录未由容器初始化。

    第二:-

    proxy_pass http://localhost:9080/;
    

    您假设容器内的 localhost 与您的真实主机相同。

    使用proxy_pass http://phpmatest; 会起作用,因为您的服务名称是 phpmatest

    注意:如果您创建了一个客户 docker 网络,即 dbtest 在您的情况下。使用同一网络的所有服务都可以通过它们的名称直接访问,即在您的情况下为 phpmatest。

    以下作品:-

    docker-compose 文件

    version: '3'
    
    services:
            mariatest:
                    image: mysql
                    restart: always
                    networks:
                           - dbnet
                    environment:
                            MYSQL_ROOT_PASSWORD: password
                            MYSQL_DATABASE: test
                            MYSQL_USER: test
                            MYSQL_PASSWORD: test
    
            phpmatest:
                    depends_on:
                            - mariatest
                    image: phpmyadmin/phpmyadmin
                    restart: always
                    networks:
                            - dbnet
                    ports:
                            - "9080:80"
                    environment:
                            MYSQL_ROOT_PASSWORD: password
                            PMA_HOST: mariatest
    
            reverse:
                    image: nginx
                    networks:
                            - dbnet
                    ports:
                            - "8000:80"
                    volumes:
                            - /var/dockervolumes/nginx:/etc/nginx/conf.d
    
    networks:
         dbnet:
    

    default.conf

    server {
        listen       80;
        server_name  localhost;
    
        location / {
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $host;
            proxy_pass http://phpmatest;
        }
    
        #error_page  404              /404.html;
    
        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    

    【讨论】:

    • default.conf 工作正常。我在随机端口和 proxy_pass localhost:PORT 上运行 phpmyadmin;
    猜你喜欢
    • 2020-07-22
    • 2015-04-30
    • 2020-11-21
    • 2022-01-24
    • 2023-03-17
    • 2020-07-23
    • 2021-02-15
    • 2018-04-24
    • 2019-05-31
    相关资源
    最近更新 更多