如何通过单独的 nginx 容器在一个 Docker 容器中提供站点服务?

How to serve site in one Docker container through a separate nginx container?

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

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

我也正在生成一个 nginx 容器(尽管理想情况下我希望将来将其缩小到一个容器)。当我导航到 http://localhost:8080/ 时显示 "Welcome to nginx!" 消息。

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

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

我的原始示例是根据 docker 图像 php:7.1.8-apache 构建的并且服务非常好,但是它使用了与我的要求不同的 OS 以及 [=69 的错误版本=].

我尝试组合图像,希望图层能够解决我的问题,但后续图层覆盖了我原始图层的 OS。我不确定我是否可以更离散地累积图层。

所以现在我正在使用 OS 图像作为基础,然后应用 yum 命令安装 PHP。容器里面,OS和PHP两个版本完美,代码都在。

我觉得我快到了,但我就是找不到如何在我的浏览器中访问通用 Laravel 项目并在应用时测试代码更改。

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

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

docker 附件详细说明了在尝试加载 http://localhost:8080/ 时出现以下错误,而不是欢迎使用 nginx 屏幕: [错误] 6#6:*24 connect() 在连接到上游时失败(111:连接被拒绝),客户端:172.22.0.1,服务器:,请求:"GET / HTTP/1.1",上游:“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

Docker 文件

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 样板首页.

您可以使用 nginx 作为反向代理 link 它到其他容器并使用上游访问容器 所以更改应该是:

首先 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/