无法将 Nginx 端口 80 与 docker 容器端口 80 映射

时间:2021-03-01 14:54:38

标签: docker nginx docker-compose

我正在运行一个在端口 4242 上运行的 NodeJS 应用程序,这里是 dockefile、docker-compose 和 nginx conf 看起来像这样

Dockerfile

FROM node:12-alpine
COPY package.json package-lock.json ./
RUN npm ci
COPY . .
EXPOSE 4242
CMD node index.js.

Docker Compose

services:
   web:
      build: .
   ports:
      - "80:4242"
   environment:
   DATABASE_URL: <DB_URL>
   depends_on:
      - db
command: >
    npm run start"

NGINX

server {
listen 80;
server_name server_name;

location / {
        try_files $uri $uri/ =404;
        auth_basic "Restricted Content";
        auth_basic_user_file /etc/nginx/.htpasswd;
        proxy_pass http://localhost:80;
}
}

我想通过 Nginx 端口 80 以及端口 80 上的基本身份验证访问此应用程序,但我无法正确映射端口。

编辑:我总是收到端口已在使用错误,因为默认情况下 Nginx 正在侦听端口 80 而在 docker-compose 中,我将 80 与 Dockerfile 公开的 4242 进行映射

提前致谢

1 个答案:

答案 0 :(得分:0)

您不能在端口 80 上同时拥有 nginx 和 docker 容器。

他们必须侦听不同的端口以避免“端口已被使用错误”。

您可以将容器端口 4242 映射到主机端口 4242:在 docker-compose 文件中将 - "80:4242" 替换为 - "4242:4242"

docker-compose restart web重启你的容器,你可以用docker-compose ps检查你的容器是否正在运行(你会同时看到映射的端口)

然后,您必须相应地更改 nginx conf:

server {
  listen         80;
  server_name    your_server_name;

  location / {
    auth_basic "Restricted Content";
    auth_basic_user_file /etc/nginx/.htpasswd;
    proxy_pass http://localhost:4242;
  }
}

注意事项:

  • 我删除了 try_files,因为它绕过了 proxy_pass 指令。如果您尝试使用 try_files 实现其他目的,请提供上下文。
  • your_server_name 替换为您的真实服务器名称。
  • 重新加载nginx

最后你有:

  1. nginx(直接在主机上)监听 80 端口,
  2. location 具有基本身份验证的块,
  3. 将流量转发到主机端口 4242,
  4. 使用 proxy_pass 映射到 docker 容器端口 4242,
  5. 终于可以使用您的 NodeJS 应用了。