我正在尝试连接两个单独的容器:
问题是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-组合
从项目根目录。
不要在nginx config中硬编码容器的ip,docker link将链接的机器的主机名添加到容器的hosts文件中,您应该能够通过主机名ping通。
编辑:Docker 1.9网络不再要求您链接容器,当多个容器连接到同一网络时,它们的主机文件将被更新,以便它们可以通过主机名相互联系。
每当一个docker容器从一个映像中旋转出来(甚至停止/启动一个现有的容器),容器都会得到由docker主机分配的新IP。 这些IP与您的实际计算机不在同一子网中。
请参见链接文档的docker(这是compose在后台使用的)
但在docker-compose
docs 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
发布的卷链接到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
)。