我想通过Nginx访问ownCloud实例,这些实例都设置在单独的Docker容器中。所以我做了docker-compose.yml
:
nginx:
image: nginx
ports:
- 80:80
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
links:
- owncloud
owncloud:
image: owncloud
ports:
- 6789:80
volumes:
- ~/ownCloud:/var/www/html/data
并nginx.conf
使用以下内容代理请求:
http {
server {
listen 80 default;
server_name docker.dev;
location / {
proxy_pass http://127.0.0.1:6789;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
events {}
似乎对我而言,但Nginx注销了这样的消息:
[error] 6#6: *8 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.99.1, server: docker.dev
我做错了什么?
答案 0 :(得分:2)
问题是在nginx容器内,127.0.0.1:6789
不会映射到owncloud。这是因为,docker仅映射主机上owncloud端口80
上的端口6789
。
想象一下,每个容器以及docker主机都是一个完全独立的机器。在这种情况下,nginx机器向127.0.0.1
发送请求,该请求本身就是主机,而不是自己的云机器。
有很多方法可以在docker容器之间进行通信,并且您已经在使用其中一个,docker compose内置于linking system。
在您的docker-compose.yml
中,您已将owncloud与nginx相关联,这是正确的。这样做是编辑nginx容器/etc/hosts
文件以映射owncloud
owncloud容器的IP地址。 (您可以通过运行docker exec name_of_nginx_container cat /etc/hosts
来查看它。这意味着,在nginx容器http://owncloud
内部映射到owncloud容器上的端口80
。
考虑到这一点,这是一个完整的配置,适用于docker compose的链接系统。
docker-compose.yml
nginx:
image: nginx
ports:
- 80:80
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
links:
- owncloud
owncloud:
image: owncloud
expose:
- 80
volumes:
- ~/ownCloud:/var/www/html/data
nginx.conf
http {
server {
listen 80 default;
server_name docker.dev;
location / {
proxy_pass http://owncloud;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
events {}
唯一的区别是您只需要在owncloud图像上公开端口80
,而不是将其映射到主机和proxy_pass
中的nginx.conf
行。
希望有所帮助。