【问题标题】:Connect docker compose containers without links无需链接即可连接 docker compose 容器
【发布时间】: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 没有linksnetworks: 部分。并且文档说 web 的应用程序代码可以连接到 URL postgres://db:5432

所以我尝试使用上述方式与 nodejs expressmongodb 一起测试简单的 docker-compose。我以为我可以在 express 应用程序中连接 mongodbmongodb://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 应用程序中,我使用

连接到 mongodb
mongoose.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


【解决方案1】:

如果你想用本地连接mongo,那么你应该选择网络模式。

docket-compose.yml 文件内容。

版本:'2.1'

services:
  z2padmin_docker:
    image: z2padmin_docker
    build: .
    environment:
      NODE_ENV: production
    volumes: [/home/ankit/Z2PDATAHUB/uploads:/mnt/Z2PDATAHUB/uploads]  
    ports:
      - 5000:5000
    network_mode: host

【讨论】:

  • network_mode: host 对于容器到容器的直接通信不是必需的。原始问题中显示的docker-compose.yml 文件应该可以工作(如果您阅读了 cmets,它会在您等待 MongoDB 启动时起作用)。
猜你喜欢
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多