• docker的介绍
    • A:为什么是docker
    • B:k8s介绍
  • docker的使用
    • A:docker的安装
    • B:docker的常用命令
    • C:docker容器的启动和操作
  • docker镜像的基础管理
    • A:docker镜像的基础概念
    • B:docker镜像的生成途径
    • C:镜像的导入和导出
  • 容器的虚拟化网络
    • A:容器虚拟化网络基础
    • B:docker的网络形式
    • C:docker网络的相关操作
  • docker的存储卷
    • A:docker的存储卷介绍
    • B:docker的网络形式
    • C:docker网络的相关操作
  • dockerfile详解
    • A:dockerfile基础
    • B:dockerfile的语法格式
    • C:dockerfile的指令详解
  • docker的私有registy
    • A:docker的私有registy介绍
    • B:docker的私有registy安装和简单使用
    • C:Harbor安装和简单使用
  • portainer的安装和使用

    • A:portainer的安装 

♣一:docker的介绍

A:为什么是docker

随着互联网的用户基数变大,可用于快速调配的系统资源环境变得尤为重要,在早些年,互联网公司都基于虚拟化技术来完成生产及开发环境的快速搭建,随着互联网的发展越来越快,虚拟化的技术已经不能很好满足需求。
主机级虚拟化的两种形类型:
1:直接在硬件上安装虚拟化软件,再在上面安装操作系统。
2:在宿主机之上安装虚拟化软件进行虚拟化,虚拟机和宿主机操作系统可以完全不一样。例如:VMware
这些传统的虚拟化技术最根本的本质就是要安装一个操作系统的内核,内核提供了用户空间,再在用户空间里面跑进程,这些进程就需要单独去安装,例如tomcat等,底层的内核只是提供的资源的分派和调度。
这种形态下的虚拟化环境虽然能满足我们的要求,但是不够便捷,如果是想单纯跑一个web服务,我们需要安装操作系统,安装web服务,然后配置才能提供服务,如果是新环境,你还得考虑版本兼容性等问题,是不是要装新版的web服务等。而且是类型2虚拟化的,在还没有提供web服务的之前,已经完成了两级的调度和资源分派,第一层的宿主机和第二层的虚拟机,在这其中的资源浪费也是不言而喻的。
既然基础层面上的繁琐和资源消耗,那么从原理上来说最方便的就是去掉一层内核,但是去掉内核就会用户空间就成了问题,因为用户空间是为了跑真正提供服务的进程所存在的,例如我要100台nginx服务器都监听8080端口,那么就需要100台虚拟机,一台虚拟机上是不能同时监听两个nginx的8080端口的,100台虚拟机的主要目的就是环境隔离,环境隔离了,即使其中50台nginx机器出了问题,那么我删掉虚拟机就好了,不会影响我宿主机。
内核空间又内核提供,服务进程由用户空间提供,n台虚拟机所需要实现的其实是用户空间的隔离,我们需要解决的第一个难点就是在一个内核空间之上开盘N个相互隔离的用户空间,让服务进程之间不会相互影响。这些相互隔离的用户空间就像一个大盒子里面装的小盒子一样,这种技术就叫容器技术。

容器技术最早是出现在FreeBSD上,叫jail,其主要的目的就是把进程之间相互隔离,并且限制这些散列的容器所消耗的资源得到控制。

进程相互隔离是做到了,但是底层的资源是有限的,当出现某一个进程占用资源已经到达容器的边界,是不是就因为内存溢出等问题而让服务挂掉了,显然是不合理的,此时就需要做到动态的分配资源才是最可取的。
资源完成动态分配之后,那内存资源本来就是整个内存上划分的内存块,如果是进程之间能通过ipc相互通信且能相互读取内存中的信息,也是不合理的。
通过上面我们得知docker要完成的莫非就是自动化隔离,
在3.8版本内核上才完成了主机名和域名(UTS)的隔离,IPC,mount(挂载树)和PID(进程树)程序需要运行需要进程树和文件树,用户和组,网络这6大块隔离技术(nameespaces名称空间)再加上chroot技术完成了容器的基本功能。

                             docker+k8s基础篇一

可以看到这些技术说起来简单,但是实现起来却很难,可以看到上图中用户和组的隔离功能一致到3.8的内核版本才完全支持。

