在默认设置下,Docker Compose 会为应用程序创建一个网络。每个容器的服务都可以通过这个默认网络相互连接,并通过与容器名称相同的主机名进行识别。
为应用程序的网络命名时,系统会基于其所在的目录名称自动生成一个名称。您还可以使用 –project-name 参数或 COMPOSE_PROJECT_NAME 环境变量来自定义项目名称。
假设您的应用程序位于名为 Myapp 的目录中,您的 docker-compose.yml 文件内容如下:
version: "3.9"
services:
web:
build: .
ports:
- "8000:8000"
db:
image: postgRes
ports:
- "8001:5432"
运行 docker-compose up 时,会执行以下操作:
系统会创建一个名为 Myapp_default 的网络。
容器 web 将基于其配置加入 Myapp_default 网络。
容器 db 也同样基于其配置加入 Myapp_default 网络。
从 Compose 文件格式 2.1 开始,创建的覆盖网络默认是可连接的(attachable),且此特性无法配置。这意味着独立的容器可以连接到该网络。
在 Compose 文件格式 3.x 中,您可以选择将可连接属性设置为 False。
现在,任何容器都可以通过主机名 web 或 db 来获取相应容器的 IP 地址。例如,web 容器中的应用程序可以通过 URL postgRes://db:5432 来连接并使用 PostgRes 数据库。
需要注意的是,host_PORT 和 CONTAINER_PORT 是有区别的。在上述示例中,db 的 host_PORT 是 8001,而容器端口为 5432(这是 PostgRes 的默认端口)。服务间的通信使用 CONTAINER_PORT,而 host_PORT 则用于外部访问服务。
在 web 容器中,连接字符串 db 的格式为 postgRes://db:5432,而在主机上,连接字符串则为 postgRes://{DOCKER_IP}:8001。
[[[IMG_1]]]
[[[IMG_2]]]
