Dcoker项目起源
docker这个项目的话呢,最早是在2013的时候开源出来,k8s是2015年开源出来的,在2013年之前,我们主要就是使用那个虚拟化,包括open stack,包括kvm等等都是都是虚拟机啊。
在2017年3月1号的时候啊, docker公司的话呢,把docker这个项目进行了重新组合。2017年之后,它改成了mob项目,mob里面又有一个docker的商业版和一个docker的开源版
我们广泛使用的就是这个Doker-ce
如何去找Docker官方文档
进入 docker.com ,找到最下面的docs 进入
点击doc 进入后如下图
在点击那个Download and install 如下图所示
这样一来就可以找对应的版本下载安装了
Docker理念
docker的这种官方的理念就是一次构建,构建指的是构建定向。嗯,一次构建,然后呢?到处运行。啊,其实中间还有个运输呢。一次构建,他叫做构建。叫build。叫build。就是运输的意思呃,构建运输网,构建运输和运行,这个是它是它的理念。
这个主要是解决了我们服务的运行环境的问题啊,其实在在Docker之前也有很多这种类似的容器技术,只不过呢。嗯,落地的技术难度比较比较比较高,而导致呢,没有一些技术人员推广,所以说没有大量的使用啊,在docker出现之后,它简化了我们容器的运行,包括容器的落地。
所以说,就是基于它的一次构建,然后呢,到处运行。这个构建出一个镜像。镜像是运行容器的最基本条件叫image。镜像当中的话呢,包含了你的服务所运行需要的最基本的一些依赖环境啊,包括你的可执行程序。啊,如果是JAVA程序的话,它会有jdk环境啊,也包括各种配置文件,包括你的代码等等。都会在镜像里面来进行提供,
那么把这个镜像构建好之后的话呢,我们一般会放到一个进行仓库,就是harbor。在harbor里面保存我们的镜像。在k8s里面,到目前为止,在我们的公司里面都是通过harbor来进行进项的统一分发的,统一分发。
所以说这个harbor又起到了镜像的运输的作用啊,把镜像放到harbor里面。就可以让各个服务器嗯,去harbor里面去下载镜像了。所以说镜像的分发。是通过harbor实现的,
这个运行的话呢。就是你通过什么样的方式把镜像运行为一个服务,毕竟镜像的话呢,是个静态文件,我们是不能直接访问的。如果要访问的话,得把这个镜像启动为一个服务,你的服务起来之后的体现就是它有个端口啊,你可以通过这个端口对它进行访问。对它进行访问,这个运行的话就是docker的核核心技术啊,目前是 runc。
Docker的组成
那docker的组成就是它有些最基本的组件儿啊,这个组件儿就是。有一个registry进入进入进入进入仓库,这个进入仓库的话呢,官方有一个就叫做docker registry,不过我们用的不多,我们一般用harbor这个里面就是放的镜像啊,我们有个docker host,就是在docker主机上去运行容器
这个容器在运行的时候的话呢,需要通过。一些命令把镜像下载下来。下载下来之后,它就是images啊,就是镜像,这个镜像也是存到你的你的docker里面的,然后呢?这个镜像嗯,通过一些命令啊,叫docker run去调用你的docker demo啊,这个docker的server端。然后呢,把镜像运行为一个容器
一旦运行为一个容器之后,它叫container,一个容器就是一个container啊,多个容器就是containers。一个镜像可以被启动为多个容器啊.
主机就是运行docker容器的一个服务器,可以使虚拟机啊,它对环境没有什么太多要求啊,只要有。Docker就可以,而且也不需要你的CPU支持什么嗯,一些特殊的指令集啊,这个一般不需要。
除非呢是你的业务。比较特殊啊,比如说你的业务是做这种人工智能的啊,那它可能会需要一些智能机,就是做一些AI的。啊,它可能会用到一个特非常特殊的这种机叫avx2。
这个是英特尔开发的一个指令集啊。嗯,是用于这种人工智能环境的。有些现在这个人工智能的一些,场景的话会非常依赖于这个整机,非常依赖这个整机,如果没有这个整机的话。你会发现他的服务跑不起来。
Docker调用方式
那这个docker的话呢,它的调用方式就是你在你的电脑上,或者在服务器上装好,有个docker服务。它会起个server啊,这个server有个Docker daemon,其实就是个进程,那这个进程的话呢? 会被你的Docker cli所调用。命令行也好啊,或者是是k8s的那个kubernetes组件是运行的node节点,它是通过调用docker的socket的文件来创建容器的。
一个docker的守护进程,下面还会有N多个容器container1 container2等等。这个结构基本上就是下图这样。
Docker仓库
官方的镜像仓库 hub.docker.com
官方的镜像仓库当中保存了很多镜像,一些社区或者是一些第三方的项目提供的镜像,比如说nginx啊mysql,做好镜像之后会放到docker的官方的仓库。比如说你要装个mysql啊,不一定非得是yum install 或者二进制安装,你可以通过镜像去。把它pull下来,
Docker和虚拟机对比
Docker
虚拟机的话和docker对比的话呢,有些区别。最大的区别在于,你的虚拟机里面是有是有独立的内核的啊,你通过open stack也好,或者通过Vmware也好,跑一个虚拟机。
每个虚拟机都有独立的内核,但是呢Docker没有,Docker是直接调用宿主机内核来运行了,来运行了。所以说相对比的话,docker的资源利用率会相对更高些,就是一个服务器,你可能会运行。几十个虚拟机
假如说一个128g的物理服务器,我们一般可能会跑啊,15个左右的虚拟机,15到20个吧。但是呢嗯,相同的硬件的情况下,我们可能会跑30个或者更多的容器
所以说一个相同的业务,你用是你要是用虚拟用虚拟机的话,可能就需要5到8个虚拟物理服务器。但是用Docker的话,三四个就够了,可以节省将近一半左右的左右的物理资源。包括它的开销更小,因为它不需要啊,类似于虚拟机的内核,所以说呢,它的硬件的占用会相对更小一些,
Docker它可以在数秒之内完成启动同样的一个JAVA服务,在公司里我们要是放在虚拟机里面启动的话。没个几十秒钟可能起不来,因为那个JAVA程序很大啊,它的那个jar包。都有几10M, 如果是用容器起的话,很快几秒钟就可以起来了,就可以起来,因为你的Docker是直接利用。宿主机的那个CPU,宿主机的CPU,所以性能会更强一些啊.
总结就是无论你是使用虚拟机还是使用容器,我的目的就是为了运行你的应用程序,好在虚拟机上你可以运行mysql。那我在docker里面也可以跑mysql,那为什么不用doocker呢啊?包括你的虚拟机可以运行nginx或者运行什么服务,我在docker里面也可以啊,而且相同的。情况下,我的资源更占用,更少性能更快启动,速度更快。而且呃,在K8S里面做横向扩容更简单,那为什么不用Docker呢?
Docker的安装
参照官方文档进行安装,不在此文详述
Install Docker Desktop on Ubuntu | Docker Docs
Docker info参数说明
我们docker安装好之后,执行docker info命令,我们来看每个参数的含义
整体是这样
Server:下面参数的含义
Containers :表示容器有几个
Running :表示运行的容器有几个
Paused :暂停中的容器个数
Stopped :停止运行的容器个数
Images :端口镜像有几个
我们在继续看
Server Version : Docker 的Server 版本
Storage Driver :表示存储引擎
Backing : 后端文件存储,后端文件存储指的是啊,你的磁盘分区在格式 化的时候是什么系统呢?这个是ext4所以这个地方会显示estfs
Supports d_type: 他是不是支持 d_type。这个d_type是镜像的分层功能 镜像会有好多layer,但是有一个地方一定要注意 docker不支持嗯ext3的分区.如果你是ext3的分区的 话一定起不来。设计ext 3的那些分区的特特性呢,没 有考虑说对docker的支持啊,但 ext 4。是可以完全 支持的
Native : 表示是不是支持文件的对比 diff就是对比文件。 这种对比的话,主要是做这种啊,类似于你的数据在显示数字的 时候。镜像是不能改的对象,一个镜像一旦提升为一个容器之 后,你在容对容器里做的任何操作,它都是写在你的宿主机磁盘 上的一个新的路径并不是直接去修改你的镜像,那这个时候就 会用到这个Native 参数特性了啊,你写完一个新的文件,或者 在容器里产生一个什么数据,这个数据那它会直接拷贝到宿主机 上。
Logging Driver: 它日志的驱动,这个是以json-file的方式保存日志
Cgroup Driver : cgroup它是作为资源限制的
限制cpu的使用情况啊,内存的使用情况等等,我们会限制一个容器。最 多能使用多少CPU?最多能使用多少内存?
我们在继续看下一组
Plucins: 表示插件
Volume :表示这个卷的插件是本地的,数据放在本地的目录里
Network :表示网络类型
bridge 表示桥接的 host表示主机类型的网络 ,k8s用的overlay
Log表示日志类型: 现在用的是 json-file
Swarm:表示是不是支持swam
Runtimes : 它是docker最核心的东西 runc
Init Binary :表示二进制
这个是初始化docker的环境的时候会用到一个二进制。去初始化 叫docker-init,这个也是它默认的啊,
containerd version: 就是他的版本,他和Runc功能相同
在继续看下图
runc version : 这个说的是runc的版本
Security :安全选项都是默认的。做一些审计,等一些功能,这个我们不用管
继续看下图
Kernel Version : 内核版本
Operating System: 系统版本
OS:系统类型是Linux
Architecture : 表示架构是64位
CPUs: 表示有CPU有几个
Toral Meory: 表示内存大小
ID :是自己生成的
Docker Root Dir :
表示这个数据路径,你的docker在产生了一些数据之后,放到什么地方?包括你的定向。也包括你的容器啊,里面产生的这种啊,日志啊,或者是一些用户访问的数据啊
Debug : Debug 模式有没有开
Registry: 默认的镜像仓库
Labels:
Experimental :表示有没有开启这种扩展的这种功能,这个没有开呀。一些扩展属性没有开他那个,
Insecure :表示 他自己的非安全的仓库,这个非安全的镜像仓库就是哎,如果是是你自己搭的啊,
这个仓库他认为是非安全的。那么这个后面我们要加上去,要不然访不了,要不然不能够啊,去下镜像必须得让那个docker信任你的仓库啊,
Live Restore Enable :
表示容器重启的时候呢,保证保持你的容器的存活
这个功能一般都是false 一般都不开啊,我们的docker都重启了,容器肯定重启了,为什么呢?因为docker重启之后,它的ID变了。环境变量变化之后你的。容器的附近层是指向Docker的,如果不敢不重启的话,那这个附近层就乱套了你。ID就都没了,没了之后那些容器啊,就可能会产生这种僵尸进程,所以这个的话一般是FALSE
Warning 表示,不支持交换分区
Docker 配置阿里云镜像加速
镜像加速就是下载镜像的时候,我希望他去国内下载
进入下图的网址
可以用你的阿里云账号登录一下,会得到一个自己的镜像加速地址。在下载镜像的时候的话呢,可以。通过阿里云加速这个时候镜像下的会很快。也包括你公司里装的docker嗯,想从自己的仓库里面去下镜像。都需要去配置
这个地方会有个镜像加速器
那么它会告诉你真正配置的话呢,就不会再直接往docker加了,因为那个加配置文件会越加越多。所以我们会通过同步一个配置文件的方式嗯,去保存docker的配置,
我们来创建这个json文件
写入复制好的内容
下图选中部分是镜像加速器网址
写入配置文件
你重启docker,它就会读取这个配置文件
那这个时候在再通过docker info去看。这个地址就生效了
Docker镜像管理
搜索镜像
在装好docker之后啊,我们这个存储引擎也配好了。那接下来我们肯定要下载一些镜像,包括启动一些容器等等。那怎么下呢?镜像的话,你可以使用docker search去搜索,比如说我要下nginx啊,我们来搜索一下
下载镜像
下载一个mysql 镜像
使用docker pull
导出镜像
使用docker save
这个镜像再导出来之后的话呢,你就可以把它拷到别的服务器,在别的服务器导入了啊,我有另外一台机器但是这个机器不能上网
这个进项怎么分发呢?就这样拷过去再scp,把这个镜像拷到172.31.6.202主机中,你可以把它拷过去。可以把它拷过去。考过去之后的话呢,再把它导进来就可以啊,导进来这种的话呢,
通常适合用于这种离线项目的部署啊,像外包公司啊。或者是一些公司是做这种一些第三方的开发的啊,他会定这些服务,这个服务的话呢,在公司开发好之后,他会打成镜像,打镜像之后考到客户现场再部署。都是通过这样的方式离线部署项目的
我们切换机器看拷贝过去的镜像
这个镜像拷到现场之后,
就是使用docker load。load-i。然后呢?mysql这样的话可以把它打进来。
我们在这样导入镜像就可以了
导进来之后我我这个服务器就可以通过这个镜像去启动服务了。然后进行docker image,查看拷贝过来的镜像
删除镜像
docker images 列出当前主机镜像
使用docker rmi 进行删除 7f这是是mysql ID号
运行容器
docker中最基本的命令就是docker run,这个也是用的最多的一个命令了。docker run运行一个容器,后面的话有些参数啊。-i是标准输入
下图是运行一个容器,我们来解释一下每个参数的含义
docker run:
#运行一个容器
-it :
#-i 标准输入 。你可以从终端上给它输入一些嗯,一些指令啊
#-t 给他分配一个tty
#-d 是运行在后台
--name:
#指定这个容器的名字。这个容器的名字名字可以不起啊,不起的话它会自己命名,
# 而且在k8s里面我们都不会自己命名。k8s中的容器的名字是k8s自己管理的,
所以这个--name的话呢,可能只在单机的时候才会用用得上 k8s从来不用
-p:
#我这个镜像启动了一个容器之后,我肯定是要访问的呀。那访问的话,怎么访问呢?
通过一个参数-p是做端口映 射,那我可以把宿主机的,比如说这个9800啊,
9800映射到容器的80。嗯,冒号左侧是宿主机的端口,右侧是容器端口,
9800:80
#那为什么这个容器我要用上80呢?因为它是nginx。你的nginx镜像,启动一个容器
之后,它默认就会起个服务,这个服务就是80了,
#这个是指的是你容器的那个端口。如果说这个nginx是你自己打的,你把这个镜像的
端口改成了,比如说81啊,或者那个8080。那么,这个地方要求你实际的镜像
启动一个容器中,那个容器的服务的实际的端口号必须这样子写,那么这样的话,
你访问的时候可以访问宿主机的这个端口。那么,宿主机的iptables会把它做一个
目的地址转换啊,转换到这个容器的这个端口。会做目的地址转换,然后呢?
n56-nginx:
#表示启动的镜像,n56-nginx是自己down下来的镜像名字
1.18.0-alpine :
#表示镜像的Tag名
看下图这个运行这个 ready for start up 已经启动了
我们现在来访问一下
目前来说访问自己主机的端口80,80端口是不通的
那你要访问的话,必须访问宿主机的9800,已经可以了