容器技术的最核心的隔离功能完成之后,还需要实现一个机制,那就是要实现类似我们VMware可以指定资源的总量是多少,例如宿主机有16G内存,但是一个容器只能我只给分派4G内存,不能出现一个容器因把内存泄露吃干抹净剩余内存导致其它的容器无法正常运行,因为内存是不可压缩的,用完就没有了,相反cpu是有压缩机制的,服务申请cpu运算,如果cpu占用过高,此时服务的请求就得排队。
所以我们需要实现弹性的资源调配,我分给容器4G,这4G就是最大的值,当出现一个容器内部一个比较消耗内存的服务,那么就把容器中一个不常用的服务给kill掉,把空间让出来给这个服务使用,这个机制在linux已经实现,叫cgroups,他将多个系统资源划分成一个组,在将这个组里面的内容分配到每一个用户空间里面的进程上去。

                              docker+k8s基础篇一

虽然容器技术去掉了很多主机级虚拟化的弊端,但是容器技术也会存在问题,因为我们毕竟在一个内核之上分出来的一个个容器,但是这种隔离技术必然会出现漏洞,当一旦有漏洞,服务就可能绕过这个边界去剥夺其他容器的资源,从而产生问题,一致到现在也没有完全好的解决办法,为了防止这种情况出现,一般用户会开启selinux等安全功能来对这些容器进行加固。

上面我们说简要的说了下容器技术需要完成的功能,但是使用容器技术的工具却是极为不方便,你需要安装不同的工具甚至还要编写代码来完成容器的使用,既然如此,这种技术就被人给开发出来了,就叫做LXC(linuX Container),LXC极大的简化了容器的操作难度,

例如我们可以使用lxc-create来快速的创建一个容器,但是lxc-create是怎么来完成快速创建的了,lxc-create是快速创建了一个模板,并且给这个模板执行权限,这个模板就会去一个指定好的仓库里面把镜像拉下来并chroot进去,完成文件和服务的安装,创建用户等,这样过程其实和我们手动创建一个虚拟机是类似的。

lxc虽然简化了我们使用容器技术的操作,但是依旧有很高的门槛,例如我想快速创建不通性质的容器怎么办,我想大批量的进行容器的迁移怎么办,容器出现故障销毁了,里面存的数据和文件怎么办,lxc在面临分发和大规模使用上依然没有找到很好的突破口,所以后面就出现了docker,从这个性质上来docker只不过是lxc的增强版,弥补了lxc存在的功能缺陷,docker也不是什么容器技术,只不过是方便我们使用容器技术的前段工具罢了,容器技术本身就是又内核去完成的,docker只不过站在了lxc的肩膀上。但是docker逐渐壮大之后就抛弃了lxc,换上自家研发的libcontainer

既然我们想实现容器技术的大规模使用会很难,哪怕是简单的复刻一个一模一样的容器,docker就开始在这些方面找解决办法,docker在起初就是吧lxc重新封装作为容器管理技术的引擎,lxc在快速部署容器的时候使用的模板工具不够完善,docker发现之后,就开始把模板的思路扩展,研究出来一种镜像的工具,在镜像里面我们按照一个程序需要部署的所有步骤事先编排好,再把这个编排好的文件制作成一个镜像文件,最后把这些镜像统一放到一个便于管理的仓库中,当用户执行lxc命令的时候,不是去调用模板,而是去连到镜像仓库去下载一个匹配你当前需要的镜像文件,然后基于镜像启动容器

