我正在try 连接两个独立的容器:

问题是php脚本不起作用.也许php fpm配置不正确.

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

P.S.

docker-compose up

从项目根目录.

推荐答案

不要在nginx配置中硬编码容器的IP,docker link会将链接机的主机名添加到容器的hosts文件中,您应该可以通过主机名执行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

links

links:
 - db
 - db:database
 - redis

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

172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis

expose

expose 端口without publishing them to the host machine——它们只会是accessible to linked services.只能指定内部端口.

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

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

name_PORT

完整URL,例如DB_端口=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

expose 的端口号,例如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

Php相关问答推荐

Laravel变形 map 不适用于扩展模型

Laravel—通过单击处理多条路由

允许Laravel路由指定`withTrashed`,尽管有显式的模型绑定

无法使用DOMPDF在PDF中呈现非ANSI字符

Yahoo Finance API文件_GET_CONTENTS 429请求太多

如何删除WordPress用户的个人资料描述或其他个人资料字段中的链接?

MULTI UPDATE Laravel为什么只能更新我的第一行

Laravel POST方法返回状态:POST方法上不允许使用405方法

Laravel:测试命令时无法获取工作通知::AssertSentTo

莫德克斯.当我try 使用pThumb为手机压缩图像时,没有任何react

文件::Files()响应返回空对象数组

PHP访问子数组列表出错结果和长度

WooCommerce 有关新订单的附加邮箱通知,其中包含具体详细信息

在特征中使用类的属性

Laravel Eloquent:复杂的多对多关系以及缺失关系的默认值

php如何删除括号内的百分比值

在 Laravel、Vuejs 和 Inertia 中配置 TypeScript 的问题

PHP 中是否有 is_closure() 函数?

计算组合指数

Docker: unixodbc.h 没有这样的文件或目录.已安装 unixodbc-dev 时出现pecl install sqlsrv错误