首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何正确链接php-fpm和Nginx Docker容器?

如何正确链接php-fpm和Nginx Docker容器?
EN

Stack Overflow用户
提问于 2015-04-28 05:08:34
回答 7查看 196.5K关注 0票数 118

我正在尝试链接两个独立的容器:

问题是php脚本不起作用。也许php-fpm配置不正确。这是源代码,它在我的repository中。这是文件docker-compose.yml

代码语言:javascript
复制
nginx:
    build: .
    ports:
        - "80:80"
        - "443:443"
    volumes:
        - ./:/var/www/test/
    links:
        - fpm
fpm:
    image: php:fpm
    ports:
        - "9000:9000"

Dockerfile,我用它来构建一个基于nginx镜像的自定义镜像:

代码语言:javascript
复制
FROM nginx

# Change Nginx config here...
RUN rm /etc/nginx/conf.d/default.conf
ADD ./default.conf /etc/nginx/conf.d/

最后,下面是我的自定义Nginx虚拟主机配置:

代码语言:javascript
复制
server {
    listen  80;

    server_name localhost;
    root /var/www/test;

    error_log /var/log/nginx/localhost.error.log;
    access_log /var/log/nginx/localhost.access.log;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/.+\.php(/|$) {
        fastcgi_pass 192.168.59.103:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
}

有人能帮我正确配置这些容器来执行php脚本吗?

P.S.我通过docker-composer运行容器,如下所示:

docker-compose up

从项目根目录。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-04-29 14:44:08

不要在nginx配置中硬编码容器的ip,docker link会将链接机器的主机名添加到容器的主机文件中,您应该可以通过主机名来ping。

编辑: Docker 1.9网络不再需要您链接容器,当多个容器连接到同一网络时,它们的主机文件将被更新,以便它们可以通过主机名相互访问。

每当docker容器从镜像旋转(甚至停止/启动现有容器)时,容器都会获得docker主机分配的新ip。这些ip地址与您的实际机器不在同一子网中。

see docker linking docs (这是compose在后台使用的)

but more clearly explained in the docker-compose docs on links & expose

链接

链接:- db - db:database - redis

将在此服务的容器内的/etc/hosts中创建一个具有别名名称的条目,例如:

172.17.2.186 db 172.17.2.186数据库172.17.2.187 redis

expose

在不将端口发布到主机的情况下公开端口-只有链接服务才能通过访问这些端口。只能指定内部端口。

如果您将项目设置为通过环境变量获取端口+其他凭据,则links automatically set a bunch of system variables

要查看服务可用的环境变量,请运行docker-compose run SERVICE env

name_PORT

完整URL,例如DB_PORT=tcp://172.17.0.5:5432

name_PORT_num_protocol

完整URL,例如DB_PORT_5432_TCP=tcp://172.17.0.5:5432

name_PORT_num_protocol_ADDR

容器的IP地址,如DB_PORT_5432_TCP_ADDR=172.17.0.5

name_PORT_num_protocol_PORT

暴露的端口号,例如DB_PORT_5432_TCP_PORT=5432

name_PORT_num_protocol_PROTO

协议(tcp或udp),例如DB_PORT_5432_TCP_PROTO=tcp

name_NAME

完全限定的容器名称,例如DB_1_NAME=/myapp_web_1/myapp_db_1

票数 37
EN

Stack Overflow用户

发布于 2015-10-08 02:35:22

我知道这是一个古老的帖子,但我也有同样的问题,我不能理解为什么你的代码不能工作。经过多次测试,我发现了其中的原因。

似乎fpm从nginx接收完整路径并尝试在fpm容器中查找文件,因此它必须与nginx配置中的server.root完全相同,即使它不存在于nginx容器中。

要演示,请执行以下操作:

docker-compose.yml

代码语言:javascript
复制
nginx:
    build: .
    ports:
        - "80:80"
    links:
        - fpm
fpm:
    image: php:fpm
    ports:
        - ":9000"

    # seems like fpm receives the full path from nginx
    # and tries to find the files in this dock, so it must
    # be the same as nginx.root
    volumes:
        - ./:/complex/path/to/files/

/etc/nginx/conf.d/default.conf

代码语言:javascript
复制
server {
    listen  80;

    # this path MUST be exactly as docker-compose.fpm.volumes,
    # even if it doesn't exist in this dock.
    root /complex/path/to/files;

    location / {
        try_files $uri /index.php$is_args$args;
    }

    location ~ ^/.+\.php(/|$) {
        fastcgi_pass fpm:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

文档文件

代码语言:javascript
复制
FROM nginx:latest
COPY ./default.conf /etc/nginx/conf.d/
票数 112
EN

Stack Overflow用户

发布于 2016-03-24 04:14:19

正如前面指出的,问题是文件在fpm容器中不可见。但是,为了在容器之间共享数据,推荐的模式是使用纯数据容器(如this article中所述)。

长话短说:创建一个仅保存数据的容器,将其与卷共享,并在应用程序中使用volumes_from链接此卷。

使用compose (在我的机器中为1.6.2),docker-compose.yml文件将为:

代码语言:javascript
复制
version: "2"
services:
  nginx:
    build:
      context: .
      dockerfile: nginx/Dockerfile
    ports:
      - "80:80"
    links:
      - fpm
    volumes_from:
      - data
  fpm:
    image: php:fpm
    volumes_from:
      - data
  data:
    build:
      context: .
      dockerfile: data/Dockerfile
    volumes:
      - /var/www/html

请注意,data发布了一个链接到nginxfpm服务的卷。然后是数据服务的Dockerfile,它包含您的源代码:

代码语言:javascript
复制
FROM busybox

# content
ADD path/to/source /var/www/html

以及nginx的Dockerfile,它只是替换了默认配置:

代码语言:javascript
复制
FROM nginx

# config
ADD config/default.conf /etc/nginx/conf.d

为了完整起见,下面是示例运行所需的配置文件:

代码语言:javascript
复制
server {
    listen 0.0.0.0:80;

    root /var/www/html;

    location / {
        index index.php index.html;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
    }
}

这只是告诉nginx使用共享卷作为文档根目录,并为nginx设置正确的配置,以便能够与fpm容器通信(即:正确的HOST:PORT,由于compose定义的主机名,它是fpm:9000 )和SCRIPT_FILENAME

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29905953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档