Docker深化学习篇LeaderusDocker的网络机制NetworkNamespaceNetworkNamespace,简称ns,networknamespace的网口与物理网卡的通信通过bridge来实现NetworkNamespace的互通NetworkNamespace之间类似平行宇宙,他们之间的通信只能通过VethPair这个特殊的Link来打通如果多个ns通信,就借助LinuxBridge了NetworkNamespace命令#addanewnamespaceipnetnasaddnetworknamespacename#Example:ipnetnsaddnstest#executeacommandinanamespaceipnetnsexecnetworknamespacenamecommand#Exampleusingthenamespacefromabove:ipnetnsexecnstestipaddr展示了在此networknamespace中的所有的ipinte将一个物理interface分配给networknamespace是不可能的,而是使用virtualinterface来实现。所以,我们先创建一个virtualinterface,同样使用ipcommand:iplinkaddveth-atypevethpeernameveth-biplinksetveth-bnetnsnstest将其中的一个interface添加入之前我们创建的namespacenstestDocker的网络模型docker1docker2私有内网局域网Bridge(桥)是Linux上用来做TCP/IP二层协议交换的设备,与现实世界中的交换机功能相似。Docker的网络模型docker1docker2私有内网局域网Bridge(桥)是Linux上用来做TCP/IP二层协议交换的设备,与现实世界中的交换机功能相似。Docker映射端口dockerrun--rm=true--name=mysqlserver-p8066:3306-eMYSQL_ROOT_PASSWORD=123456mysqldocker-proxy-prototcp-host-ip0.0.0.0-host-port8066-container-ip172.17.0.5-container-port3306最简单常用的互联方式:端口映射Dockerproxy的问题dockerrun--rm=true--name=mysqlserver-p8066:3306-eMYSQL_ROOT_PASSWORD=123456mysqldocker-proxy-prototcp-host-ip0.0.0.0-host-port8066-container-ip172.17.0.5-container-port3306最简单常用的互联方式:端口映射Apparentlytherearesomeedgecaseswithoutabetterworkaround(fornow):•localhost-localhostrouting•dockerinstancecallingintoitselfviaitspublishedport•andpossiblymoreDockerhost网络模式dockerrun--rm=true--net=host--name=mysqlserver-eMYSQL_ROOT_PASSWORD=123456mysql缺陷?Docker容器共用一个网络栈dockerrun--rm=true--name=mysqlserver-eMYSQL_ROOT_PASSWORD=123456mysqldockerrun--rm=true--net=container:mysqlserverjavaipaddrDocker容器共用一个网络栈同一个IP怎么相互访问container1container2…pauseKubernetesPodDocker多机互联测试目标环境Docker0172.17.42.1/16eth0192.168.18.130switchdocker130Docker0172.18.42.1/16eth0192.168.18.128docker128Docker网络互通Linux主机路由转发机制IP-Forwarding,IP转发。一种路由协议。IP转发是操作系统的一种选项,支持主机起到路由器的功能。在一个系统中含有两块以上的网卡,并将IP转发选项打开,这样该系统就可以作为路由器进行使用了。Docker0172.17.42.1/16eth0192.168.18.130docker130Router172.17.42.1192.168.18.130docker0eth0持续集成自动发布的问题ExecStart=/usr/bin/dockerdaemon--bip=172.18.42.1/16-Hfd://-H=unix:///var/run/docker.sockvi/usr/lib/systemd/system/docker.service重启docker128systemctldaemon-reloadLinux主机路由转发实践ExecStart=/usr/bin/dockerdaemon--bip=172.18.42.1/16-Hfd://-H=unix:///var/run/docker.sockvi/usr/lib/systemd/system/docker.servicedocker128上修改Docker0的网络地址,与docker130不冲突重启docker128systemctldaemon-reloadLinux主机路由转发实践防火墙规则导致Ping禁止iptables-F;iptables-tnat-FLinux主机路由转发实践docker130上执行routeadd-net172.18.0.0/16gw192.168.18.128docker128上执行routeadd-net172.17.0.0/16gw192.168.18.130130上启动一个容器,获取其IP地址128上Ping容器Linux主机路由转发实践Docker130上的一个容器ping128上的一个容器Docker128上抓包看到结果Linux主机路由转发实践Docker130上的容器c1:172.17.0.1ping128上的容器c2:172.18.0.1时,c1发现这个地址不是自己子网的,于是发给docker0网关经过路由计算,这个报文被发往下一跳的路由器端口:eth0,所以ttl减一报文到达128主机的eth0网卡,经过路由计算,被发往下一跳的端口dock0:注意到docker0上的ttl又减了一回来的时候,数据包流程:c2128docker0128eth0130eth0130docker0c1双网卡独立大二层交换(linuxbridge)Overlay网络(虚拟二层)隧道封装虚拟二层交换软件OvsDocker官方的网络方案Socketplane被docker公司收购,成为其官方网络的起源开发者不想操作是否是VLANs,VXLANs,Tunnels或者是TEPs.对于架构人们最关心的是性能和可靠性。而SocketPlane在socket层面提供了一个网络的抽象层,通过可管理的方式去解决各种网络问题。主要特性:•OpenvSwitch集成•用于Docker的零配置多主机网络•Docker/SocketPlane集群的优雅增长•支持多网络•分布式IP地址管理(IPAM)官方的Libnetwork1.将libnetwork集成到DockerEngine2.在DockerCLI中使用新的network命令3.撰写『-net』参数的文档,以告知用户如何使用它来为容器指定网络4.在network和endpoint中支持添加『label』5.研发新的『bridge』插件,以替换Docker目前的实现6.研发『分布式bridge』插件,以支持跨容器网络Docker存储机制Docker容器与主机文件交互hostDockerContainer/mydata/var/data/mydata/mydata2/var/data/mydata2为了能够保存(持久化)数据以及共享容器间的数据,Docker提出了Volume的概念。简单来说,Volume就是目录或者文件,它可以绕过默认的联合文件系统,而以正常的文件或者目录的形式存在于宿主机上。dockerrun-v/home/adrian/data:/datadebianls/dataDockerVolume插件为了确保删除容器数据不被删除,我们之前的做法就是通过-v把容器的数据目录和主机的目录做一个映射,但这样数据还是存放在本地磁盘中。在v1.7实验版引入了Volume插件机制,用户可以根据需要开发自己的Volume插件来使用外部存储服务。AWSEBSVolume插件可以在创建容器时,自动创建一块EBS,把容器的数据保存在EBS上。如果需要,用户也可以自己根据Volume插件的RPC接口规范开发适合自己的Volume插件,通过企业内部的NAS、SAN等存储服务来保存容器数据。DOCKERRBDVOLUMEPLUGIN——Ceph块存储DockervolumepluginforGlusterFS——GlusterFS分布式文件系统Docker监控Docker监控的基础DockerEngineDockerRestAPIMonitor•创建容器•启动容器•获取容器日志•进入容器执行命令Docker容器的日志由于容器是无状态的,所以存储在容器内的日志会随着容器的销毁而消失。stdout/stderr类型的日志,可通过logspout转发到syslog中心来收集。打印到文件的日志,比如accesslog,需要将日志存储到外部的Volume,并在Docker主机上使用logstash收集转发。/var/lib/docker/containers/image-long-id.logLogstashDocker容器的日志汇集查询方案Docker管理系统TutumDocker管理系统Tutum开源管理软件Shipyard开源管理软件Shipyard所有需要纳管的Docker主机,需要让Docker在TCP上监听,以便被纳管OPTIONS=-H=unix:///var/run/docker.sock-H=tcp://0.0.0.0:2375安装shipyarddockerrun--rm-v/var/run/docker.sock:/var/run/docker.sock\shipyard/deploystart运行:浏览器访问物理机的8080端口:默认用户名密码:admin/shipyard,,点击Engines标签页,添加一个Docker主机(Engine):开源管理软件Shipyard开源管理软件Shipyard谢谢观看Q&A