Docker0 网络详解
- 默认我我们安装完docker服务我们的系统会增加一个docker0的虚拟网卡
解释:
从上面图我们可以看出 每启动一个 容器我们的docker0 会通过veth-pair技术虚拟出一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连
正因为有这个特性,veth-pair 充当一个桥梁,连接各种虚拟网络设备
OpenStack,Docker容器之间的连接,OVS的连接都是使用veth-pair技术
容器互连 --link
思考: 因为我们的容器每重启一次 ip地址会变 这样会给我的容器互连造成致命的影响 有没什么办法可以解析主机名的方法
众所周知平常我们在内网解析主机名的时候我们一般写入hosts 文件中或者加入同一个域中
#我们容器也是提供了这样的方法
1. 在我们启动是 加入 --link 参数就能实现这个需求 # --link 现在一般不提倡用了 配置麻烦
原理
还有没更简便的方法可以实现这个需求呢?
自定义网络
查看docker的网络
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
27e69a0c595a bridge bridge local
ddc47c04c23c host host local
1777d22a6f41 none null local
#网络模式
bridge :桥接 (docker默认,自己创建也使用bridge模式!)
none :不配置网络
host :和宿主机共享网络
container :容器网络连通,容器直接互联!(用的少!局限很大!)
测试
# 我们之前直接启动的命令 (默认是使用--net bridge,可省),这个bridge就是我们的docker0
docker run -d -P --name tomcat01 tomcat #等价于
docker run -d -P --name tomcat01 --net bridge tomcat
# docker0(即bridge)默认不支持域名访问 ! --link可以打通连接,即支持域名访问!
# 我们可以自定义一个网络!
# --driver bridge 网络模式定义为 :桥接
# --subnet 192.168.0.0/16 定义子网 ,范围为:192.168.0.2 ~ 192.168.255.255
# --gateway 192.168.0.1 子网网关设为: 192.168.0.1
[root@localhost /]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
7ee3adf259c8c3d86fce6fd2c2c9f85df94e6e57c2dce5449e69a5b024efc28c
[root@localhost /]# docker network ls
NETWORK ID NAME DRIVER SCOPE
461bf576946c bridge bridge local
c501704cf28e host host local
7ee3adf259c8 mynet bridge local #自定义的网络
9354fbcc160f none null local
[root@localhost ~]# docker network inspect mynet
[
{
"Name": "mynet",
"Id": "168f5229d3531fd1cac0823fdea3960e3f55f1f721154faa70a52efda19808cd",
"Created": "2020-09-10T19:41:38.271638094+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
基于mynet 创建容器
[root@localhost ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
[root@localhost ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
从上图我们可以看出自定以网络 我们是通过路由网关通信的 并非hosts 文件的解析
我想要docker0 的网段的机器能够和mynet的网段机器能够通信 是否能够做到呢?
网络连通
现在tomcat01 是不能喝mynet中的容器通信的
#使用docker network connect 网络 需要打通的容器
[root@localhost ~]# docker network connect mynet tomcat01
[root@localhost ~]# docker network inspect mynet
测试
Redis 集群部署实战
需求:1.使用docker部署Redis集群3主3从
2. docker容器必须在一个网段中能够解析主机名
#1.创建一个redis的网段
#2.在宿主机上创建容的数据卷目录
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 192.38.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done
#查看创建结果
[root@localhost ~]# tree /mydata/
/mydata/
└── redis
├── node-1
│ └── conf
│ └── redis.conf
├── node-2
│ └── conf
│ └── redis.conf
├── node-3
│ └── conf
│ └── redis.conf
├── node-4
│ └── conf
│ └── redis.conf
├── node-5
│ └── conf
│ └── redis.conf
└── node-6
└── conf
└── redis.conf
13 directories, 6 files
#创建容器
for i in $(seq 1 6);
do
docker run -p 637$i:6379 -p 1637$i:16379 --name redis-$i
-v /mydata/redis/node-$i/data:/data
-v /mydata/redis/node-$i/conf/redis.conf:/etc/redis/redis.conf
-d --net redis --ip 192.38.0.1$i redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
done
#进入容器创建集群
[root@localhost ~]# docker exec -it redis-1 /bin/sh
/data # redis-cli --cluster create 192.38.0.11:6379 192.38.0.12:6379 192.38.0.13:6379 192.38.0.14:6379 192.38.0.15:6379 192.38.0.16:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.38.0.15:6379 to 192.38.0.11:6379
Adding replica 192.38.0.16:6379 to 192.38.0.12:6379
Adding replica 192.38.0.14:6379 to 192.38.0.13:6379
M: 8d2596670d44021741caca77fce72085c7a23ec2 192.38.0.11:6379
slots:[0-5460] (5461 slots) master
M: f15436d5f3b5d43aa0b1b79994d1d3e820a8ddeb 192.38.0.12:6379
slots:[5461-10922] (5462 slots) master
M: 4c4393261640dc27a89260d7e34f13dc56933020 192.38.0.13:6379
slots:[10923-16383] (5461 slots) master
S: 193f792b54b41d8359c49961468c1a9c3235027f 192.38.0.14:6379
replicates 4c4393261640dc27a89260d7e34f13dc56933020
S: cd78883a115e6605cf84ae01b5b9863df1e8185b 192.38.0.15:6379
replicates 8d2596670d44021741caca77fce72085c7a23ec2
S: 257fe3100935b35a19c60f1bc8025207ab431ae7 192.38.0.16:6379
replicates f15436d5f3b5d43aa0b1b79994d1d3e820a8ddeb
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join
...
>>> Performing Cluster Check (using node 192.38.0.11:6379)
M: 8d2596670d44021741caca77fce72085c7a23ec2 192.38.0.11:6379
slots:[0-5460] (5461 slots) master
1 additional replica(s)
S: cd78883a115e6605cf84ae01b5b9863df1e8185b 192.38.0.15:6379
slots: (0 slots) slave
replicates 8d2596670d44021741caca77fce72085c7a23ec2
M: 4c4393261640dc27a89260d7e34f13dc56933020 192.38.0.13:6379
slots:[10923-16383] (5461 slots) master
1 additional replica(s)
M: f15436d5f3b5d43aa0b1b79994d1d3e820a8ddeb 192.38.0.12:6379
slots:[5461-10922] (5462 slots) master
1 additional replica(s)
S: 193f792b54b41d8359c49961468c1a9c3235027f 192.38.0.14:6379
slots: (0 slots) slave
replicates 4c4393261640dc27a89260d7e34f13dc56933020
S: 257fe3100935b35a19c60f1bc8025207ab431ae7 192.38.0.16:6379
slots: (0 slots) slave
replicates f15436d5f3b5d43aa0b1b79994d1d3e820a8ddeb
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
接下来我们将 主库 redis-3 停掉 测试是否能查到数据
至此redis集群测试完成!