一、docker的单主机网络模式,包括以下4类:
host
bridge
null
joined-container
查看当前启用的网络模式
docker network ls
查看Docker默认支持的网络模式
docker info | grep Network
启动容器时,默认使用的是bridge
1、host(主机模式)
类似于VMware的桥接模式(VMnet0),但容器没有独立ip;
容器直接使用主机的网络接口ip,无需进行额外的网络地址转换;
如果多个容器使用相同的端口号,会导致端口冲突;
这种模式用于网络性能较高的场景,进程间相互隔离,但网络共享。
示例:(不同容器相同端口会冲突)
docker run -d --name test1 --network host nginx:1.20 #无NAT转换,不加-p或-P
docker ps -a
curl 127.0.0.1
Windows浏览器访问: http://192.168.10.11 可以访问
docker run -d --name test2 --network host nginx:1.20
docker ps -a
docker logs test2 #80端口被占用
docker run --name tomcat1 --network host tomcat
docker ps -a
Windows浏览器访问: http://192.168.10.11:8080 可以访问
2、bridge(桥接模式)
默认的网络模式,有点类型VM-NAT,dockerd进程启动时会创建一个docker0网桥(相当于VMnet8),容器内的数据通过这个网卡设备与宿主机进行数据传输;
通过NAT转换为宿主机物理网卡IP与外部主机通信,外部主机通过端口映射(DNAT)访问容器内服务
docker会为容器创建独有的network namespace,也会为这个命名空间配置好虚拟网卡,路由,DNS,IP地址与iptables规则。
注:
容器内安装iproute包,执行ip a可以看到eth0@if#和宿主机上的veth*@if#是一个以太网卡对设备,用于连接容器与宿主机;
容器启动时,宿主机上和容器内同时产生,宿主机上偶数,容器内奇数
docker run -it centos:7 /bin/bash
等同于
docker run -it --network bridge centos:7 /bin/bash
- null(none无网络模式)
在无网络模式下,容器没有网络接口,与外部网络完全隔离,相当于一台没有连网的主机。这种模式适用于不需要网络连接的容器,执行与网络无关的应用。
docker run -it --network none centos:7 /bin/bash
4、joined-container
容器共享模式,这种模式是host模式的一种延伸,一组容器共享一个network namespace;
对外表现为他们有共同的IP地址,共享一个网络栈;
kubernetes的pod就是使用的这一模式。
- 通过自定义bridge网络实现容器互通
1、为什么需要自定义网络?
容器启动时默认的网络名称是bridge,它的模式是bridge(桥接模式),未作定义网络时,所有的容器都运行在一个网络中
默认网络容器间虽然可以通过ip通信,不同功能的容器放在不同的自定义网络(相当于不同vlan),会有更好的隔离性,也可以通过容器名直接通信
查看容器网络:docker network ls
查看容器网络:docker network inspect 网络名 (查默认网络bridge中的容器:docker network inspect bridge)
2、自定义网络:
docker network create --driver bridge --subnet 172.37.0.0/16 --gateway 172.37.0.1 test_net
docker network prune(删除所有自定义网络)
查看容器网络
docker network ls
NETWORK ID NAME DRIVER SCOPE
fd8851346218 bridge bridge local
ea9e3751f590 host host local
8e3e1706738d none null local
8fe9146fa417 test_net bridge local # 这个是我们自定义的网络
3、启动两个容器,并将其放入自定义的网络中
启动centos01
--net test_net 将容器发布到我们自定义的网络中去
docker run -itd --name centos01 --net test_net centos:7
启动centos02
docker run -itd --name centos02 --net test_net centos:7
4、测试容器间通信
可以通过名称两个容器间互相ping一下
centos02 ping centos01 可ping通
[root@localhost /]# docker exec -it centos01 ping centos02
PING centos02 (172.37.0.3) 56(84) bytes of data.
64 bytes from centos02.test_net (172.37.0.3): icmp_seq=1 ttl=64 time=0.122 ms
64 bytes from centos02.test_net (172.37.0.3): icmp_seq=2 ttl=64 time=0.125 ms
64 bytes from centos02.test_net (172.37.0.3): icmp_seq=3 ttl=64 time=0.089 ms
centos01 ping centos02 可ping通
[root@localhost /]# docker exec -it centos02 ping centos01
PING centos01 (172.37.0.2) 56(84) bytes of data.
64 bytes from centos01.test_net (172.37.0.2): icmp_seq=1 ttl=64 time=0.119 ms
64 bytes from centos01.test_net (172.37.0.2): icmp_seq=2 ttl=64 time=0.114 ms
64 bytes from centos01.test_net (172.37.0.2): icmp_seq=3 ttl=64 time=0.114 ms
64 bytes from centos01.test_net (172.37.0.2): icmp_seq=4 ttl=64 time=0.070 ms
- 容器互联(Redis集群实战)
- redis集群介绍
Redis 是一个开源的 key-value 存储系统,最多的是用做缓存。他的操作速度是mysql的10倍不止。SET操作每秒钟 110000 次,GET操作每秒钟 81000 次。由于出众的性能,大部分互联网企业都用来做服务器端缓存。Redis 在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障,但是现在互联网企业动辄大几百G的数据,可完全是没法满足业务的需求,所以,Redis 在 3.0 版本以后就推出了集群模式。
Redis 集群采用了P2P的模式,完全去中心化。Redis 客户端可以在任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。
架构细节:
(1)所有的redis节点彼此互联(PING-PONG机制).
(2)节点的fail是通过集群中超过半数的节点检测失效时才生效.
(3)客户端与redis节点直连,不需要中间proxy层.
客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
- 集群创建(三主三从)
- 创建一个redis网络
docker network create --driver bridge --subnet 172.39.0.0/16 --gateway 172.39.0.1 redis
- 编写 redis.conf 文件
可以使用数据卷挂载 redis 中的redis.conf到容器中,所以需要宿主机上提前配置好redis集群的6个配置文件
mkdir -p /home/redis/node0{1..6}/data
vim /home/redis/node01/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.39.0.11
cluster-announce-bus-port 16379
appendonly yes
复制产生另外5个配置文件
cd /home/redis/node01
cp redis.conf ../node02/
cp redis.conf ../node03/
cp redis.conf ../node04/
cp redis.conf ../node05/
cp redis.conf ../node06/
将redis.conf文件中的宣告地址改一下:如node02,cluster-announce-ip 172.39.0.12
sed -i '/cluster-announce-ip/s/11/12/' /home/redis/node02/redis.conf
sed -i '/cluster-announce-ip/s/11/13/' /home/redis/node03/redis.conf
sed -i '/cluster-announce-ip/s/11/14/' /home/redis/node04/redis.conf
sed -i '/cluster-announce-ip/s/11/15/' /home/redis/node05/redis.conf
sed -i '/cluster-announce-ip/s/11/16/' /home/redis/node06/redis.conf
- 启动6个redis容器
将容器目录挂载到宿主机目录,容器端口映射到宿主机端口
docker pull redis
docker run --name redis01 -p 6371:6379 -p 16371:16379 \
-v /home/redis/node01/data:/data \
-v /home/redis/node01/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.39.0.11 redis redis-server /etc/redis/redis.conf
docker run --name redis02 -p 6372:6379 -p 16372:16379 \
-v /home/redis/node02/data:/data \
-v /home/redis/node02/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.39.0.12 redis redis-server /etc/redis/redis.conf
docker run --name redis03 -p 6373:6379 -p 16373:16379 \
-v /home/redis/node03/data:/data \
-v /home/redis/node03/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.39.0.13 redis redis-server /etc/redis/redis.conf
docker run --name redis04 -p 6374:6379 -p 16374:16379 \
-v /home/redis/node04/data:/data \
-v /home/redis/node04/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.39.0.14 redis redis-server /etc/redis/redis.conf
docker run --name redis05 -p 6375:6379 -p 16375:16379 \
-v /home/redis/node05/data:/data \
-v /home/redis/node05/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.39.0.15 redis redis-server /etc/redis/redis.conf
docker run --name redis06 -p 6376:6379 -p 16376:16379 \
-v /home/redis/node06/data:/data \
-v /home/redis/node06/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.39.0.16 redis redis-server /etc/redis/redis.conf
注:
--name 容器名
-p 6371-6376:6379 宿主机端口:容器端口
-v 宿主机目录:容器目录
-d 后台运行
--net 加入的网络
--ip 分配的ip
redis redis-server /etc/redis/redis.conf 镜像名 容器内执行程序 容器内配置文件
- 随便进入一个容器,并创建一个redis集群
docker exec -it redis01 /bin/bash
redis-cli --cluster create 172.39.0.11:6379 172.39.0.12:6379 172.39.0.13:6379 172.39.0.14:6379 172.39.0.15:6379 172.39.0.16:6379 --cluster-replicas 1
- 进入集群,并查看集群信息
redis-cli -c #进入群集
cluster info
cluster nodes
- 集群高可用测试
存入一个name值到redis集群中,查看
set k1 1
set k2 2
set k3 3
get k1
get k2
get k3
将对应的容器停掉
docker stop redis02
重新取name值(集群搭建成功)