如何使用 Docker 将 ownCloud 置于 Nginx 之后?
How to put ownCloud behind Nginx with Docker?
我想通过 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 端口 6789
上映射端口 80
。
想象每个容器以及 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
,而不是将它映射到主机和nginx.conf
中的proxy_pass
行。
希望对您有所帮助。
我想通过 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 端口 6789
上映射端口 80
。
想象每个容器以及 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
,而不是将它映射到主机和nginx.conf
中的proxy_pass
行。
希望对您有所帮助。