开发者学堂课程【现代应用容器技术快速入门:快速学习容器技术基础(三)】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/830
容器技术基础(三)——Docker实践
------马永亮
目录:
一、安装Docker CE
二、使用Docker
三、Volume types
四、bridge网络
五、跨节点容器空间通信
六、设置容器跨主机通信
七、基础网络选项
一、安装Docker CE
●支持的平台
在最初的时候,有Docker cloud公司更名为Docker以后,对应的发行版也在随后便成了两种分支,一个是Docker EE,一个是Docker CE,这里的C指的就是叫community education及社区版,在学习和使用的时候可以采用DRC的版本,Docker现在的自己的公司也在专心维护剩余的产品,也就是Docker C了。要想安装DRC,并且测试实践使用DRC,那首先得有一台主机,这台主机最好是一个Linux系统,不过目前来讲,DRC所能够支持到的平台分为desktop和server两大分类,而对于desktop来说,它大体上又有Mac和和Windows的两个不同的版本,并且对应的系统平台架构也有所不同,这里需要注意一下,对色板而言,这里主要支持的是各种各样的Linux的发行版,官方支持的主流的Linux发行,包括cent OS baby federal,SDN和open to这样几个主流版本,而且考虑到这里的rest bn本身就是为嵌入式的小平台设定的这个发行版,所以它主要支持的是arm平台。而对cent OS也好,Open to也好,对于X86的平台以及AR这样的平台可能都能知道,甚至对ubuntu而言,针对于arm的发行也能够知道。其实就是一个使用vmware所构建的虚拟机,然后在系统上现在准备的环境就是ubuntu20这种环境是X86_64的系统平台好,于是接下来就尝试着在该平台上去安装DRC即可,安装文档是:https://docs.docker.com/engine/install/
安装步骤:
表示支持的系统版本和安装过程和安装步骤,包括更新系统所依赖到的一些基本条件,而后去安装到docker官方的JPGPK包仓库,最后去安装DRC的Docker,大概分这样几个步骤,为了能够使得速度更快更便捷,可以打开阿里云的镜像站点,经有阿里云的镜像站点来执行相应的安装操作找到容器,这样比较容易找到这ce的镜像仓库,安装方法或者配置方法在这也是可以给到的。镜像仓库安装方法或者配置方法,这也能看到配置方法,只不过对于步骤来讲,只提到了ubuntu的14.04和16.04这样的版本,但对于20的版本同样是实用的,有对应的仓库都是存在的,首先第一步,去执行下载更新,不过要注意的是,这里的无版图系统直接以管理员用户登录公司,这里就不用带上速度的命令,如果是普通用户登录的话,那需要带上速度命令。其实这个系统此前做过更新,因而这并不需要,或者更新过程一个人非常快了,第二步,尝试着安装依赖到的这个安装包,安装完成之后,再接着去安装GP证书,这个步骤曾经提到过,基于阿里的镜像应该会快一点,接着是写入软件园信息。在这里的配置上,能看到他会使用l sb release 来获取到对应的系统的发行版,所以这会适配到当前系统合适的对应的镜像仓库或者有问题的版本上去。再接着执行安装操作就可以了。首先先去更新一下仓库信息,而后去安装DRC即可,于是执行update2去install doctor。
Docker完成安装完以后,第一步要去启动docker的服务,直接执行system Docker starch即可。执行system CT l start docker呢,接着system sneakers项目,DR已经正常启动起来,处于running状态,接下来就可以使用Docker令行客户端使用docker,安装完以后会生成一个名为docker的客户端,实际上也支持很多子命令,其中可以分为:管理类的命令叫management commands,还有其他的单个可以用的命令。如果要使用docker,像查看docker对应的word的版本的话就可以。这里安装的是Docker安静的community版本,当前是20.10.7的版本,也就是1.20。对应的这个server和client各自不同的版本,客户端版本是2010,那服务端NG的版本也是2010,因为是来自于同一个程序包,而且是本地直接通过本地接入的。考虑到Docker的系统架构的话,客户端与服务端之间是通过socket套接字通信的,Docker默认启动以后它所监听的socket。事实就是一个只能通过本地通信的unix filed或者称为socket file的这样一个一个一个监听的接口,因此客户端与服务端之间只能通过本地接口通信,无法远程连接,除非我们去重新配置docker。他的所有配置文件或者doc的配置文件将位于etc doc目录下,通过刚才安装的这个文件是json格式的,文件名叫的Jason,它里边就是建制格式所配置的,或者要遵循json语法的一些配置项。这些配置项可以通过docker的官方文档去搜索,去了解每个配置项的意义和作用,包括使用私有的镜像仓库,而不是有docker hub的官方仓库的时候,就是更之前提到的那个right。去的时候等等都可以在这个目录下建立一个叫做的demo.jason的文件来尝试实现。而docker所监听的那个socket文件,它默认位于VAR run目录下,应该就叫docker.sock。当然也可以尝试使用docker info命令来了解docker所在这台主机和Dr engine自身的一些相关信息。比如对课NG来讲,它会显示当前server上以的容器数量一共有多少,处于运行状态暂停状态,停止状态的有多少,本地有多少个镜像文件,已经存储了多少个镜像文件等等,但还包括存储驱动程序。镜像的那种分层叠加展评机制有适配到,或者要使用特定的存储驱动来完成它支持的,比如像Diver the device map,还有over overlay two,还有AFS等等,那这里能看到ubuntu20的系统版本上,对应的使用的是overlay two这么一个存储驱动,后面还有cgroup driver,用的是cgroups,还有logging driver就是日志存储,它使用json格式的文件。
而现在支持各种各样的插件,比如存储卷只支持本地的,没有安装支持其他外界的存储卷,所以也就意味着容器如果想脱离容器自己的那个文件系统树想持久存储数据的话,只能存储在宿主机本地。
这对于网络而言,所知的插件包括,Bridge host IP v la mak v la now overlay等等,这就是所谓的叠加网络后面日志驱动程序,或者说他的插件还是比较多的,支持将日志输出保存在多种不同的日志服务系统之上。现在来看其他几个命令,其中包括有几个重要的对象类型首先有container,就是专门实现容器管理的,所以在管理类命令当中,所有1content作为二级命令的更多的子命令都是用来做容器的增、删、改、查操作的,还有image就是镜像的管理操作,Network是跟网络管理相关的增、删、改、查,还有一个就是volume存储却除此之外它还有其他的一些常见的管理的命令。而且doctor历史上这个命令并没有分组,并没有管理命令这么一说。他们各个管理操作都是单个命令,所以很多的操作,无论是容器镜像网络或者是存储卷,大体上他们都有单独可以直接使用的命令,比如镜像、列举、删除相关的,专门用来删除镜像的,如果要查看镜像的话,就需要用到image这样的命令,所以这样的命令会交叉进行使用。
二、使用Docker
下图当中所给出来的事例其实也是单独使用的命令来实现的。
大多数的docker容器操作时所用到的,比如docker run这是启动容器的创建并启动容器,docker create就是创建容器,创建完以后要想启动还可以使用docker starch,所以run命令就相当于create加starch。一旦创建并启动起来以后,我们的容器将处于started状态,如果只创建没启动就表示处于create的状态或者created状态,接着一旦启动完以后,它将会转入running状态,如果能正常运行的话(这里的前提叫做如果能正常运行的话,将转为running状态)。处于running状态的容器支持各种各样的管理操作,比如像stop停止,改到相当于发给他个term信号去停止容器中的进程。docker Kill这就表示强行杀死那个对应的进程了,类似于像进程发restart这样的型号儿,那docker restart其实就相当于重启。对应的容器中的进程(或表的服务pass),可以理解为叫暂停的进程。pass表示继续运行,另外运行状态的容器很有可能因为系统资源内,尤其是内存资源耗尽而导致被Kill,这就是因为oom及cute by out of memory而导致转为stopped状态容器处于中止状态了。而处于停止状态的容器,可以使用start再重新启动起来,也可以使用docker oom给它删除了。对RM将经历一个称之为叫this的阶段,最终容器将转为delete的状态。所以容器常用常见状态,有就有这么几个,Created 、running、 house stops 、 deleted,大概这样几种状态相。并有很多这里也展出了什么docker kill duck pows dark restaurant,这些都是跟docker容器相关的操作。在前面提到过docker的管理对象,还有docker镜像,Docker网络等等,那些命令也都可以拎使用。另外这里的很多命令也都可以用docker container来进行执行,
三、Volume types
●Docker有两种类型的卷,每种类型都在容器中存在一个挂载点,但其在宿主机上的位置有所不同,默认的挂载点面上,默认支持的这个点只支持local1种类型,所以只能使用宿主机,默认只能使用速录机之类的存储卷。这就意味着数据在容器上存储时,可以将速录机上的某一个目录与容器内的某个目录路径建立关联关系,这个时候容器内的这个目录路径就叫挂载点,被挂载的就是宿主机上的某一个存储空间,通常也是一个目录,所以这两个目录,其实就相当于mark的绑定关系,那么在容器内的进程存储在该挂载点中的任何数据实际都被保存在宿主机上去了,因此如果容器停止并且被删除的话,数据是不会丢失的。但是在宿主机上,这个目录有两种类型:
●Bind mount volume
◆avolume that points to a user-specified location on the host file system
●Docker-managed volume
◆the Docker daemon creates managed volumes in a portion of the host's file system that’s owned by Docker
docker管理的券不同之处在于绑定挂载卷是自己可以指定一个特定的速录机上的路径的路径,路径可以自行指定,而有docker管理的卷在宿主机上,这个指定路径用户无需指定,docker有一个默认位置,并且在这个默认位置下会为对应的存储卷生成一个圈,ID命名的目录作为存储权空间。很显然,为了能够更具有更好的定制性,可以使用单的Mark volume,否则的话,为了能够让doctor自行管理,可以使用docker managed to volume,在实际使用中可以按需来进行定义和选择。而要想使用存储券,只需要在docker run的命令上,在创建容器的时候给他一个“-V选项”,两种使用方法也肯定会有所区别。
要使用管理券的话,只需要使用“-v”指定在容器内哪一个路径作为挂载点即可,而如果想使用绑定挂载卷的话,需要继续要指定容器内的挂载点同时,需要将红色的DR在前面,Volume docker反而在后面。
四、Bridge网络
本身提供了四种网络或者四种网支持,四种网络模型或者叫模式,有host跟宿主机共享,第二个叫做none表示不提供任何网络模型,还有一个叫做container,与其他容器共享(共享其他容器)的网络名称空间,还有一个叫做bridge,这是doctor默认为创建的每一个容器使用的网络模型。其实bridge指的就是Linux内linkedin所支持的虚拟网桥设备。默认情况下,它模拟的是物理网桥设备,工作于数据链路层。
●Bridge是指Linux内核支持的虚拟网桥设备,它模拟的是物理网桥设备,工作于数据链接层,根据习得的MAC地址表向设备端口转发数据帧,
●虚拟以太网接口设备对(VethPain)用于模块连接虚拟网桥和容器的网络媒介
◆一端插入到容器的网络栈中表现为通信接口(例如eth0等)
◆另一端则于宿主机上关联至虚拟网桥并被降级为当前网桥的“从设备”,失去调用网络协议栈处理数据包的资格,从而表现为桥设备的一个端口。
五、跨节点的容器间通信
●跨主机的容器间通信时,需要NAT机制的全程参与。
◆请求报文会首先由源宿主机进行一次SNAT(源地址转换)
◆而后再由目标宿主机进行一次DNAT(目标地址转换)方可送到目标容器器。
该目标就类似于这里的第二幅图所示,所以要想能够实现跨节点的容器间通信,或者是将该节点上的容器中所运行的服务发布到暴露到节点外部群能够被别人访问到,那么这个时候就必须在该节点上去为该容器内部的那个服务所监听的端口做的none,做个denied规则,就好像用户访问的时候访问的是这个节点(主机)。对应的网络接口之上的某一个特点端口,但对该端口的访问将被转发至内部的特定容器地址上的另外的其他端口,也可能是相同端口进行响应,所以在如docker容器网络当中,基于bridge模型,如果想实现跨节点的容器间通信。离开请求端的主机时要做sight,原因很简单,要不然content2收到线以后只看到content1的地址,而content1的地址是一个私网地址,这个时候的节点2是无法了解到这个地址在任何和在在在何处的,所以他们在报完离开节点1的时候必须转为节点1的接口地址,这个时候节点2才知道我们报完该送给谁,就是跨界的容器通信所面临的复杂境况,显然对于性能的影响是绝对不容忽视的。
六、设置容器跨主机通信
●-p选项的使用格式
◆-p <containerPort>
★将指定的容器端口映射至主机所有地址的一个动态端口
◆-p<hostPort>:<containerPort>
★将容器端口<containerPor>映射至指定的主机制端口<hosiPort>.
◆-p<ip>:<iccontainerPori>
★将指定的容器端口<contanerPor>映射至主机指定<ip>的动态端口
◆-p<ip>:<hostPort>:<containerPort>
★将指定的容器端口<containerPor>映射至主机指定<ip>的端口<hostPort>
●"动态端口”指随机端口,具体的映射结果可使用dockerpor命令查看。
七、基础网络选项
doctor软命令也可以指定其他几个选项,用来设定与网络属性相关的其他属性。比如自己为容器定义一下使用的主机名,可以使用“-host name”来实现,或者自定义一下指定要使用的DNS服务器的地址,使用“-S”,比如23.5.5.523.6.6.6什么之类的,也可以额外使用“--at host”自己为etc下的hosts文件添加解析选项,比如指定的格式打主机名解析为那个壁纸,这里将doctor com解析为172170.100这样的地址。