docker实战(v1)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Docker实战王建飞Docker简介Docker是什么Docker是一个开源的应用容器引擎,可以自动化地部署应用到可移植的的容器中,这些容器独立于硬件、语言、框架、打包系统。一个标准的Docker容器包含一个软件组件及其所有的依赖——二进制文件,库,配置文件,脚本等等。Docker扩展了LXC,使用高层的API,提供轻量虚拟化解决方案来实现进程间隔离。可以运行在任何支持cgroups跟AUFS的64位Linux内核上。同时,Docker基于Go语言开发,代码托管在Github上,并遵循Apache2.0开源协议。Docker容器可以封装任何有效负载,几乎可以在任何服务器之间进行一致性运行。换句话说,开发者构建的应用只需一次构建即可多平台运行。运营人员只需配置他们的服务,即可运行所有的应用。Docker的常用案例包括:自动打包和部署应用创建轻量、私有的PaaS环境自动化测试和持续集成/部署部署并扩展Web应用、数据库和后端服务器下面的图片比较了Docker和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。Docker优势和劣势作为一种新兴的虚拟化方式,Docker跟传统的虚拟化方式相比具有众多的优势。首先,Docker容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。其次,Docker对系统资源的利用率很高,一台主机上可以同时运行数千个Docker容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行10个不同的应用就要起10个虚拟机,而Docker只需要启动10个隔离的应用即可。具体说来,Docker在如下几个方面具有较大的优势。更快速的交付和部署对开发和运维(devop)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。Docker可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。Docker容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。更高效的虚拟化Docker容器的运行不需要额外的hypervisor支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。更轻松的迁移和扩展Docker容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。更简单的管理使用Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。对比传统虚拟机总结特性容器虚拟机启动秒级分钟级硬盘使用一般为MB一般为GB性能接近原生弱于系统支持量单机支持上千个容器Docker体系结构1、Docker的内部组件docker有三个内部组件•dockerimages•dockerregistries•dockercontainersDockerimagesdockerimages就是一个只读的模板。比如:一个image可以包含一个ubuntu的操作系统,里面安装了apache或者你需要的应用程序。images可以用来创建dockercontainers,docker提供了一个很简单的机制来创建images或者更新现有的images,你甚至可以直接从其他人那里下载一个已经做好的imagesDockerregistriesDockerregistries也叫docker仓库,它有公有仓库和私有仓库2种形式,他们都可以用来让你上传和下载images。公有的仓库也叫DockerHub。它提供了一个巨大的image库可以让你下载,你也可以在自己的局域网内建一个自己的私有仓库。DockercontainersDockercontainers也叫docker容器,容器是从image镜像创建的。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、安全的平台。2、Dockerimage的工作原理每个docker都有很多层次构成,docker使用unionfilesystems将这些不同的层结合到一个image中去。AUFS(AnotherUnionFS)是一种UnionFS,简单来说就是支持将不同目录挂载到同一个虚拟文件系统下(uniteseveraldirectoriesintoasinglevirtualfilesystem)的文件系统,更进一步的理解,AUFS支持为每一个成员目录(类似GitBranch)设定readonly、readwrite和whiteout-able权限,同时AUFS里有一个类似分层的概念,对readonly权限的branch可以逻辑上进行修改(增量地,不影响readonly部分的)。通常UnionFS有两个用途,一方面可以实现不借助LVM、RAID将多个disk挂到同一个目录下,另一个更常用的就是将一个readonly的branch和一个writeable的branch联合在一起,LiveCD正是基于此方法可以允许在OSimage不变的基础上允许用户在其上进行一些写操作。Docker在AUFS上构建的containerimage也正是如此。3、Docker仓库docker仓库用来保存我们的images,当我们创建了自己的image之后我们就可以使用push命令将它上传到公有或者私有仓库,这样下次要在另外一台机器上使用这个image时候,只需要从仓库上pull下来就可以了。4、Docker容器当我们运行dockerrun-i-tubuntu/bin/bash命令时,docker在后台运行的操作如下:•如果本地有ubuntu这个image就从它创建容器,否则从公有仓库下载•从image创建容器•分配一个文件系统,并在只读的image层外面挂载一层可读写的层•从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去•从地址池配置一个ip地址给容器•执行你指定的程序,在这里启动一个/bin/bash进程•-i-t指定标准输入和输出5、Docker底层技术docker底层的2个核心技术分别是Namespaces和Controlgroups以下内容摘自InfoQDocker,自1.20版本开始docker已经抛开lxc,不过下面的内容对于理解docker还是有很大帮助。1)pidnamespace不同用户的进程就是通过pidnamespace隔离开的,且不同namespace中可以有相同pid。所有的LXC进程在docker中的父进程为docker进程,每个lxc进程具有不同的namespace。同时由于允许嵌套,因此可以很方便的实现DockerinDocker。2)netnamespace有了pidnamespace,每个namespace中的pid能够相互隔离,但是网络端口还是共享host的端口。网络隔离是通过netnamespace实现的,每个netnamespace有独立的networkdevices,IPaddresses,IProutingtables,/proc/net目录。这样每个container的网络就能隔离开来。docker默认采用veth的方式将container中的虚拟网卡同host上的一个dockerbridge:docker0连接在一起。3)ipcnamespacecontainer中进程交互还是采用linux常见的进程间交互方法(interprocesscommunication-IPC),包括常见的信号量、消息队列和共享内存。然而同VM不同的是,container的进程间交互实际上还是host上具有相同pidnamespace中的进程间交互,因此需要在IPC资源申请时加入namespace信息-每个IPC资源有一个唯一的32位ID。4)mntnamespace类似chroot,将一个进程放到一个特定的目录执行。mntnamespace允许不同namespace的进程看到的文件结构不同,这样每个namespace中的进程所看到的文件目录就被隔离开了。同chroot不同,每个namespace中的container在/proc/mounts的信息只包含所在namespace的mountpoint。5)utsnamespaceUTS(UNIXTime-sharingSystem)namespace允许每个container拥有独立的hostname和domainname,使其在网络上可以被视作一个独立的节点而非Host上的一个进程。6)usernamespace每个container可以有不同的user和groupid,也就是说可以在container内部用container内部的用户执行程序而非Host上的用户。Controlgroups主要用来隔离各个容器和宿主主机的资源利用。Docker安装启动系统环境CentOS6/7CentOS6下安装启动#yuminstalldocker-io#servicedockerstartCentOS7下安装启动#yuminstalldocker#systemctlstartdocker.service后台进程可以查看启动进程docker默认使用的是unixsocketDocker使用其它的host/port或者Unixsocket改变默认的docker进程绑定的TCP端口或者Unixdocker的用户组,将会通过允许非root用户获得root权限来修改主机,会增加你的安全风险!使用-H他可以运行你改变docker进程监听指定的IP和端口。默认情况下,他会监听unix:///var/run/docker.sock只允许本地的root用户连接,你可以设置他0.0.0.0:4243或者指定主机IP给任何用户,但是这不是我们所推荐的,因为那么低权限将会获得root正在运行的主机进程的访问权限!同样,docker客户端可以使用-H来指定连接的端口-H授权主机和端口的格式是这样的:tcp://[host][:port]orunix://path例如:tcp://host:4243-使用tcp连接host:4243unix://path/to/socket-使用socket位于path/to/socket-H当空的时候将会使用默认值就像没有-H一样-H也可以用简短的方式授权TCP绑定:host[:port]or:port//启动模式#docker-H0.0.0.0:5555-d&//下载centos镜像#docker-H:5555pullcentos//你可以是用多个-H例如你想监听你所有的TCP和Unixsocket#docker-Htcp://127.0.0.1:4243-Hunix:///var/run/docker.sock-d&//下载镜像用默认socket模式sudodockerpullubuntu//用TCP模式下载sudodocker-Htcp://127.0.0.1:4243pullubuntuDocker启动选项下面是一个跟Docker网络相关的命令列表。其中有些命令选项只有在Docker服务启动的时候才能配置,而且不能马上生效。-bBRIDGEor--bridge=BRIDGE--指定容器挂载的网桥--bip=CIDR--定制docker0的掩码-HSOCKET...or--host=SOCKET...--Docker服务端接收命令的通道--icc=true|false--是否支持容器之间进行通信--ip-forward=true|false--请看下文容器之间的通信--iptables=true|false--禁止Docker添加iptables规则--mtu=BYTES--容器网络中的MTU下面2个命令选项既可以在启动服务时指定,也可以Docke

1 / 65
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功