使用Ansible在Docker中设置Nginx代理

时间:2015-12-12 05:19:15

标签: nginx proxy docker ansible ansible-playbook

我正在尝试设置一个nginx容器,该容器充当我已设置的另一个容器的代理。我想自动执行此设置,因为我需要跨多个服务器部署类似的设置。为此,我使用Ansible。

这是我的nginx.conf

events {
  worker_connections 1024;
}

http {
  server {
    listen 8080;
    location / {
      proxy_pass http://192.168.1.14:9000;
    }
  }
}

以下是我的Ansible YAML文件的相关部分:

- name: Install Nginx
      docker:
        name: nginx
        image: nginx
        detach: True
        ports:
            - 8080:8080
        volumes:
            - /etc/docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro

当我第一次运行我的剧本时,nginx正在运行但未绑定到8080,如下所示:

6a4f610e86d nginx "nginx -g 'daemon off" 35 minutes ago   Up Less than a second  80/tcp, 443/tcp nginx

但是,如果我直接使用:

运行nginx容器
docker run -d -v /etc/docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro -p 8080:8080 nginx

nginx和我的代理按预期运行,正在监听8080

c3a46421045c nginx "nginx -g 'daemon off" 2 seconds ago Up 1 seconds        80/tcp, 443/tcp, 0.0.0.0:8080->8080/tcp determined_swanson

知道为什么它以一种方式工作而不是另一种方式?

更新

根据所选答案中给出的指导,我更新了我的YAML文件:

- name: Install Nginx
  docker:
    name: nginx
    image: nginx
    detach: True
    ports:
        - 8080:8080
    expose:
        - 8080
    volumes:
        - /etc/docker/nginx/nginx.conf:/etc/nginx/nginx.conf:ro

1 个答案:

答案 0 :(得分:1)

首先,您需要确保您的nginx图像EXPOSE是端口8080,并且您可以直接在您的ansible yaml文件中指定:

expose
(added in 1.5)
  

要为端口映射或链接公开的其他容器端口列表。如果端口已在Dockerfile中使用EXPOSE公开,则不需要再次公开它。

然后,我在考虑Ansible docker module时看到的唯一区别是端口在双引号内:

ports:
    - "8080:9000"

此外,如果您想要prexypass到同一个docker守护程序中的另一个容器,您可能希望使用链接而不是固定的IP地址。

links:
    - "myredis:aliasedredis"

这样,你的nginx.conf包含一个固定的规则:

proxy_pass http://aliasedredis:9000;