我想通过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
我究竟做错了什么?
最佳答案
问题是在nginx容器内,127.0.0.1:6789
不会映射到owncloud。这是因为, docker 仅在主机上的owncloud端口80
上映射端口6789
。
想象一下,每个容器以及Docker主机都是一台完全独立的机器。在这种情况下,nginx机器向127.0.0.1
发送一个请求,该请求本身就是自身,而不是主机,而不是owncloud机器。
在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
行。希望能有所帮助。
关于nginx - 如何使用Docker将ownCloud置于Nginx之后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35137944/