【发布时间】:2020-03-20 19:11:29
【问题描述】:
https://docs.docker.com/compose/networking/
在上面的官方docker文档中,我找到了部分
version: "3"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgres
ports:
- "8001:5432"
现在每个容器都可以查找主机名 web 或 db 并取回相应容器的 IP 地址。例如,web 的应用程序代码可以连接到 URL postgres://db:5432 并开始使用 Postgres 数据库。
所以我理解了这一段,我可以在没有links: 或networks: 的情况下将 docker 容器相互连接。因为上面的docker-compose.yml sn-p 没有links 或networks: 部分。并且文档说 web 的应用程序代码可以连接到 URL postgres://db:5432
所以我尝试使用上述方式与 nodejs express、mongodb 一起测试简单的 docker-compose。我以为我可以在 express 应用程序中连接 mongodb 与 mongodb://mongo:27017/myapp 但我无法在 express 容器中连接 mongodb。我想我遵循了 docker 的官方手册,但我不知道为什么它不起作用。当然,我可以使用links: 或networks: 连接mongodb 但我听说链接已贬值,我找不到正确的使用方式networks:
我想我可能被误解了,请纠正我。 下面是我的 docker-compose.yml
version: '3'
services:
app:
container_name: node
restart: always
build: .
ports:
- '3000:3000'
mongo:
image: mongo
ports:
- '27017:27017'
在 express 应用程序中,我使用
连接到 mongodbmongoose.connect('mongodb://mongo:27017/myapp', {
useMongoClient: true
});
// also doesn't work with mongodb://mongo/myapp
加)Dockerfile
FROM node:10.17-alpine3.9
ENV NODE_ENV development
WORKDIR /usr/src/app
COPY ["package*.json", "npm-shrinkwrap.json*", "./"]
RUN rm -rf node_modules
RUN apk --no-cache --virtual build-dependencies add \
python \
make \
g++ \
&& npm install \
&& apk del build-dependencies
COPY . .
EXPOSE 3000
CMD npm start
【问题讨论】:
-
确保 mongodb 已启动并在从应用程序进行连接之前接受连接
-
@LinPy 是的,我想这是个问题。节点在 mongo 启动之前启动。如何解决?
-
@LinPy 哇,这解决了我的问题!谢谢!!
-
容器内的每个 docker 镜像也可以看到所有其他机器端口。因此,除非您还想公开
mongo,否则您甚至不需要->ports: - '27017:27017'
标签: node.js mongodb docker docker-compose