使用nginx设置Docker多容器。Nginx无法识别主机(上游未找到主机)
所以我正在学习Docker以及如何将应用程序封装到服务中。我不确定我是否一路都得到了 我有三项服务:使用nginx设置Docker多容器。Nginx无法识别主机(上游未找到主机),docker,nginx,Docker,Nginx,所以我正在学习Docker以及如何将应用程序封装到服务中。我不确定我是否一路都得到了 我有三项服务: web服务器nginx服务器,将端口80和443绑定到外部。基本上是应用程序的“前端” app1NodeJS应用程序,在端口3000上提供内容 app2NodeJS应用程序在端口3000上提供内容,基本上它是app1的克隆,我使用它只是为了学习 现在,我在prod中运行这个“应用程序”的想法是启动所有服务的docker compose up。这是启动多容器应用程序的正确方法吗 我的回购结构如下:
web服务器
nginx服务器,将端口80和443绑定到外部。基本上是应用程序的“前端”app1
NodeJS应用程序,在端口3000上提供内容app2
NodeJS应用程序在端口3000上提供内容,基本上它是app1
的克隆,我使用它只是为了学习docker compose up
。这是启动多容器应用程序的正确方法吗
我的回购结构如下:
.
├── Dockerfile
├── app1
│ ├── Dockerfile
│ ├── index.js
│ ├── package-lock.json
│ └── package.json
├── app2
│ ├── Dockerfile
│ ├── index.js
│ ├── package-lock.json
│ └── package.json
├── docker-compose.yml
├── index.html
└── web-server.conf
根Dockerfile
用于web服务器
服务。我的docker compose.yml
如下所示:
version: '3'
services:
web-server:
container_name: web-server
build: .
ports:
- "80:80"
- "443:443"
depends_on:
- app1
- app2
app1:
container_name: app1
build: ./app1
restart: always
app2:
container_name: app2
build: ./app2
restart: always
命令docker compose up
生成app1
和app2
图像,但在web服务器上失败,因为nginx
抛出错误:
host not found in upstream "app1" in /etc/nginx/conf.d/default.conf:11
nginx: [emerg] host not found in upstream "app1" in /etc/nginx/conf.d/default.conf:11
web服务器
serviceDockerfile
FROM nginx:alpine
EXPOSE 80
COPY ./web-server.conf /etc/nginx/conf.d/default.conf
COPY ./index.html /var/www/html/
RUN apk add bash
RUN nginx
webserver.conf的内容
:
server {
listen *:80;
server_name web_server;
root /var/www/html;
location / {
index index.html;
}
location /app1 {
proxy_pass http://app1:3000;
proxy_redirect off;
}
location /app2 {
proxy_pass http://app2:3000;
proxy_redirect off;
}
}
在我看来,nginx的配置似乎无法识别http://app1
生成时的主机名。我尝试进行实验,并用localhost
替换了proxy\u pass
指令的值。这将建立我可以与其他图像一起运行的图像。如果我做了bundle exec-it web服务器image/bin/bash
并尝试curlhttp://app1:3000
然后它就可以工作了。如果我编辑nginx
config以指向这些URL,它就会开始工作
因此,我想我已经做到了,但在运行docker compose up
时,它似乎无法识别主机名
有什么想法吗?我的方法正确吗?如果只删除web服务器Dockerfile
末尾的两行RUN
,这将正常工作
如果你看这张图片的结尾是
CMD ["nginx", "-g", "daemon off;"]
这将被你的形象所继承;当容器启动时,无需执行任何特殊操作即可启动nginx
同时,在Dockerfile运行时,构建序列在一个相当隔离的环境中运行:没有设置任何Compose network环境,其他容器不一定在运行,卷也没有连接,等。唯一生效的自定义设置是docker compose.yml
文件中块中特定的内容
因此:当Dockerfile运行运行nginx
时,它会尝试在构建环境中启动nginx,但该环境未连接到Compose网络,因此失败。但是您根本不需要这样做,因为基本图像已经有了CMD nginx…
设置,只需删除该行就可以修复它。真的!该死的服务我很好,我应该阅读更多关于托管docker图像下一次(或只是建立我自己的)。很好,非常感谢。我在这上面浪费了几个小时。