Docker网络
(1)–link
如何用名字而不用ip来访问容器,这个时候就要使用–link了!
因为上篇文章我们启动了两台tomcat,这里我们直接用这两台机子来测试一下。
docker exec -it tomcat02 ping tomcat01 ping: tomcat01: Name or service not known 可以发现是ping不通的
如何解决两个容器直接用名字互通(把两个容器连接起来就行了)
docker run -d -P --name tomcat03 --link tomcat02 tomcat:7.0
我们新启一个tomcat,让他通过–link绑定tomcat02
docker exec -it tomcat03 ping tomcat02 PING tomcat02 (172.17.0.3) 56(84) bytes of data. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.142 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.068 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.083 ms
直接链接就可以ping了!
docker exec -it tomcat02 ping tomcat03 ping: tomcat03: Name or service not known
反向是不能ping通的,因为没有配置,然后我们使用命令查看一下所有网卡。
docker network ls NETWORK ID NAME DRIVER SCOPE 3454234082a6 bridge bridge local 03fb70520a34 host host local 83eddbf8f273 none null local
ntwkid是本地的网卡(docker0),然后我们docker network inspect 3454234082a6查看bridge的网络配置信息
这就是docker0 上面可以看到ip和网段
这是其他容器,如果启动服务不指定ip会随机分配一个ip,这个ip是docker启动的时候分配的,其实tomcat03就是在本地配置了tomcat02的配置。
说白了–link就是在hosts配置中增加了一个tomcat02的映射,可以通过tomcat03ping通。也可以互相绑定,我们不推荐使用,太笨了,我们需要自定义网络(不用docker0,因为很多局限 不支持容器名连接访问)
(2)自定义网络
我们来简单介绍一下四种常见的网络状态!
bridge:桥接,说白了就是在docker上面搭桥,比如之前一个路由器叫0.1,后面来了0203,但是他们不能互相访问,不过可以通过01作为一个桥就可以通过这个桥互相访问了。(默认)
none:不配置网络
host:主机模式(和宿主机共享网络)
container:容器内网络联通(用的少)
docker run -d -P --name tocmat01 --net bridge tomcat:7.0 docker run -d -P --name tocmat01 tomcat:7.0 这两条命令其实是一样的,因为默认的网络模式就是bridge --net以及docker network就是我们的自定义网络模式了,服务在自定义网络下面使用。
然后我们看一下怎么用
docker network --help Usage: docker network COMMAND Manage networks Commands: connect Connect a container to a network create Create a network disconnect Disconnect a container from a network inspect Display detailed information on one or more networks ls List networks prune Remove all unused networks rm Remove one or more networks Run 'docker network COMMAND --help' for more information on a command.
好的 可以看到增删查这种的基本操作,我们来试试体验一下。
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet #--driver bridge 网络模式 #--subnet 192.168.0.0/16 子网 #--gateway 192.168.0.1 网关 docker network ls
可以看到我们设置的自定义网络。然后自己通过这个mynet启动两个tomcat,再次查看可以看到有两个新容器,ip也是自己分配的!
docker run -d -P --name tomcatzijide --net mynet tomcat:7.0 docker run -d -P --name tomcatzijide2 --net mynet tomcat:7.0
docker exec -it tomcatzijide ping tomcatzijide2 PING tomcatzijide2 (192.168.0.3) 56(84) bytes of data. 64 bytes from tomcatzijide2.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.118 ms 64 bytes from tomcatzijide2.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.070 ms 是可以通过容器名字ping的!现在不用--link就可以ping名字了
那么我们为什么要自己搭建呢?好处在哪里?
我们自定义的网络docker都已经帮着维护好了对应的关系,docker0没有这个功能,所以推荐自定义网络!比如搭建redis或者mysql的集群,要搭网络,网络是隔离的,都有自己的子网,不同的集群使用不同的网络保证安全。
(3)网络联通
docker0和mynet是两个网段不能ping通,我们要把docker0的容器可以连接到mynet而不是把两个网络打通(两个网络打通出问题,整个网络就变了)可以使用下面的命令
docker network connect mynet tomcat01 打通tomcat01到mynet
联通之后会把tomcat01加入到mynet网络下,两个打通了,也就是叫一个容器两个ip。腾讯服务也有两个:公网和私网ip
docker exec -it tomcat01 ping tomcatzijide PING tomcatzijide (192.168.0.2) 56(84) bytes of data. 64 bytes from tomcatzijide.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.124 ms 64 bytes from tomcatzijide.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.066 ms 此时就可以ping通了,02也可以被打通。 如果跨网络操作别人,就要用connect联通!
实战:部署redis集群
然后我们用上面学到的知识做一个redis集群来熟悉这些指令。
(1)创建redis网络
docker network create redis --subnet 172.42.0.0/16
(2)通过脚本创建redis配置
如果要自己弄的话要起好久,而脚本是帮助我们快速解决的工具!(直接复制到linux下就行)
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
之后去目录查看一下
cd /mydata/ cd redis/ ls node-1 node-2 node-3 node-4 node-5 node-6
(3)启动redis
脚本或者一个一个启动,脚本:
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.42.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \ done
一个一个启动:
docker run -p 6371:6379 -p 16371:16379 --name redis-1 \ -v /mydata/redis/node-1/data:/data \ -v /mydata/redis/node-1/conf/redis.conf:/etc/redis/redis.conf \ -d --net redis --ip 172.42.0.11 redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf 一个一个启动记得把redis-1挨个换成-2-3-4-5-6
启动成功之后查看一下
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a29639299648 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 2 seconds ago Up 1 second 0.0.0.0:6376->6379/tcp, :::6376->6379/tcp, 0.0.0.0:16376->16379/tcp, :::16376->16379/tcp redis-6 1eac8739a31a redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 2 seconds ago Up 2 seconds 0.0.0.0:6375->6379/tcp, :::6375->6379/tcp, 0.0.0.0:16375->16379/tcp, :::16375->16379/tcp redis-5 6ba5ef70d66f redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 3 seconds ago Up 2 seconds 0.0.0.0:6374->6379/tcp, :::6374->6379/tcp, 0.0.0.0:16374->16379/tcp, :::16374->16379/tcp redis-4 e54c22dc5bc5 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 3 seconds ago Up 3 seconds 0.0.0.0:6373->6379/tcp, :::6373->6379/tcp, 0.0.0.0:16373->16379/tcp, :::16373->16379/tcp redis-3 029f10e823d4 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" 31 seconds ago Up 30 seconds 0.0.0.0:6372->6379/tcp, :::6372->6379/tcp, 0.0.0.0:16372->16379/tcp, :::16372->16379/tcp redis-2 bdf03f1113f1 redis:5.0.9-alpine3.11 "docker-entrypoint.s…" About a minute ago Up About a minute 0.0.0.0:6371->6379/tcp, :::6371->6379/tcp, 0.0.0.0:16371->16379/tcp, :::16371->16379/tcp redis-1
(4)创建集群
进入容器
docker exec -it redis-1 /bin/sh redis没有bash 是sh 进去之后默认的pwd是data目录 redis-cli --cluster create 172.42.0.11:6379 172.42.0.12:6379 172.42.0.13:6379 172.42.0.14:6379 172.42.0.15:6379 172.42.0.16:6379 --cluster-replicas 1 然后输入yes就开始创建集群了 查看集群信息 redis-cli -c cluster info
三主三从都没问题。
set a b之后是13处理的(master)数据也在里面,从机应该也有这个数据,就算主机挂了从机也可以顶上。这就是高可用
然后我们直接停了第三个主机,然后我们get a,因为高可用搭建成功了所以可以!
在14找到了,从机,没问题,故障转移了,14就变为master了。