Docker启动时会自动创建名为bridge的默认虚拟网桥,未指定网络的容器均连接至此。容器通过动态分配的IP地址直接通信,但IP重启后会变化,需通过docker inspect命令获取。
操作步骤:
docker run -d --name container1 nginx
docker run -d --name container2 nginx
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container1 # 假设输出172.17.0.2
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container2 # 假设输出172.17.0.3
container1中pingcontainer2):docker exec -it container1 ping 172.17.0.3
优缺点:简单易用,但IP不稳定,不适合生产环境。
通过docker network create创建自定义桥接网络,容器连接后可通过容器名称直接通信(Docker内置DNS解析),无需记忆IP,且网络结构稳定。
操作步骤:
docker network create my_bridge_network
docker run -d --name container1 --network my_bridge_network nginx
docker run -d --name container2 --network my_bridge_network nginx
container1中pingcontainer2名称):docker exec -it container1 ping container2
优缺点:支持DNS解析、网络隔离性好,IP稳定,是单主机环境下推荐的通信方式。
容器直接使用宿主机的网络栈,无需虚拟网络转换,性能最高,但容器与宿主机共享网络命名空间,安全性低(端口直接暴露给宿主机)。
操作步骤:
docker run -d --name container1 --network host nginx
docker run -d --name container2 --network host nginx
localhost访问容器服务(如curl http://localhost:80)。适用于多Docker主机环境(如Docker Swarm集群),通过扩展IP报文实现跨主机容器通信,需配合Swarm模式或第三方工具(如Consul、ZooKeeper)实现服务发现。
操作步骤(以Swarm为例):
docker swarm init
docker network create --driver overlay my_overlay_network
# 主节点
docker service create --name web --network my_overlay_network -p 80:80 nginx
# 工作节点(需加入Swarm)
docker service create --name db --network my_overlay_network postgres
web、db)跨主机访问容器服务。通过docker-compose.yml文件定义多容器应用及网络,简化复杂项目的部署流程。容器自动连接到同一自定义网络,通过服务名称通信。
示例文件(docker-compose.yml):
version: '3'
services:
web:
image: nginx
ports:
- "8080:80"
networks:
- my_bridge
db:
image: postgres
environment:
POSTGRES_PASSWORD: example
networks:
- my_bridge
networks:
my_bridge:
driver: bridge
操作步骤:
docker-compose up -d
web容器中访问db服务):docker exec -it <web容器ID> psql -h db -U postgres
优缺点:适合多容器应用,自动化管理网络和依赖,提升开发效率。
通过--link参数让源容器与被链接容器通信,被链接容器可获得源容器的环境变量(如数据库密码)。但容器重启后IP变化会导致环境变量失效,且无法反向通信,官方已不推荐使用。
操作步骤(仅作了解):
docker run -d --name mysql --env MYSQL_ROOT_PASSWORD=root mysql:5.7
docker run -it --name centos --link mysql:mysql centos /bin/bash
centos中pingmysql):ping mysql
注意:避免在生产环境中使用此方式。
以上方法覆盖了Debian环境下Docker容器间通信的主要场景,可根据需求选择合适的方式(优先推荐自定义桥接网络或Docker Compose)。