提问者:小点点

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


我正在尝试连接两个单独的容器:

  • nginx:最新
  • php:fpm

问题是php脚本不起作用。 可能php-fpm配置不正确。 这里是源代码,它在我的存储库中。 下面是文件docker-compose.yml:

nginx:
    build: .
    ports:
        - "80:80"
        - "443:443"
    volumes:
        - ./:/var/www/test/
    links:
        - fpm
fpm:
    image: php:fpm
    ports:
        - "9000:9000"

DockerFile,我用它来构建基于nginx One的自定义映像:

FROM nginx

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

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

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脚本吗?

附注。 我通过docker-composer运行容器,如下所示:

Docker-组合

从项目根目录。


共3个答案

匿名用户

不要在nginx config中硬编码容器的ip,docker link将链接的机器的主机名添加到容器的hosts文件中,您应该能够通过主机名ping通。

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

每当一个docker容器从一个映像中旋转出来(甚至停止/启动一个现有的容器),容器都会得到由docker主机分配的新IP。 这些IP与您的实际计算机不在同一子网中。

请参见链接文档的docker(这是compose在后台使用的)

但在docker-composedocs on links&; 曝光

链接

links:
 - db
 - db:database
 - redis

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

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

曝光

公开端口而不将其发布到主机--只有链接的服务才能访问它们。 只能指定内部端口。

如果您将项目设置为通过环境变量获取端口+其他凭据,则links会自动设置一系列系统变量:

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

名称_port

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

名称_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

匿名用户

我知道这是一篇很老的文章,但我也遇到过同样的问题,不明白为什么你的代码不能工作。 经过多次测试,我找到了原因。

Docker-compose.yml

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

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;
    }
}

DockerFile

FROM nginx:latest
COPY ./default.conf /etc/nginx/conf.d/

匿名用户

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

长话短说:创建一个容纳数据的容器,与一个卷共享数据,并在应用程序中使用volumes_from链接该卷。

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

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,它包含源代码:

FROM busybox

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

和nginx的dockerfile,它只是替换默认配置:

FROM nginx

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

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

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)。