2022-05-25
运维
00
请注意,本文编写于 836 天前,最后修改于 110 天前,其中某些信息可能已经过时。

目录

Docker网络
理解Docker网络
--Link
自定义网络
网络连通
实战:部署Redis集群
实战:SpringBoot项目打包镜像

Docker网络

Docker网络

理解Docker网络

# 创建tomacat容器 启动 并执行 ip addr docker run --name tomcat01 -p 8080:8080 tomcat docker exec -it tomcat01 ip addr # 查询宿主机 docker网络 与tomcat容器网络ping

原理
1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一介网卡dockero桥接模式,使用的技术是==veth-pair==技术!

2、veth-pair

#我们发现这个容器带来网卡,都是一对的 #evth-pair就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连 #、正因为有这个特性,evth-pair充当一个桥梁,连接各种虚拟网络设备的 #openstac,Docker容器之间的连接,ovs的连接,都是使用 veth-pair技术

3、容器之间测试

pasted-8.png

结论: tomcat01、tomcat02是共用一个路由器 所有容器不指定网络的情况下,都是docker0路由分配一个默认可用的ip

核心网络原理图

pasted-7.png

Docker中的所有网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件!)
只要容器删除,对应网络桥接一对就消失了!

思考一个场景,我们编写了一个微服务,database url=ip:,项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以名字来进行访问容器

# 启动2个tomcat 01 02 # 通过容器名尝试ping [root@MiWiFi-RA81-srv ~]# docker exec -it tomcat02 ping tomcat01 ping: tomcat01: No address associated with hostname # 如何解决呢? ## --link可以解决(注:单向的) [root@MiWiFi-RA81-srv ~]# docker run -d --name tomcat03 --link tomcat02 mytomcat:1.0 80475d4b31170527c2e4a88c8c53ca9b43ee0657e3e9a65814c4e669f38cfb16 [root@MiWiFi-RA81-srv ~]# docker exec -it tomcat03 ping tomcat02 PING tomcat02 (172.17.0.5) 56(84) bytes of data. 64 bytes from tomcat02 (172.17.0.5): icmp_seq=1 ttl=64 time=0.073 ms 64 bytes from tomcat02 (172.17.0.5): icmp_seq=2 ttl=64 time=0.059 ms 64 bytes from tomcat02 (172.17.0.5): icmp_seq=3 ttl=64 time=0.045 ms ## 原理 ### 查看docker网络 docker network ls docker network inspect id ### 查看容器绑定link(找link) ### --link就是在hosts假如了映射 1、docker inspect 容器id 2、docker inspect 97ec4ba0656d|grep tomcat02 -n 3、进入容器查看 /etc/hosts 172.17.0.5 tomcat02 fd273a7550ee

我们现在玩Doker不建议使用--link
现在使用自定义网络!
docker0不支持容器名连接访问!

自定义网络

查看所有的dcoker网络

docker network ls

网络模式

  • bridge:桥接 docker(默认,自己创建也使用bridge模式)
  • none:不配置网络
  • host:和宿主机共享网络
  • container:容器网络连通!(用的少!局限很大)

测试

# 直接启动run 默认就是带--net bridge docker run -d -P --name tomcat01 tomcat docker run -d -P --name tomcat01 --net bridge tomcat # 创建网络 ## --driver bridge #指定bridge驱动程序来管理网络 ## --subnet 192.168.0.0/16 #指定网段的CIDR格式的子网 ## --gateway 192.168.0.1 #指定主子网的IPv4或IPv6网关 docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mybridge # 查看网络 docker network ls docker network inspect 网络id # 启动2个容器 指定创建的网络 docker run -d -P --name tomcat-net01 --net mynet mytomcat:1.0 docker run -d -P --name tomcat-net02 --net mynet mytomcat:1.0 # 测试2个容器网络 docker network inspect 网络id docker exec -it tomcat-net01 ping 192.168.0.3 docker exec -it tomcat-net01 ping tomcat-net02

可以发现,在我们的自定义网络下,容器之间既可以通过容器名也可以通过ip地址进行网络通信。 我们自定义的网络默认已经帮我们维护了容器间的网络通信问题,这是实现网络互联的推荐方式。

好处: redis:不同的集群使用不同的网络,保证集群是安全和健康的 mysql:不同的集群使用不同的网络,保证集群是安全和健康的

网络连通

把不同的网络打通(自定义网络与默认网络打通)

# 测试打通 docker network connect mybridge tomcat03 # 连通之后就是讲tomcat03放到mybridge网络下 # 一个容器两个ip地址(阿里云公网ip私网ip) docker network inspect 5bd453665e69 # 测试 [root@MiWiFi-RA81-srv ~]# docker exec -it tomcat-net01 ping tomcat03 PING tomcat03 (192.168.0.4) 56(84) bytes of data. 64 bytes from tomcat03.mynet (192.168.0.4): icmp_seq=1 ttl=64 time=0.259 ms 64 bytes from tomcat03.mynet (192.168.0.4): icmp_seq=2 ttl=64 time=0.075 ms

结论:假设要跨网络操作别人,就需要使用docker network connect连通!

实战:部署Redis集群

三主三从的Redis集群

# 创建redis网络 docker network create redis --subnet 172.38.0.0/16 # 通过shell脚本创建6个redis配置文件信息 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 # 通过shell脚本创建并运行6级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.38.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf; \ done # 进入redis01创建集群 docker exec -it redis01 /bin/sh 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 # 查看集群信息 redis-cli -c cluster info cluster nodes # 集群节点信息

实战
项目打包镜像

# 构建SpringBoot项目 # 打包jar # 编写dockerFile FROM java:8 COPY *.jar /app.jar CMD ["--server.port=8080"] EXPOSE 8080 ENTRYPOINT ["java","-jar","/app.jar"] # 上传到服务器(jar、dockeFile) # 构建镜像 docker build -t demo . # 发布运行 docker run

本文作者:酷少少

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!