1,docker网络

1.1,docker0

有三个网络环境,那么docker是如何处理容器网络访问的?

1.2,测试

docker run -d -p 80:8080 --name tomcat01 tomcat
docker exec -it tomcat01 ip addr

本地可以ping通容器内部

1.3,原理

  • 只要安装了docker,就会有一个docker的ip-docker0(这里是172.17.0.1),这里的ip分配用的是桥接模式、veth-pair技术

    • veth-pair:一对虚拟设备接口,成对出现,一端连着协议,一端彼此相连;veth-pair充当一个桥梁,连接各种虚拟网络设备。
    • openstac,docker容器之间的连接,OVS的连接,都是使用veth-pair技术。
  • 每启动一个docker容器,docker都会给容器分配一个ip(为tomcat分配172.17.0.2)

  • 借助于宿主机,容器之间也可相互通信

    容器和宿主机通信

    容器之间通信

1.4,结论

  • 容器和宿主机是可以通信的

  • 容器和容器之间也是可以通信的,但使用docker0必须写明ip

  • 所用容器默认启动不指定网络的情况下,都是docker0进行路由的,docker会给容器分配一个默认的可用ip

  • docker使用的是linux的桥接,docker0是所有容器的网桥

  • docker中的所有网络接口都是虚拟的,虚拟的转发效率高

  • 容器删除,对应的网桥对就没了


2,link连接

2.1,测试及原理

