提问者:小点点

如何配置Nginx和Docker以正确的方式运行Node和Mongo


我正在Node Mongo中构建一个项目,并使用Docker和Nginx在本地机器MacBook Pro-Catalina上运行。 我有几个问题我自己无法解决,我不知道如何配置Nginx和Docker以使所有工作正常。 在文章的末尾将显示我的Dockerfile,Docker compose和NGINX。

  1. 运行容器时,节点容器无法连接到Mongo DB,出现以下错误:在第一次连接时无法连接到服务器[127.0.0.1:27017],但通过作为指南针的GUI,我能够连接到相同的URL.
  2. 编辑我试图使用容器的名称,它的IP bu错误在第一次连接时连接到服务器[WETAXITASK_MongoDB:27017]失败[错误:connect Econn拒绝172.18.0.3:27017
  3. 下一个问题是,即使我正在将Python安装到我的容器上,我也会收到一个错误,错误如屏幕截图所示,因为我不知道如何描述:
  4. 当所有的endpoint都在运行时,无论我尝试点击什么endpoint,我的响应都是Nginx欢迎页面,所以很可能我确实弄错了conf本身

DockerFile:

# Developpment stage
FROM node:12.18-alpine AS base-builder
RUN apk update
RUN apk add --no-cache python make g++
RUN apk add --no-cache libc6-compat
WORKDIR /usr/src/app
COPY ["tsconfig.json", "package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
ADD . /usr/src/app
COPY ./.env /usr/src/app/.env
RUN npm cache clean --force
RUN npm install

# ------------------------------------------------------
# Production Build
# ------------------------------------------------------
FROM nginx:1.19.0-alpine
RUN apk add --no-cache --repository http://nl.alpinelinux.org/alpine/edge/main libuv \
    &&  apk add --update nodejs npm

WORKDIR /usr/src/app
RUN ls -l /usr/src/app/
COPY --from=0  /usr/src/app/ .
RUN rm /etc/nginx/conf.d/default.conf
RUN rm -rf /docker-entrypoint.d
COPY nginx/nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 3000
EXPOSE 80
#CMD ["nginx", "-g", "daemon off;","npm", "start"]
CMD nginx ; exec npm start

Docker写作:

version: '3.8'

services:
  wetaxitask:
    container_name: wetaxitask_api_dev
    image: wetaxitask
    restart: always
    build: .
    depends_on:
      - mongodb
      - redis
    env_file: .env
    ports:
      - 8080:80
    links:
      - redis
      - mongodb

  mongodb:
    container_name: wetaxitask_mongodb
    image: mongo:latest
    restart: always
    ports:
      - 27017:27017
    volumes:
      - ./data:/data/db
    environment:
      - MONGO_INITDB_DATABASE=wetaxitask

  redis:
    container_name: wetaxitask_redis
    image: redis:latest
    ports:
      - 6379:6379

Nginx:

server {

  listen 80;

  location / {
    root   /usr/share/nginx/html;
    index  index.html index.htm;
    try_files $uri $uri/ /index.html;
  }

  location /welcome {
    proxy_pass http://127.0.0.1:3000;

  }

  error_page   500 502 503 504  /50x.html;

  location = /50x.html {
    root   /usr/share/nginx/html;
  }
}

共1个答案

匿名用户

尝试将主机名从localhost(127.0.0.1)更改为mongodb(在docker-compose中定义的服务的名称)。 Docker dns magic会做剩下的。

编辑:将它们添加到docker组件中的一个公共网络中,容器应该能够在请求中以它们的名称作为主机名进行通信

version: '3.8'

services:
  wetaxitask:
    container_name: wetaxitask_api_dev
    image: wetaxitask
    restart: always
    build: .
    depends_on:
      - mongodb
      - redis
    env_file: .env
    ports:
      - 8080:80
    links:
      - redis
      - mongodb
    networks:
      - my-network

  mongodb:
    container_name: wetaxitask_mongodb
    image: mongo:latest
    restart: always
    ports:
      - 27017:27017
    volumes:
      - ./data:/data/db
    environment:
      - MONGO_INITDB_DATABASE=wetaxitask
    networks:
      - my-network

  redis:
    container_name: wetaxitask_redis
    image: redis:latest
    ports:
      - 6379:6379
    networks:
      - my-network

networks:
  my-network:
#this should define a network called my-network with default settings