Docker网络
- docker网络使用的是Linux的桥接,宿主机是docker容器的网桥
- 每启动一个docker容器,docker都会给容器分配一个IP
- docker中的网络都是虚拟的,容器删除对应的网桥也会被删除
link
- 两个容器使用容器的名字互相ping,网络是不能ping通的
docker exec -it tomcat02 ping tomcat01
- 通过link把一个容器链接到另外一个容器
# tomcat03 ping tomcat02能通,反过来不行
docker run -d -P --name tomcat03 --link tomcat02 tomcat
- link的本质是在host文件中添加映射,不推荐使用
网络模式
host模式
- 容器和宿主机共享网络
- 容器启动不会虚拟出自己的网卡和IP地址,而是使用宿主机的IP和端口
- 使用host模式可以直接使用宿主机的IP和外界通讯
- 使用host模式网络性能比较好,但是已经在宿主机上映射的端口不能再继续使用
-net=host
container模式
- 该模式指定新创建的容器和已经存在的一个容器共享网络
- 新建的容器不会创建自己的网卡和IP,而是使用指定容器的IP和端口
- 两个容器的进程可以互相通讯
-net=container:NAME_or_ID
none模式
- docker容器启动不会配置任何网络信息,需要手动添加网卡、配置IP等
- 该种网络类型不能联网
-net=none
bridge模式
- 该种模式docker服务启动的时候会在宿主机上创建一个名为docker0的虚拟网桥
- docker容器启动的时候会虚拟出自己的网卡和IP等,通过宿主机上的docker0虚拟网桥通讯
- bridge模式是docker的默认网络模式,不写-net参数就是使用bridge模式
docker run -d -P --name tomcat01 tomcat
# 等价于
docker run -d -P --name tomcat01 --net bridge tomcat
自定义网络
- 默认的网络不能实现通过镜像的名字通讯,通过
--link可以连通,但是要双向通讯需要两次--link处理起来比较麻烦 - 通过自定义网络,需要连通的容器使用自定义网络即可实现双向通讯
创建网络
docker network create --driver birdge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
查看创建的网络
docker network inspect mynet
启动容器使用自定义网络
docker run -d -P --name tomcat-net --net mynet tomcat
网络连通
- 目的是将两个网络不通的容器连通能互相通讯
# 使用默认网络启动一个新的容器
docker run -d -P --name tomcat01 tomcat
-
tomcat01使用默认的网络启动,网段是172的,此时如果要和
tomcat-net连通是不行,tomcat-net的网段是192的 -
通过命令
docker network connect连通
docker network connect tomcat01 mynet
# 执行该命令后tomcat01和tomcat-net就能互相通讯了
说明:跨网络的两个容器要互相连通需要使用:
docker network connect
使用自定义网络部署Redis集群
# 创建网卡
docker network create redis --subnet 172.38.0.0/16
# 通过脚本创建六个redis配置
for port in $(seq 1 6);
do
mkdir -p /mydata/redis/node-${port}/conf
touch /mydata/redis/node-${port}/conf/redis.conf
cat << EOF >> /mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
# 启动留个Redis容器
for port in $(seq 1 6);
do
docker run -p 637${port}:6379 -p 1667${port}:16379 --name redis-${port} -v /mydata/redis/node-${port}/data:/data -v /mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf -d --net redis --ip 172.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done
# 进入redis-1容器
docker exec -it redis-1 /bin/sh
# 创建集群
redis-cli --cluster create 172.38.0.11:6379 172.38.0.12:6379 172.38.0.13:6379 172.38.0.14:6379 172.38.0.15:6379 172.38.0.16:6379 --cluster-replicas 1