【问题标题】:Links to container in networking with docker-compose使用 docker-compose 链接到网络中的容器
【发布时间】:2020-10-29 12:33:39
【问题描述】:

我的目标是使用 docker-compose 从另一个容器通过 URL 访问容器。

所以,假设我有以下docker-compose.yml 文件

version: "3.8"
services:
  web:
    build: web
    ports:
      - "8000:8000"
    depends_on:
      - db
  db:
    image: postgres
    ports:
      - "8001:5432"

和文件夹web中的Dockerfile Dockerfile

FROM alpine:3.7
RUN ping postgres://db:5432

运行docker-compose build 返回

db uses an image, skipping
Building web
Step 1/2 : FROM alpine:3.7
 ---> 6d1ef012b567
Step 2/2 : RUN ping postgres://db:5432
 ---> Running in afbfcd27b340
ping: bad address 'postgres://db:5432'
Service 'web' failed to build : The command '/bin/sh -c ping postgres://db:5432' returned a non-zero code: 1

docker compose 中的网络文档( https://docs.docker.com/compose/networking/#links) 声明:

现在每个容器都可以查找主机名 web 或 db 并取回相应容器的 IP 地址。例如,web 的应用程序代码可以连接到 URL postgres://db:5432 并开始使用 Postgres 数据库。

从服务数据库获取的连接到容器的正确 URL 是什么?

【问题讨论】:

  • 您无法从 Dockerfile 中连接到其他容器。 (另外ping 使用非常低级的协议 ICMP 发送数据包,并且根本不理解 URL。)

标签: docker url networking docker-compose


【解决方案1】:

web 镜像构建过程中,你的db 容器不存在,所以这里使用RUN 是不正确的。

一种选择是在 Dockerfile 中包含 CMD 命令,该命令将指示 web 容器在每次启动容器时运行 ping 命令。

另外,我调整了传递给ping 命令的参数。

所以,web Dockerfile 将是:

FROM alpine:3.7

CMD ["ping", "db:5432"]

现在,在 docker-compose builddocker-compose up 之后,您将看到 web 容器 ping 部件 5432 上的 db 容器并收到响应。

docker-compose 启动一个桥接网络并将所有容器添加到该网络中,以便它们可以相互通信。每个容器的主机名与其​​在 docker-compose 文件中的服务名称相同。主机名由内部 DNS 服务解析。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 2017-09-02
    • 2023-03-09
    • 2020-04-04
    • 1970-01-01
    • 2015-09-11
    相关资源
    最近更新 更多