docker 网络

Docker0 网络详解

  1. 默认我我们安装完docker服务我们的系统会增加一个docker0的虚拟网卡

image-20200912162233456

解释:

从上面图我们可以看出 每启动一个 容器我们的docker0 会通过veth-pair技术虚拟出一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连

正因为有这个特性,veth-pair 充当一个桥梁,连接各种虚拟网络设备

OpenStack,Docker容器之间的连接,OVS的连接都是使用veth-pair技术

image-20200912162653650

思考: 因为我们的容器每重启一次 ip地址会变 这样会给我的容器互连造成致命的影响 有没什么办法可以解析主机名的方法

众所周知平常我们在内网解析主机名的时候我们一般写入hosts 文件中或者加入同一个域中

#我们容器也是提供了这样的方法
1. 在我们启动是 加入 --link 参数就能实现这个需求  # --link 现在一般不提倡用了 配置麻烦

image-20200914150425463

原理

image-20200914150612176

还有没更简便的方法可以实现这个需求呢?

自定义网络

查看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

image-20200914152005759

image-20200914152301633

从上图我们可以看出自定以网络 我们是通过路由网关通信的 并非hosts 文件的解析

我想要docker0 的网段的机器能够和mynet的网段机器能够通信 是否能够做到呢?

网络连通

image-20200914153055900

现在tomcat01 是不能喝mynet中的容器通信的

#使用docker network connect 网络 需要打通的容器

[root@localhost ~]# docker network connect mynet tomcat01
[root@localhost ~]# docker network inspect mynet 

image-20200914153933274

测试

image-20200914154109499

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.



image-20200914163620029

接下来我们将 主库 redis-3 停掉 测试是否能查到数据

image-20200914163756139

image-20200914164137519

image-20200914164329443

至此redis集群测试完成!

*************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
原文地址:https://www.cnblogs.com/martin-huang/p/13683607.html