如何使用 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行。

希望对您有所帮助。