Nginx代理,链接到其他docker容器

时间:2016-12-29 17:34:46

标签: nginx docker build proxy

我创建了两个运行两个不同Web应用程序的容器。我正在尝试创建第三个容器,让nginx代理根据主机名将请求重定向到正确的容器。当我运行nginx官方映像时,我的Nginx配置看起来正确,并在容器内手动修改默认配置文件和代理设置。

我的两个Web应用程序容器已在运行,我按如下方式启动代理容器:

docker run -i -t --link webapp1 --link webapp2 -p 80:80 nginx /bin/bash

为了做到我认为最干净的方式,我创建一个Dockerfile来创建容器,并在构建容器时将本地default.conf文件传递给容器。

这是我的nginx代理配置文件:

server {
    listen       80;
    server_name  www.webapp1.ch;

    location / {
        proxy_pass   http://webapp1/;
    }
}

server {
    listen       80;
    server_name  www.webapp2.ch;

    location / {
        proxy_pass   http://webapp2/;
    }
}

代理Docker文件:

# Set the base image to use to Ubuntu
FROM nginx:latest

# Set the file maintainer (your name - the file's author)
MAINTAINER Me


# Update the default application repository sources list
RUN apt-get update && apt-get install -y \
        wget \
        vim

RUN rm /etc/nginx/conf.d/default.conf
COPY default /etc/nginx/conf.d/default.conf
CMD /etc/init.d/nginx restart

但不幸的是,当我尝试构建它时,容器还不知道webapp1和webapp2容器地址/ ip,因为它们尚未链接。我收到此错误:

Step 7 : RUN /etc/init.d/nginx restart
 ---> Running in aef974e80e74
Restarting nginx: nginx2016/12/29 17:07:17 [emerg] 11#11: host not found in upstream "webapp1" in /etc/nginx/conf.d/default.conf:6
nginx: [emerg] host not found in upstream "webapp1" in /etc/nginx/conf.d/default.conf:6
nginx: configuration file /etc/nginx/nginx.conf test failed

我做错了什么,并且是解决问题的最佳方法?

1 个答案:

答案 0 :(得分:0)

使用链接是legacy功能,您应该使用User defined networks

sudo docker network create mynetwork
docker run -d --network mynetwork -p 80:80 -v /path/to/nginx/config/default.conf:/etc/nginx/conf.d/default.conf nginx 

然后我在user defined network命令中使用了我最近创建的docker run

我在那里做的另一件事是mounted nginx config而不是为它构建新图像。

其中一个优点是基于同一用户定义网络中的容器名称自动dns

现在回到nginx问题:

proxy_pass   http://webapp2:port/;

我猜你在同一个docker主机上运行了所有3个容器,它们都无法在port 80上运行,所以你应该在nginx reverse proxy配置中提供端口。