主要观点:开发者最初用 Docker 成功运行单个容器并通过 localhost 访问,而多容器应用才体现容器的真正优势,多数开发者在此面临挑战。如一个容器有 Web 应用,另一个有数据库,它们如何通信?不能通过 docker inspect 找临时 IP 或使用过时的--link标志。Docker 有强大网络系统,掌握关键概念后易使用,本文将阐明 Docker 网络,展示如何连接容器及 Docker Compose 如何简化过程。
关键信息:
- 默认
bridge网络:安装 Docker 会创建默认网络,无--net标志的容器会连接此网络,可访问互联网但服务发现有问题,容器间需用内部 IP 通信,不可靠且无法按名称定位。 - 用户定义桥接网络:应设置自定义桥接网络用于每个应用,Docker 会提供自动基于 DNS 的服务发现功能,为网络分配内部 DNS 服务器,容器连接后会自动注册。
实用 CLI 示例:
- 步骤 1:创建用于应用的网络
docker network create my-app-net。 - 步骤 2:运行数据库
docker run -d --name my-database --net my-app-net -e POSTGRES_PASSWORD=mysecret postgres。 - 步骤 3:运行应用
docker run -d --name my-api --net my-app-net -e DB_HOST=my-database -p 3000:3000 my-api-image,应用可通过DB_HOST=my-database连接数据库,Docker 内部 DNS 会自动转换。
- 步骤 1:创建用于应用的网络
- Docker Compose:用于本地开发,自动处理网络管理,在
docker-compose.yml文件中定义两容器设置,自动创建默认网络,启动服务并连接到网络,添加环境变量,使容器可通过服务名访问数据库。 网络驱动概述:
- 主机:禁用网络隔离,容器共享主机网络栈,用于高网络性能牺牲安全和端口映射的情况。
- 覆盖:分布式网络连接多个 Docker 主机,用于 Docker Swarm 集群,创建虚拟网络使不同主机的容器像在同一机器通信。
- 无:完全网络隔离,容器只有环回设备,用于高安全或无需与外界通信的批量任务。
重要细节:
- 用 CLI 时停止使用默认网络,用
docker network create...创建自定义网络。 - Docker Compose 可自动创建自定义网络和处理服务发现,容器名作为新主机名。
- 在网络 Docker 环境中,通过服务名连接,如 my-database,而非 localhost 或内部 IP。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。