这样的方式就会极大的简化用户的操作,例如我想运行一个nginx,直接docker run nginx,这一条命令直接出发连接,下载,配置,启动等一系列操作,之前的lxc是创建了一个用户空间,一个用户空间可以运行很多程序,但是docker不一样,它完成的是一个容器运行一个程序。docker的这种逻辑给开发带来了极大的便利,现在的开发环境都是异构的,要满足不同的平台,centos,suse,windows等,对于docker来说我可以快速搭建相应的平台和服务用于开发中的调试,不管是基于java,python还是基于tomcat还是nginx,只要能事先编排好打包成镜像,直接docker run就可以了。但是对运维来说是极为不便利,之前我一个用户空间跑多个服务,可以共享某一个文件或者脚本,但是现在每一个程序都是单独跑在单独的容器之中,意味这文件是不能共享的,这样会造成磁盘空间的浪费,其次以前我如果查看所有服务是否正常,直接ps等命令就能看,但是现有的情况下会变得很麻烦,我得进入每一个容器中去查看,意味着每一个容器里面都需要安装相应的工具,更甚者,之前我能通过linux系统命令来调试的工具,结果到容器里面根本就没有调试工具。
docker还有另外的一个功能,随着docker的不断发展和功能完善,有些情况下就想实现底层我基于centos的一个固定版本,但是上层我想跑不通的服务,基于这种想法,docker开发了分层管理的功能,我单独创建一个centos,在上面安装nginx,tomcat等服务,然后分别打包成镜像,以后我想底层公用一个操作系统centos,上面我跑不同的服务,这样的形式叫做联合挂载技术,这每一个服务都被当做一个只读文件被运行,这样的形式能带来好处,也会带来资源的消耗,而且最重要的就是这每个只读文件所产生的数据怎么办,如果是迁移容器的话,服务不是难点,难的是数据,所以你要使用容器技术,就要实现考虑到长期保存的数据必须采用共享存储系统,这样你想迁移或者销毁服务,没有问题,数据还在就行,再把镜像下载下来,和数据池挂载上,就能运行。

docker后来也制作的容器运行时的标准runC,也制作了镜像文件标准,叫ocf开放容器格式标准。后来在linux基金会也创立了一个oci的标准,围绕容器格式和运行时知道一个开放的工业化标准。

B:K8S介绍

docker能帮我们便捷的管理容器了,但是我们的生产场景是复杂的,生产环境中我们启动程序是存在关联关系的,下游程序的启动必须依赖上游程序的启动,这样的操作我们不能是将容器创建好之后再去操作,我们应该是事先按照一定的顺序和逻辑将其编排好。
随着docker的编排越发变的重要之后,市面上也出现了大量的容器编排工具。
docker自己开发的工具:machine+swarm+compose,docker将这三个工具组合使用形成自己的编排工具;
asf研发的数据中心操作系统有一个统一资源编排工具mesos,mesos不是用来编排容器的,是用来实现统一资源调度的,要想编排工具就需要加一个中间层marathon;
kubernetes:k8s,基于go语言开发,k8s支持很多容器技术,docker只是其中一种。

♣二:docker的使用

A:docker的安装和启动

docker是使用镜像来完成容器内容的创建的,在互联网上,dockerhub.com是全球最大的镜像仓库网站,他提供了大多数的镜像文件,除了docker提供的镜像仓库网站,阿里,等都有镜像仓库网站,除了网路源,你还可以搭建自己的私有镜像仓库。

docker要想完美的运行,需要内核版本在3.10以上,64位的操作系统,centos6的版本也能支持,但是因为红帽公司将支持docker的补丁也挪到了6的版本上,但是稳定性就没有7的版本,至少从某些层面来说。

docker的安装文件在cenos7上直接yum就可以安装,包文件在extras里面,自带镜像里面的docker比较老,我们在网络上找一些共用的镜像或者yum文件下载到本地使用。

可以参考网站清华大写镜像网站信息:清华大学开源镜像网站

[root@localhost yum.repos.d]# wget https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
下载清华源repo文件到本地的环境中
[root@localhost yum.repos.d]# cat docker-ce.repo
[docker-ce-stable]
name=Docker CE Stable - $basearch
baseurl=https://download.docker.com/linux/centos/7/$basearch/stable
enabled=1
gpgcheck=1
gpgkey=https://download.docker.com/linux/centos/gpg
但是我们发现虽然是清华的源,但是地址还是指向的docker的官网,因为docker的网站访问太慢,我们改到清华源的地址
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/Packages/
把这个地址从linux的位置复制出来替换下docker-ce.repo文件的地址里面去
:%s@https://download.docker.com/@https://mirrors.tuna.tsinghua.edu.cn/docker-ce/@
vim的批量替换
yum repolist
源标识                                                        源名称                                                          状态
base/7/x86_64                                                 CentOS-7 - Base                                                 10,019
docker-ce-stable/x86_64                                       Docker CE Stable - x86_64                                           36
extras/7/x86_64                                               CentOS-7 - Extras                                                  371
updates/7/x86_64                                              CentOS-7 - Updates                                               1,163
repolist: 11,589
[root@localhost yum.repos.d]#可以看到Docker CE Stable - x86_64的包
安装
[root@localhost yum.repos.d]# yum -y install docker-ce   ce和ee是docker的社区版和企业版
docker安装成功
docker的安装

相关文章: