Docker 单主机网络

一、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

  1. 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集群实战)

  1. 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层.

客户端不需要连接集群所有节点连接集群中任何一个可用节点即可

  1. 集群三主三从
  2. 创建一个redis网络

docker network create --driver bridge --subnet 172.39.0.0/16 --gateway 172.39.0.1  redis

  1. 编写 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

  1. 启动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 镜像名 容器内执行程序  容器内配置文件

  1. 随便进入一个容器,并创建一个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

  1. 进入集群,并查看集群信息

redis-cli -c #进入群集

cluster info

cluster nodes

  1. 集群高可用测试

存入一个name值到redis集群中,查看

set k1 1

set k2 2

set k3 3

get k1

get k2

get k3

将对应的容器停掉

docker stop redis02

重新取name值(集群搭建成功)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值