如何使用Docker将ownCloud放在Nginx后面?

时间:2016-02-01 18:44:09

标签: nginx docker owncloud

我想通过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

我做错了什么?

1 个答案:

答案 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行。

希望有所帮助。