Docker简介:可以理解为是一种容器,就像一个盒子。其中装的是为了执行特定目的系统或服务环境。其目的是为了提高硬件的资源利用率,并且方便了企业业务的快速横向扩容,在相关的技术配合下还能实现业务宕机自愈等功能;
NameSpace:用来解决Docker和宿主机之间的资源隔离问题,其分为6个部分;
1.MNT NameSpace:负责解决Docker和宿主机之间的文件系统隔离问题;就是说我们可以在Ubuntu系统的宿主机上启动一个CentOS的Container,并且在Container中启动一个Nginx服务。此Nginx运行时所使用的环境时CentOS的,但是Contaier不允许访问宿主机Ubuntu的资源的,宿主机使用了chroot技术将容器锁定在一个特定的目录中;
2.IPC NameSpace:负责解决在一个Container内process间,通信的隔离问题;允许一个容器中的不同进程间的数据(memory,cache)访问,但不可跨容器访问其他容器内的数据;
3.UTS NameSpace:负责解决Container之间的HostName隔离问题;全称UNIX Timesharing System 包含了运行kernel的名称,版本,底层体系结构类型等信息。其使得一个Container拥有数据自己的HostName标识,并独立于宿主机上的其他Container;
4.PID NameSpace:负责解决Container之间进程隔离问题;在一个Linux系统中一定有一个PID为1的进程来作为其他进程的父进程,那么既然每一个Container都是一个简洁的Linux系统,所以在Container中也一定有一个父进程来管理其下所属子进程;
5.NET NameSpace:负责解决宿主机与Container,容器与容器之间网络隔离问题;每个容器都像虚拟机一样拥有自己的网卡,监听端口,TCP/IP协议栈等。NET NameSpace会启动一个vehtx(虚拟eth)网络接口,这样你的Container将拥有自己的桥接IP地址和网卡文件,在宿主机上通常表示为docker 0接口,而这个接口实质上就是宿主机与Container之间的虚拟网桥。
6.USER NameSpace:负责解决Container之间的用户名和组的隔离问题;就像之前说到的,每个Container都拥有自己的运行环境,那么同样也一定拥有自己的用户名和组,Container之前可能存在相同的用户名或者组名,但却不会互相干扰,其原因就是USER NameSpace;
CGroup:在一个容器内,如果不对其做任何资源上的限制,那么宿主机将会允许其无限量的占用资源,这并不是我们愿意看到的。为了避免此类现象出现,则使用CGroup机制来对容器进行资源上的限制,其包括CPU,内存,磁盘,网络带宽等等。此外还可以对进程进行优先级设置,以及将进程挂起恢复等操作。
Docker容器依赖技术与容器编排工具简介:
首先介绍几个在容器技术中比较重要的概念:
1.容器管理工具:首先runtime是真正运行Container的组件,而管理工具是为runtime和用户之间便捷沟通的接口,其为用户提供图形化或命令行模式的操作方式,然后管理工具将用户的操作传递给runtime以真正实施操作;这里可以理解为管理工具即是docker,runtime可以通过docker info命令查询;
2.容器定义工具:容器定义工具允许用户定义容器的属性和内容,以方便容器能够被保存,共享和重建;
Docker images:是docker容器的模板,runtime依据docker images创建容器;
DockerFile:包含N个命令的文本文件,通过dockerfile创建出相应的Docker images;
3.Registry:统一保存镜像而且是多版本的地方,叫做镜像仓库;
image registry:docker官方提供的私有仓库部署工具;
Docker hub:docker官方的公共仓库,已经保存了大量常用镜像,可以直接使用;
Harbor:VMware提供的自带认证功能和web界面的镜像仓库;
4.编排工具:当众多container在多个宿主机上运行时,单独管理容器是相当繁重的工作,而且也极易出错,并且无法实现高可用目的和对某一台主机宕机后的自动迁移和动态伸缩功能。故此需要有一种工具可以实现统一管理,动态伸缩,故障自愈,批量执行等功能,这就是容器编排引擎;
容器编排通常包括:容器管理,调度,集群定义和服务发现等功能;
kubernetes:google领导开发的容器编排引擎,内部项目为Borg,且其同时支持docker和CoreOS;
Docker容器的依赖技术:
1.容器网络:docker单独运行虽然可以,但并不足以发挥出容器技术的最大潜力。所以为了保障在多个容器同时运行时的联系问题,就必须要那个到容器网络。通常使用第三方的管理工具如:calico,fiannel等;
2.服务发现:容器的动态扩容特性也决定了容器的IP地址并不固定,因此需要一种机制可以自动识别,并将用户请求动态转发到新创建的容器上。k8s自带服务发现功能,需要结合kube-dns服务解析内部域名来使用。
3.容器监控:针对大规模的容器状态监控,通常使用heapster/Prometheus等第三方监控工具监控容器的运行状态;
4.数据管理:容器的动态迁移会导致容器在不同主机间变换,因此如何保证容器相关的数据存储问题。可以使用逻辑卷/存储挂载/网络存储等方式解决;
5.日志收集:针对大规模海量容器日志收集,通常使用ELK等专门的日志收集分析和展示工具进行处理;
实验基于Dockerfile制作一个Nginx镜像:
1.Docker build:调用dockerfile构建镜像的工具,注意DockerFile文件名称必须是dockerfile;(某些情况下DockerFile文件甚至比镜像还要重要);
在使用DockerFile构建镜像的时候,最好使用类似于逐步快照的思维模式去做。比如,如果目标是构建一个LNMP业务镜像,那么我们可以先基于基础Linux(CentOS,Ubuntu)构建一个初始化完成的镜像,以此来保证后续操作环境的正常。然后再根据具体操作将整个构建过程分为几个阶段去实施;
例:使用DockerFile构建一个nginx镜像;注意实例为ALL-IN-ONE模式;
1.1 创建Dockerfile存储目录,此目录的结构尽量保证类型明确以便管理;
# mkdir Dockerfile/{web/{nginx,tomcat,jdk,apache},system/{CentOS,Ubuntu,Debian}} -pv
1.2 下载一个基础系统镜像,Ubuntu或者CentOS;
# docker pull centos:7.8.2003 #下载基础镜像;
1.3 使用Dockerfile文件,将系统环境初始化保证后续命令可以正常使用并生成一层镜像,如vim,ifconfig,yum配置等;注意:Dockerfile文件通常保存在对应的业务组件目录中,而且唯一,并且书写方式不可变(大小写);
# docker build -t "test_centos:7.8.2003_init" .
注意:上面命令中最后一个“.”表示上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。
1.4 根据1.2所产生的镜像再构建一个已经安装了Nginx服务的镜像;
1.5 根据1.3所产生的镜像构建一个使用我们自行修改过配置的Nginx服务镜像;
# docker cp ./code/index.html 1ca2e42a26ca:/usr/local/nginx/html/ #将我们修改过的html文件cp到运行的container中,并测试;
1.6 在构建镜像的最后一步的时候需要启动一个不常用且能运行在镜像系统前端的命令,来作为镜像中PID为1的进程,这个进程意义在于保证在镜像创建完成之后可以直接启动而非退出;
此处有两种解决方法:
1.6.1 编辑启动脚本(脚本必须在镜像中),脚本中启动特定服务,然后使用tail -f /etc/hosts方式将镜像hold住,CMD中启动脚本;
1.6.2 将daemon off;参数编写到服务配置文件中,然后直接启动服务,并测试;
Dockefile构建镜像步骤总结:
1.确定初始的第一个镜像,通常是基础的系统环境。注意,必须使用官方经过认证的或者确定完全安全的镜像;
2.构建项目或业务目录,现实情况下可以根据具体情况具体分析,但通常要保证目录结构清晰以便方便今后管理;
3.在对应的业务目录中编写Dockerfile文件将,要对镜像的调试与更改操作录入进去;
4.使用docker build命令构建镜像,并测试;
网友评论