提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
docker网络
重在理解
1.在宿主容器查看ip
代码如下(示例):
2.在docker容器查看ip
这里可以使用docker exec -it 容器id ip addr来查看docker容器ip(示例):
3.当docker容器启动后,在宿主容器再次查看ip
代码如下(示例):
原理:我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0,桥接模式,使用的技术是evth-pair技术!
我们发现这个容器产生的网卡,都是一对一对的
evth-pair 就是一对一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
正因为有这个特性,evth-pair 充当了一个桥梁,连接各种虚拟网络设备的
那么容器之间能不能ping通呢,准备两个tomcat(示例):
使用docker exec -it tomcat02 ping 172.17.0.2命令(示例):
容器通信图解(示例):
结论:tomcat01和tomcat02是公用的一个路由器,docker0
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip
只要删除容器,对应的一对网桥也会被删除
docker 使用的是Linux的桥接,宿主机中是一个docker容器的网桥docker0.
4.–link(原理就是修改hosts文件,单向)
代码如下(示例):
#这样直接使用容器名字来ping,是ping不通的
docker exec -it tomcat02 ping tomcat01
#通过--link 容器名字,就可以直接ping容器名字,而不用指定ip
#tomcat03可以访问tomcat02,tomcat02是不可以访问03的
#在tomcat03的/etc/hosts 文件中可以看到映射,和windows的hosts类似
docker run -d -P --name tomcat03 --link tomcat02 tomcat
6.创建network
网络模式(示例):
bridge: 桥接
none:不配置网络
host:和宿主机共享网络
container:容器网络连通(用的少,局限很大)
创建network并runing一个容器(示例):
#--driver bridge:桥接
#--subnet 192.168.0.0/16subnet:子网
#--gateway 192.168.0.1:网关
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
#使用自己的network run一个容器
docker run -d -P --name comcat-net-01 --net mynet tomcat
docker run -d -P --name comcat-net-02 --net mynet tomcat
#使用inspect查看mynet
docker network inspect mynet
会发现容器已经桥接了我们创建的mynet
此时使用命令
docker exec -it comcat-net-01 ping comcat-net-02
会发现可以直接ping通,并不需要 --link
好处:不同的集群使用不同的网络,保证集群是安全和健康的
当然不同的network之间也需要通信,这就涉及了网络连通的操作
7.网络连通
核心命令(示例):
准备环境(bridge就是docker0):
测试,打通tomcat01 – tomcat-net-01
#将tomcat01桥接到mynet
docker network connect mynet tomcat01
#查看mynet信息
docker network inspect mynet
会发现tomcat01桥接到了mynet,官方称作:一个容器两个ip
这下tomcat01 就可以ping通mynet桥接的所有容器了
8.实战(搭建redis集群)
环境准备
#创建一个容器
[root@localhost home] docker network create redis --subnet 172.38.0.0/16
#for循环创建redis配置文件
[root@localhost home] 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
#循环运行容器
[root@localhost home] for port in $(seq 1 6); \
do \
docker run -p 637${port}:6379 -p 1637${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
[root@localhost home] docker exec -it redis-1 /bin/sh
#创建集群(/data #)
#注意:Redis Cluster最低要求是3个主节点
#--cluster-replicas 参数为数字,1表示每个主节点需要1个从节点。
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
总结
博客资料源自B站狂神视频