Docker网络
Docker 是一个及其轻量化的应用容器,能够轻松将开发环境与应用打包至镜像进行发布,能达到“Develop Once,Run Anywhere”的效果。Docker 容器跟宿主机、不同容器之间究竟是如何通信的呢?这是Docker的核心内容。
Docker0
1
2
3
4
5
6
7
8
9
|
(base) george@george ~/test$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:9eff:fe6d:8c1c prefixlen 64 scopeid 0x20<link>
ether 02:42:9e:6d:8c:1c txqueuelen 0 (Ethernet)
RX packets 134541 bytes 14183525 (14.1 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 501775 bytes 629260746 (629.2 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
|
开启了Docker之后,发现网卡中多了一个 Docker0 ,这可以充当一个路由器的功能,使得所有容器通过网络桥接的方式相互通信。如我们启动其他容器后:
1
2
|
docker1:tomcat01 172.17.0.2
docker2:tomcat02 172.17.0.3
|
如果容器采用 host 模式,这种情况下容器与宿主机共享网络,其余情况通过 veth-pair 进行桥接,进而实现容器间的通信。
如何使用Docker部署 redis 集群
在如今的大数据与机器学习时代,几乎所有的服务都跑在集群上的。相比单机服务器来说,集群能够发挥负载均衡、高可用等特性。下面将演示如何在 docker 容器中部署 6 个redis 集群。
1、创建子网
1
2
|
$ docker network create redis --subnet 172.38.0.0/16
通过构建子网,使得redis集群处于同一子网
|
2、创建redis集群的配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
for port in $(seq 1 6); \
do \
mkdir -p /mydata/redis/node-${port}/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
sppendonly yes
EOF
done
|
3、依次启动6个redis集群
1
2
3
4
5
|
$ docker run -p 6371:6379 -p 16371:16379 --name redis-1 \
-v /mydata/redis/node-1/data:/data \
-v /redis_cluster/mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis --ip 172.38.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
依次替换 端口号 redis集群名称 ip地址,启动集群
|
4、进入集群
1
2
|
$ docker exec -it redis-1 /bin/bash
/data # 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
|