与docker compose联网中容器的链接
我的目标是使用docker compose通过URL从另一个容器访问一个容器 因此,假设我有以下与docker compose联网中容器的链接,docker,url,networking,docker-compose,Docker,Url,Networking,Docker Compose,我的目标是使用docker compose通过URL从另一个容器访问一个容器 因此,假设我有以下docker compose.yml文件 version: "3.8" services: web: build: web ports: - "8000:8000" depends_on: - db db: image: postgres ports: - "8001:
docker compose.yml
文件
version: "3.8"
services:
web:
build: web
ports:
- "8000:8000"
depends_on:
- db
db:
image: postgres
ports:
- "8001:5432"
以及文件夹web
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中用于联网的文档(
)国家:
现在,每个容器都可以查找主机名web或db并返回相应容器的IP地址。例如,web的应用程序代码可以连接到URLpostgres://db:5432 并开始使用Postgres数据库
连接到从服务数据库获得的容器的正确URL是什么?在
web
映像生成期间,您的db
容器不存在,因此此处使用RUN是不正确的
一个选项是在Dockerfile中包含CMD命令,它将在每次启动容器时指示web
容器运行ping
命令
此外,我还调整了传递给ping
命令的参数
因此,web
Dockerfile将是:
FROM alpine:3.7
CMD ["ping", "db:5432"]
现在,在docker compose build
和docker compose up
之后,您将看到web
容器ping第5432部分上的db
容器并接收响应
docker compose
启动网桥网络,并将所有容器添加到此网络,以便它们可以相互通信。每个容器的主机名与docker compose文件中的服务名相同。主机名由内部DNS服务解析。您无法从Dockerfile中连接到其他容器。(另外,ping
使用非常低级的协议ICMP发送数据包,并且根本不理解URL。)