我正在尝试链接两个独立的容器:
问题是php脚本不起作用。也许php-fpm配置不正确。这是源代码,它在我的repository中。这是文件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镜像的自定义镜像:
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-composer运行容器,如下所示:
docker-compose up
从项目根目录。
发布于 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
发布于 2015-10-08 02:35:22
我知道这是一个古老的帖子,但我也有同样的问题,我不能理解为什么你的代码不能工作。经过多次测试,我发现了其中的原因。
似乎fpm从nginx接收完整路径并尝试在fpm容器中查找文件,因此它必须与nginx配置中的server.root
完全相同,即使它不存在于nginx容器中。
要演示,请执行以下操作:
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;
}
}
文档文件
FROM nginx:latest
COPY ./default.conf /etc/nginx/conf.d/
发布于 2016-03-24 04:14:19
正如前面指出的,问题是文件在fpm容器中不可见。但是,为了在容器之间共享数据,推荐的模式是使用纯数据容器(如this article中所述)。
长话短说:创建一个仅保存数据的容器,将其与卷共享,并在应用程序中使用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
发布了一个链接到nginx
和fpm
服务的卷。然后是数据服务的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
。
https://stackoverflow.com/questions/29905953
复制相似问题