Docker-compose 文件看起来像这样
version: '3.8'
services:
mongo:
image: mongo
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: root
ports:
- "2617:2716"
web:
build:
context: .
ports:
- "8080:8080"
environment:
NODE_ENV: production
depends_on:
- mongo
.env 文件看起来像这样
BASE_URL=http://localhost:8080
MONGO_INITDB_ROOT_USERNAME=root
MONGO_INITDB_ROOT_PASSWORD=root
DB_HOST=mongo
DB_PORT=2617
DB_NAME=ptcgp
我通过这个字符串连接:
const mongoURI = 'mongodb://' + process.env.MONGO_INITDB_ROOT_USERNAME + ':'
+ process.env.MONGO_INITDB_ROOT_PASSWORD + '@'
+ process.env.DB_HOST + ':'
+ process.env.DB_PORT + '/'
+ process.env.DB_NAME + '?retryWrites=true&writeConcern=majority&authSource=admin';
mongoose.connect(mongoURI);
mongoURI
看起来像这样:mongodb://root:root@mongo:2617/ptcgp?retryWrites=true&writeConcern=majority&authSource=admin
这对我来说看起来是正确的......
它返回以下错误:
MongoServerSelectionError: connect ECONNREFUSED 172.20.0.2:2617
和MongoDB connection error. Please make sure MongoDB is running.
,但 MongoDB 容器正在运行。
我正在对 Docker 中运行的另一个项目执行同样的操作,端口设置为 2717:27017(因此是此部署中端口的选择)并且它正在工作。
Mongo 默认监听 27017 端口。
当容器在 docker 桥接网络上相互通信时,它们不使用映射的端口。映射的端口用于与桥接网络外部的容器进行通信。因此,如果您只需要与其他容器通信,则无需映射端口。
由于每个容器都有自己的IP地址,因此容器可以毫无问题地使用相同的端口号。但是当您将它们映射到主机端口时,您需要确保映射的端口号不会冲突。
因此,要将 Mongo 端口映射到主机端口 2617,您应该这样做
ports:
- "2617:27017"
但是由于端口 2617 仅用于从 Docker 网络外部访问 Mongo,因此您应该从 Web 应用程序使用端口 27017。