我创建了两个运行两个不同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
我做错了什么,并且是解决问题的最佳方法?
答案 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
配置中提供端口。