Docker 网络是 Docker 容器之间通信的基础设施,允许容器相互连接、与外部世界通信,以及隔离不同应用的网络环境。
1、network
Docker 默认网络驱动
常用命令
查看网络
docker network ls # 列出所有网络
docker network inspect <网络名> # 查看网络详情(容器、IP、网关等)创建网络
# 基础 bridge 网络
docker network create my-net
# 指定子网和网关
docker network create \
--driver bridge \
--subnet 192.168.10.0/24 \
--gateway 192.168.10.1 \
my-net容器连接网络
# 运行容器时指定网络
docker run -d --name web --network my-net nginx
# 已有容器加入网络
docker network connect my-net redis-1
# 容器退出网络
docker network disconnect my-net redis-1删除网络
docker network rm my-net # 删除指定网络
docker network prune # 删除所有未使用的网络核心特性
1. 容器名称即 DNS
同一网络内的容器可通过容器名互相访问:
# web 容器可以直接 ping redis-1,无需知道 IP
docker exec web ping redis-12. 网络隔离
不同 bridge 网络的容器默认无法通信
实现多环境隔离(开发、测试、生产)
3. 端口映射(bridge 网络)
# 将容器端口映射到宿主机,供外部访问
docker run -p 8080:80 nginx
# 外部访问:宿主机IP:8080 → 容器内部:80实际应用场景
与 Docker Compose 结合
不固定IP
version: '3.8'
services:
redis:
image: docker.1ms.run/library/redis:7.2
container_name: redis-1
ports:
- "16479:6379"
networks:
- my-network
networks:
my-network:
driver: bridge
ipam:
config:
- subnet: 192.160.1.0/24
gateway: 192.160.1.1version: '3.8'
services:
redis:
image: docker.1ms.run/library/redis:7.2
container_name: redis-1
restart: unless-stopped
ports:
- "16479:6379"
networks:
my-network:
ipv4_address: 192.160.1.10 # 固定容器 IP(可选)
# 如果之前遇到 Background Jobs 报错,加上下面这行
# security_opt:
# - seccomp:unconfined
networks:
my-network:
driver: bridge
ipam:
config:
- subnet: 192.160.1.0/24
gateway: 192.160.1.1Compose 自动创建网络,服务名即 DNS 名称。
总结
2、测试
2.1、创建网络
docker network create --driver bridge --gateway 192.160.1.1 --ip-range 192.160.1.0/24 --subnet 192.160.1.0/24 jm-cloud-network2.2、查看网络
docker network ls
docker network inspect jm-cloud-network
2.3、服务使用这个网络
如,启动一个redis服务
docker run -d --name redis-1 --network jm-cloud-network -p 16479:6379 --security-opt seccomp=unconfined docker.1ms.run/library/redis:7.2
2.4、其他服务加入同一个网络怎么连接redis
1、容器内部IP(192.160.1.2:6379)
2、宿主机IP(192.168.1.111:16479)
3、容器名称(redis-1:6379)
推荐使用容器名称去连接,Docker 内置 DNS 解析,容器 IP 变化不影响连接
如一个springboot项目,做成docker镜像,加入同一个network,连接这个redis,那么可以做下面
# application.yml
spring:
data:
redis:
host: redis-1 # 容器名称
port: 6379 # Redis 容器内部端口
password: # 如果有密码填这里
database: 0