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

时间:2019-10-08 16:52:16

标签: php docker nginx docker-compose centos7

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

我已成功部署了具有相应OS和PHP版本的容器,该容器包含一个当前包含样板Laravel项目的卷。它可以正确提取代码,以反映对外部代码库所做的更改。

我也正在生成一个nginx容器(尽管理想情况下,我希望将来将其简化为一个容器)。这表示“欢迎使用nginx!”导航到http://localhost:8080/时出现提示信息。

但是,我对nginx的了解绝对很少,不足以在其他容器中为Laravel项目提供服务。它可能可用,我只是不知道正确的路由,但我认为已经排除了这一点。

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

我最初的示例是基于docker映像php:7.1.8-apache构建的,并且提供了精美的服务,但是它使用了与我的要求不同的操作系统以及错误的PHP版本。

我尝试合并图像,希望这些层可以解决我的问题,但是随后的层覆盖了我原始层的操作系统。我不确定是否可以离散地增加图层。

所以现在我要以OS映像为基础,然后应用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()失败(111:连接被拒绝),客户端:172.22.0.1,服务器:,请求:“ GET / HTTP / 1.1”,上游:“ {{3} }”,主机:“ 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样板首页。

1 个答案:

答案 0 :(得分:0)

您可以使用nginx作为反向代理将其链接到其他容器,并使用上游访问该容器 因此更改应为:

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