我正在尝试在docker容器中将mongodb与我的应用程序连接。我正在使用猫鼬包,这是我写的代码
mongoose.connect("mongodb://mongo:27016/IssueTracker", { useNewUrlParser: true,useUnifiedTopology: true },(err: Error) => {
err ? console.log(err) : console.log("Mongodb database connected");
});
这是我的docker-compose.yml
文件
version: "3"
services:
app:
container_name: IssueTracker
restart: always
build: .
ports:
- '9000:9000'
links:
- mongo
mongo:
container_name: mongo
image: mongo
ports:
- '27017:27016'
这是我的Dockerfile
FROM node:13
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 9000
RUN ["npm","run","dev"]
这是我在docker cmdline中尝试运行docker-compose up
时遇到的错误
server started on port 9000
MongooseError [MongooseServerSelectionError]: getaddrinfo ENOTFOUND mongo
at new MongooseServerSelectionError (/app/node_modules/mongoose/lib/error/serverSelection.js:22:11)
at NativeConnection.Connection.openUri (/app/node_modules/mongoose/lib/connection.js:823:32)
at Mongoose.connect (/app/node_modules/mongoose/lib/index.js:333:15)
at Object.<anonymous> (/app/src/app.ts:9:10)
at Module._compile (internal/modules/cjs/loader.js:1123:30)
at Module.m._compile (/app/node_modules/ts-node/src/index.ts:839:23)
at Module._extensions..js (internal/modules/cjs/loader.js:1143:10)
at Object.require.extensions.<computed> [as .ts] (/app/node_modules/ts-node/src/index.ts:842:12)
at Module.load (internal/modules/cjs/loader.js:972:32)
at Function.Module._load (internal/modules/cjs/loader.js:872:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at main (/app/node_modules/ts-node/src/bin.ts:227:14)
at Object.<anonymous> (/app/node_modules/ts-node/src/bin.ts:513:3)
at Module._compile (internal/modules/cjs/loader.js:1123:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1143:10)
at Module.load (internal/modules/cjs/loader.js:972:32) {
reason: TopologyDescription {
type: 'Single',
setName: null,
maxSetVersion: null,
maxElectionId: null,
servers: Map(1) { 'mongo:27016' => [ServerDescription] },
stale: false,
compatible: true,
compatibilityError: null,
logicalSessionTimeoutMinutes: null,
heartbeatFrequencyMS: 10000,
localThresholdMS: 15,
commonWireVersion: null
},
[Symbol(mongoErrorContextSymbol)]: {}
}
试图检查我的Docker容器中是否有任何容器正在使用上述端口,因此可能会产生此错误,并且没有一个容器在使用同一端口。我是Docker的新手,所以对其了解不多,所以我尝试检查一些在线解决方案,但没有帮助
答案 0 :(得分:2)
尝试创建和使用网络而不是link
version: "3"
services:
app:
container_name: IssueTracker
restart: always
build: .
ports:
- '9000:9000'
networks: #here
- my-network
mongo:
container_name: mongo
image: mongo
ports:
- '27017:27016'
networks: #here
- my-network
networks: #here
my-network:
driver: bridge
答案 1 :(得分:1)
一些值得用来了解发生了什么的命令:
docker ps -a
-列出所有容器及其状态
docker ps -aq
-仅列出容器ID。
docker container list --all
-与docker ps -a
docker container inspect [container_id]
-输出与容器有关的一堆信息-在底部,您会找到网络信息(IP地址,端口映射)。这是我遇到问题时要去的地方。
通常我会发现一个旧的容器阻塞了我想使用的端口...
docker rm -f $(docekr ps -aq)
-强制删除所有容器。这样可以有效地清理docker容器并为您提供一个干净的状态(尽管您可能会留下孤立的卷,但是如果您想要一个全新的映像并使用新的卷安装,则可能会导致问题)。
另一个要检查的地方是容器本身中的application / db的日志... 登录到Docker容器并获取命令终端:
docker exec -it [container_id] bash
-或sh
代替bash(如果支持,则为首选终端选择)。这里的最后一个参数是在容器上执行的命令。您可以只写ls -al
。注意:容器必须处于运行状态才能正常工作。
还应注意mongo
容器的暴露端口是27016,而不是连接中列出的端口:mongodb://mongo:27016
-27016是内部(容器内部)暴露的端口。 27017是裸端口,您应该将其用于来自其他容器/外部位置的连接。如果节点应用程序正在容器中运行,则可能会有些运气,但这与最佳实践背道而驰。每个容器一个应用。
我记住端口映射顺序的方法是src(localhost):destination(container)
-这对于大多数Unix命令都是相同的:cp,scp,mv等,即我们编写了mv/scp/cp src_file dest_dir
,因此更容易知道哪个如果遵循此经验法则,应该连接的端口。
您还需要从node
容器(docker exec -it [node_container_id] bash
)中检查是否可以ping mongo
容器。您甚至可以使用您希望打开的端口来telnet [mongo_ip] 27017
到mongo
容器。这将证明两个主机可以通过网络进行通信。然后您知道它不是网络问题,而是应用程序问题。