【问题标题】:How to serve site in one Docker container through a separate nginx container?如何通过单独的 nginx 容器在一个 Docker 容器中服务站点?
【发布时间】:2019-10-08 16:52:16
【问题描述】:

我正在尝试创建一个易于部署的 docker 容器(或一组容器),它允许我和其他开发人员使用与我们的服务器环境相匹配的环境进行本地编码。

我已经成功部署了一个具有适当操作系统和 PHP 版本的容器,其中包含一个当前包含样板 Laravel 项目的卷。它正确地拉入代码,反映对外部代码库所做的更改。

我还生成了一个 nginx 容器(尽管理想情况下我希望将来将其简化为一个容器)。这呈现了“欢迎使用 nginx!”当我导航到http://localhost:8080/ 时的消息。

然而,我对 nginx 的了解非常少,不足以在我的另一个容器中为 Laravel 项目提供服务。它可能是可用的,我只是不知道正确的路由,但我想我已经排除了这一点。

我以前不需要问很多问题,因为我几乎总是能够通过资源来确定答案,但这对我来说是一个新的责任领域,如果问题是明显的或基本的,请见谅.

我的原始示例是基于 docker 映像 php:7.1.8-apache 构建的,并且服务非常好,但是它使用了不同的操作系统来满足我的要求以及错误的 PHP 版本。

我尝试合并图像,希望图层能够解决我的问题,但随后的图层覆盖了我原来图层的操作系统。我不确定是否可以更离散地累积图层。

所以现在我使用操作系统映像作为基础,然后应用 yum 命令来安装 PHP。容器内部,OS和PHP版本完美,代码存在。

我觉得我快到了,但我只是不知道如何在我的浏览器中访问通用 Laravel 项目并在应用代码更改时对其进行测试。

更新 我已经更新了文件以匹配下面的答案,并修复了我注意到的问题; default.conf 文件被复制到主 docker 中,而不是 nginx 中。将此修复与下面的答案结合起来,当我导航到 http://localhost:8080/ 时,我现在收到 502 Bad Gateway 错误。

Laravel 的 index.php 位于 \public 中,我尝试更新 default.conf 中的索引引用以匹配它,但没有运气。

当尝试加载 http://localhost:8080/ 时,docker 附件详细说明了以下错误,而不是欢迎来到 nginx 屏幕: [错误] 6#6: *24 connect() failed (111: Connection refused) while connect to upstream, client: 172.22.0.1, server: , request: "GET / HTTP/1.1", upstream: "http://172.22.0.2:80/" , 主机: "localhost:8080"

在访问地址时,access.log 和 error.log 都没有记录任何详细信息。

docker-composer.yml

version: '3'
services:
  app:
    build:
      context: .
      dockerfile: .docker/primary/Dockerfile
    image: base-docker
    container_name: primarydocker
    #    ports:
    #      - 8080:80
    volumes:
      - .:/srv/jumbledown
    restart: unless-stopped
    tty: true
    networks:
      - draft-network
  webserver:
    build:
      context: .
      dockerfile: .docker/nginx/Dockerfile
    container_name: webserver
    ports:
      - "8080:80"
      - "443:443"
    links:
      - app
    networks:
      - draft-network
    restart: unless-stopped
    tty: true

#Docker Networks
networks:
  draft-network:
    driver: bridge

Dockerfile

FROM centos:7

RUN yum -y install epel-release yum-utils \
    && yum -y install http://rpms.remirepo.net/enterprise/remi-release-7.rpm \
    && yum-config-manager --enable remi-php71 \
    && yum -y install php php-common php-opcache php-mcrypt php-cli php-gd php-curl php-mysql
#    && chown -R www-data:www-data /srv/jumbledown

COPY . /srv/jumbledown

#    RUN docker-php-ext-install mbstring pdo pdo_mysql \
#    && chown -R www-data:www-data /srv/jumbledown

用于 nginx 的 Dockerfile

FROM nginx:1.12

# ADD ./.docker/site.conf /etc/nginx/conf.d/
ADD ./.docker/nginx/default.conf /etc/nginx/conf.d/

default.conf

upstream appUpstream {
    server app;
}

server {
    listen      80;

    index index.php

    server_name jumbledown.com www.jumbledown.com;

    client_max_body_size 30M;

    location / {
        proxy_pass        http://appUpstream/;
        proxy_redirect                  off;
        proxy_buffering                 off;
        proxy_request_buffering         off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

理想情况下,我希望能够运行docker-compose up --build,然后在我的浏览器中输入一个 URL,然后看到 Laravel 样板首页弹出。

【问题讨论】:

    标签: php docker nginx docker-compose centos7


    【解决方案1】:

    您可以使用 nginx 作为反向代理将其链接到其他容器并使用 Upstream 访问容器 所以更改应该是:

    首先是 docker-compose :

       .
       .
       .
      webserver:
        image: nginx:1.12
        container_name: webserver
        links:
          - app    
        ports:
          - "80:80"
          - "443:443"
        networks:
          - draft-network
        volumes: # mount custom config at runtime
          - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
        restart: unless-stopped
        tty: true
    

    default.conf 应该是:

    upstream appUpstream {
       server app;
    }
    
    
    server {
        listen      80;
        server_name exemple.com;
        client_max_body_size 30M;
         location / {
          proxy_pass        http://appUpstream/;
          proxy_redirect                  off;
          proxy_buffering                 off;
          proxy_request_buffering         off;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection "upgrade";
        }
    

    这里有一个可以帮助你的参考: https://docs.nginx.com/nginx/admin-guide/web-server/reverse-proxy/

    【讨论】:

    • 您好,感谢您的回答和文档。我正在解决它,但它很重!我已经更新了上面的问题,因为我已经取得了一些进展。
    • 构建一个镜像 docker 只是为了挂载默认的 conf 是不好的,你应该在镜像启动时挂载卷,我编辑答案,这样你就可以看到如何挂载文件
    • 谢谢。有很多选择可以解决!
    • 谢谢你,是的,你可以使用很多选项,继续努力:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多