我正在Node Mongo中构建一个项目,并使用Docker和Nginx在本地机器MacBook Pro-Catalina上运行。 我有几个问题我自己无法解决,我不知道如何配置Nginx和Docker以使所有工作正常。 在文章的末尾将显示我的Dockerfile,Docker compose和NGINX。
在第一次连接时无法连接到服务器[127.0.0.1:27017]
,但通过作为指南针的GUI,我能够连接到相同的URL.在第一次连接时连接到服务器[WETAXITASK_MongoDB:27017]失败[错误:connect Econn拒绝172.18.0.3:27017
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;
}
}
尝试将主机名从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