是否可以使用容器名实现容器之间的通信?
docker exec -it tomcat01 ping tomcat02
发现不行
ping: tomcat02: Name or service not known 使用--link实现容器之间的连接
docker run -d -P --name tomcat03 --link tomcat02 tomcat
再使用容器名进行通信
[root@VM-0-11-centos ~]# 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.114 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.029 ms
[root@VM-0-11-centos ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known 显示网络配置,发现03中将02直接写入了网络配置
[root@VM-0-11-centos ~]# docker exec -it tomcat03 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 tomcat02 3ba10f8d5d4e
172.17.0.4 40fb066c620a
[root@VM-0-11-centos ~]# docker exec -it tomcat02 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 3ba10f8d5d4e

--link就相当于在容器的网络配置中增加了目标容器的映射

2.2,步骤总结

  • 使用--link连接

    docker run -d -P --name tomcat03 --link tomcat02 tomcat
  • 容器之间通信

    [root@VM-0-11-centos ~]# docker exec -it tomcat03 ping tomcat02

3,自定义网络

3.1,网络模式

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

3.2,自定义网络测试

首先要明白,以下两种启动方式是相同的(启动时--net不写网络默认使用bridge模式):
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat docker0的特点:默认、通过容器名不能相互访问,--link可以打通连接,但是--link使用比较麻烦,因此我们可以自定义网络。
[root@VM-0-11-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
8a3cfa860aaed386afc07a3b02f77edaec61a24a6095c7b6c165f1fa54bd7594
[root@VM-0-11-centos ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
bc749755ff23 bridge bridge local
cc6fb605cde8 host host local
8a3cfa860aae mynet bridge local
00b2ae19fb37 none null local
[root@VM-0-11-centos ~]# docker network inspect mynet 使用自己创建的网络启动容器,通过容器名直接可以进行通信
[root@VM-0-11-centos ~]# docker run -d -p 80:8080 --name tomcat01 --net mynet tomcat
[root@VM-0-11-centos ~]# docker run -d -P --name tomcat02 --net mynet tomcat
[root@VM-0-11-centos ~]# docker exec -it tomcat01 ping tomcat02
PING tomcat02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.053 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.034 ms
[root@VM-0-11-centos ~]# docker exec -it tomcat02 ping tomcat01
PING tomcat01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.082 ms
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.049 ms

3.3,自定义网络连通测试

使用默认模式再打开一个容器
[root@VM-0-11-centos ~]# docker run -d -P --name tomcat03 tomcat
023cff8d34af26a5db70af374b89b5c6baf1171c28f8ded417c8941f9ae597ed 尝试通信,发现不同网段的容器无法通信
[root@VM-0-11-centos ~]# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known
[root@VM-0-11-centos ~]# docker exec -it tomcat02 ping tomcat01
PING tomcat01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.034 ms 将tomcat03和mynet连通,就可以实现01,02,03之间的通信了
[root@VM-0-11-centos ~]# docker network connect --help
Usage: docker network connect [OPTIONS] NETWORK CONTAINER
[root@VM-0-11-centos ~]# docker network connect mynet tomcat03
[root@VM-0-11-centos ~]# docker exec -it tomcat03 ping tomcat03
PING tomcat03 (192.168.0.4) 56(84) bytes of data.
64 bytes from 023cff8d34af (192.168.0.4): icmp_seq=1 ttl=64 time=0.014 ms 查看mynet网络的具体信息,发现tomcat03已经加入到了mynet中(tomcat03也在docker01中/一个容器两个ip,docker01在docker network ls中显示为 bc749755ff23 bridge bridge local)
[root@VM-0-11-centos ~]# docker network inspect mynet
"Containers": {
"023cff8d34af26a5db70af374b89b5c6baf1171c28f8ded417c8941f9ae597ed": {
"Name": "tomcat03",
"EndpointID": "c57d075ff87400bf48d62e0c79dacf3fbf01417c678a62283ba62a370c815922",
"MacAddress": "02:42:c0:a8:00:04",
"IPv4Address": "192.168.0.4/16",
"IPv6Address": ""
},
"585ecd5171e7722401708234aa7a110773d4f852e2992d6dcc22084c282f12ff": {
"Name": "tomcat01",
"EndpointID": "8a13b027417aa67db6b8a7bb58d12c003c3cb5138bc9fcd9718542fc53626bd0",
"MacAddress": "02:42:c0:a8:00:02",
"IPv4Address": "192.168.0.2/16",
"IPv6Address": ""
},
"8456029b09de3306abfe6b61a1d7ca001a01c9d5da58f2d7f836db66d5c206bc": {
"Name": "tomcat02",
"EndpointID": "85765f60d452116017ef69038e98b2e9f85d286b1a70b7e558c48e96e9a407cc",
"MacAddress": "02:42:c0:a8:00:03",
"IPv4Address": "192.168.0.3/16",
"IPv6Address": ""
}

联通后的模型

3.4,步骤总结

  • 自定义网络(根据不同类别的容器可以创建不同的网络,不同网络是相互隔离的;自定义网络相比与docker0的最大优势是连接自定义网络的容器可以使用容器名相互通信)

    [root@VM-0-11-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
  • 使用自定义网络启动容器,就可以实现容器之间的相互通信(同一网络下)

    [root@VM-0-11-centos ~]# docker run -d -p 80:8080 --name tomcat01 --net mynet tomcat
    [root@VM-0-11-centos ~]# docker run -d -P --name tomcat02 --net mynet tomcat
    [root@VM-0-11-centos ~]# docker exec -it tomcat01 ping tomcat02
  • 网络连通,实现不同网络之间容器的相互通信

    [root@VM-0-11-centos ~]# docker network connect --help
    Usage: docker network connect [OPTIONS] NETWORK CONTAINER
    [root@VM-0-11-centos ~]# docker network connect mynet tomcat03

docker4-docker网络,容器编排,集群部署的更多相关文章

  1. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之flanneld网络介绍及部署(三)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.flanneld介绍 ...

  2. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录

    0.目录 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.感谢 在此感谢.net ...

  3. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之集群部署环境规划(一)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.环境规划 软件 版本 ...

  4. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.服务器设置 1.把每一 ...

  5. Docker网络讲解 及实验redis集群部署

    理解docker0 准备工作:清空所有的容器,清空所有的镜像 docker rm -f $(docker ps -a -q) # 删除所有容器 docker rmi -f $(docker image ...

  6. Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之部署master/node节点组件(四)

    0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 1.部署master组件 ...

  7. Docker(二十一)-Docker Swarm集群部署

    介绍 Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令.目前,Swarm ...

  8. Docker集群部署SpringCloud应用

    整体架构 docker环境准备 # linux下的安装,自行百度 # windows docker toolbox下载地址 https://download.docker.com/win/stable ...

  9. Docker学习-Kubernetes - 集群部署

    Docker学习 Docker学习-VMware Workstation 本地多台虚拟机互通,主机网络互通搭建 Docker学习-Docker搭建Consul集群 Docker学习-简单的私有Dock ...

  10. Docker Swarm集群部署

    一.系统环境 1)服务器环境 节点名称 IP 操作系统 内核版本 manager 172.16.60.95 CentOs7 4.16.1-1.el7.elrepo.x86_64 node-01 172 ...

随机推荐

  1. C++PRIMER第二章前半部分答案

    C++PRIMER第二章前半部分答案 哈哈哈,为什么是前半部分呢,后半部分还在学习中,重新系统性的学习c++,共同进步嘛,不多说,跟我一起来看看吧,第三章开始才是新手收割的时候,慢慢来~~ 2.1&a ...

  2. ==与equals比较

    提到==与equals的区别,这就必须先回顾一下jvm内存的分配机制 ==和equals无非比较两个基本数据类型或者对象类型 八种基本类型: 基本类型 大小 默认值 封装类 byte 1 0 Byte ...

  3. [刷题] 209 Minimum Size Subarray Sum

    要求 给定一个含有 n 个正整数的数组和一个正整数 s 找出该数组中满足其和 ≥ s 的长度最小的连续子数组 如果不存在符合条件的连续子数组,返回 0 示例 输入:s = 7, nums = [2,3 ...

  4. 优启通-PE启动盘制作工具 原版Win7系统安装超详细教程!!!!!

    https://www.jianshu.com/p/cd4abc9889b6 前期准备 原版Win7系统ISO映像文件 PE启动U盘或系统光盘(本教程以纯净无捆绑的优启通PE为示例) 优启通v3.3下 ...

  5. Ubuntu 18.04安装 Adob Flash player

    1.Ctrl + Alt + T 打开命令终端,启用Canonical Partners Repository存储库 (最新的Flash插件位于Canonical Partners的存储库中,默认情况 ...

  6. centos更新git

    安装完centos 7后默认的git版本为1.8,有些软件需要更新版本的git,但是在yum库中并没有更高的git版本,所以需要下载安装包进行手动安装,git下载地址:https://git-scm. ...

  7. spark算子优化

    一.在聚合前在map端先预聚合 使用reduceByKey/aggregateByKey代替groupByKey 二.一次处理一个分区的数据,不过要注意一个分区里的数据不要太大,不然会报oom * 使 ...

  8. 查看mysql的数据库物理存放位置

    1.查看mysql的数据库物理存放位置:    show global variables like "%datadir%";

  9. 『动善时』JMeter基础 — 33、JMeter察看结果树的显示模式详解

    目录 1.CSS Selector Tester视图 2.HTML查看器 (1)HTML视图 (2)HTML(download resources)视图 (3)HTML Source Formatte ...

  10. 微星msi B450M+i5-8500+1060成功黑苹果

    经过几天的努力,终于成功装上黑苹果! N卡1060目前只能装10.13.6(17G65),10.14版本N卡是没有驱动的,即便装上后也是8M的显存 详细教程网上一大堆,我就不做一份了.推荐大家看一下黑 ...