Sud*_*hir 9 mongodb node.js typescript docker
我正在尝试将 mongodb 与 docker 容器中的应用程序连接。我正在使用 mongoose 包,这是我编写的代码
mongoose.connect("mongodb://mongo:27016/IssueTracker", { useNewUrlParser: true,useUnifiedTopology: true },(err: Error) => {
err ? console.log(err) : console.log("Mongodb database connected");
});
Run Code Online (Sandbox Code Playgroud)
这是我的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'
Run Code Online (Sandbox Code Playgroud)
这是我的Dockerfile
FROM node:13
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 9000
RUN ["npm","run","dev"]
Run Code Online (Sandbox Code Playgroud)
这是当我尝试docker-compose up在 docker cmdline 中运行时出现的错误
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)]: {}
}
Run Code Online (Sandbox Code Playgroud)
尝试检查 docker 中的任何容器是否正在使用提到的端口,这样可能会产生此错误,并且没有一个容器使用相同的端口。我是 docker 的新手,所以不太了解它,我尝试检查一些在线解决方案,但没有帮助
小智 9
尝试创建并使用网络而不是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
Run Code Online (Sandbox Code Playgroud)
一些值得使用的命令来了解正在发生的事情:
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 容器并为您提供了一个干净的状态(尽管可能会留下孤立卷,如果您想要一个带有新卷安装的全新映像,这可能会导致问题)。
另一个要检查的地方是容器本身中的应用程序/数据库的日志...登录到 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是否可以对mongo容器执行 ping 操作。您甚至可以使用您期望打开的端口telnet [mongo_ip] 27017访问容器。mongo这将证明两台主机可以通过网络进行通信。然后你就知道这不是网络问题而是应用程序问题。
| 归档时间: |
|
| 查看次数: |
11898 次 |
| 最近记录: |