Docker的本质

当我们通过本地开发镜像打包到LXC中的时候,就会发现总是缺少一些必要的内容,比如JDK或者其他的文件什么的。此时镜像打包技术就非常关键。将操作系统,运行环境,应用程序/配置文件等都打包进去。

Docker 本质其实是 LXC 之类的增强版,它本身不是容器,而是容器的易用工具。容器是 linux 内核中的技术,Docker 只是把这种技术在使用上简易普及了。Docker 在早期的版本其核心就是 LXC 的二次封装发行版。Docker 作为容器技术的一 实现,或者说让容器技术普及开来的最成功的实现。
Docker 是基于 Go 语言实现的一个开源项目,它的主要目标是 "Build,Ship and Run Any APP,Anywhere",即通过对组件的封装、分发、部署、运行等生命周期的管理,使得用户的应用及其运行环境能够做到 "一次封装,到处运行"。
早期 Docker 利用 LXC 做容器管理引擎,但是在创建容器时,不再使用模板去安装生成,而是通过镜像技术(把一个操作系统用户空间所需要使用到的组件事先编排好,并整体打包成一个文件,image 文件),镜像文件集中放在一个仓库中。当需要创建容器时,Docker 调用 LXC 的工具 lxc - create,但不再通过 lxc 的模板去安装,而是连接到镜像服务器上下载匹配的镜像文件,而后基于镜像启动容器。所以,Docker 极大的简化了容器的使用难度。以后我们创建启动容器,只需要一个命令,docker - run,docker - stop 就可以启动停止一个容器了。
LXC创建的时候是基于LXC模板进行创建的,docker发明了镜像,镜像存储在docker自己的仓库中,想要这个镜像的时候,我们只要安装就可以了。
当前docker引擎使用的是RUNC。
传统虚拟机 | Docker 容器 |
---|
|----------|----------------------------------|------------------------------|
| 磁盘占用 | 几个 GB 到几十个 GB 左右 | 几十 MB 到几百 MB 左右 |
| CPU 内存占用 | 虚拟操作系统非常占用 CPU 和内存,需要通过虚拟层调用占用率高 | Docker 引擎占用资源极低,直接作用于硬件资源占用少 |
| 启动速度 | (从开机到运行项目)几分钟 | (从开启容器到运行项目)几秒 |
| 安装管理 | 需要专门的运维技术 | 安装、管理方便 |
docker容器共享虚拟机内核,就可以进行内部的资源利用。

容器不经过虚拟化层直接与底层进行交互,容器没有guest os。
docker相对于虚拟机的优势
docker 有比虚拟机更少的抽象层(直接操作物理机的硬件资源,虚拟机需要虚拟化层)。docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 docker 容器上的程序直接使用的是实际物理机的硬件资源。因此在 cpu、内存利用率上 docker 将会在效率上有明显的优势。docker 利用的是宿主机的内核,而不需要 Guest OS,节省了 Guest OS 占用的资源。
docker 不需要 Guest OS,创建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。从而避免引导、加载操作系统内核返回时耗时耗资源的过程,当新建一个虚拟机时,虚拟机软件需要加载 Guest OS,返回新建过程是分钟级别的。而新建一个 docker 容器只需要几秒钟。
Docker版本
Docker 发展过程中衍生了以下版本,目前我们学习和使用提到的版本是 docker - ce。
lxc: 上文中提到,lxc 是最早的 linux 容器技术,早期版本的 docker 直接使用 lxc 来实现容器的底层功能。虽然使用者相对较少,但 lxc 项目仍在持续开发演进中。
libcontaine r:docker 从 0.9 版本开始自行开发了 libcontainer 模块来作为 lxc 的替代品实现容器底层特性,并在 1.10 版本彻底去除了 lxc。在 1.11 版本拆分出 runc 后,libcontainer 也随之成为了 的核心功能模块,runc 后续变成了容器标准。
moby: moby 是 docker 公司发起的开源项目,其中最主要的部分就是同名组件 moby,事实上这个 moby 就是 dockerd 目前使用的开源项目名称,docker 项目中的 engine(dockerd)仓库现在就是从 moby 仓库 fork 而来的,使用 containerd 作为运行时标准。https://mobyproject.org/
docker - ce: docker 的开源版本,CE 指 Community Edition。docker - ce 中的组件来自于 moby、containerd 等其他项目。https://www.docker.com/pricing/
docker - ee: docker 的收费版本,EE 指 Enterprise Edition。其基础组件来源和 docker - ce 是一样的,但附加了一些其他的组件和功能。
https://www.docker.com/pricing/
Docker架构
当我们在Client上面运行命令的时候,host接到client的命令,然后运行该命令,如果想要拉取镜像的话,发现host中没有该镜像,就从远程registry中拉取该镜像,然后安装到本地,即可使用。
Docker安装
ubuntu安装docker
首先通过命令行查看该操作系统的版本。
cat /etc/*release*


安装之前要通过docker查看该服务器上面是否已经安装了docker,如果已经安装了就要卸载。
#卸载docker命令1 apt-get remove docker docker-engine docker.io containerd runc
#卸载docker命令2 sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin docker-ce-rootless-extras -y

并且还要删除对应的目录,实际上还需要卸载一些配置文件。但是这个配置文件可以放在后面再卸载。
Shell执行安装逻辑如下
#curl 命令安装
sudo apt install curl -y
# 创建 gpg key 目录
sudo mkdir -m 0755 -p /etc/apt/keyrings
# 下载 gpg key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg
#最后执行命令
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
#更新源
apt update
#安装开始
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
#最后设置开机启动
systemctl enable docker
ubuntu安装docker实战经验
docker有个全球最大的镜像仓库,但是为了国内能够更快访问docker,我们就创建出docker的国内镜像,能够更快访问。

进入daemon.json文件,并且修改镜像源为如下:

systemctl daemon-reload
systemctl restart docker
当docker安装很多镜像很容易导致磁盘爆满,所以我们要进行迁移。先创建目录。


{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"],
"data-root": "/data/var/lib/docker"
}
最后我们需要进行加载目录,并且重启docker。此时就已经在ubuntu上面安装完docker。
Docker镜像仓库

这里包括了元数据和blob,元数据就描述了这个镜像的架构,占的多少磁盘空间等信息。
镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。
镜像仓库管理多个 Repository,Repository 通过命名来区分。每个 Repository 包含一个或多个镜像,镜像通过镜像名称和标签 (Tag) 来区分。
镜像仓库的分类
按是否对外开放划分,也是研发人员常说的
(1)公有仓库:像阿里云、dockerhub 等放到公有网络上,不用登录就可以下载镜像,供大家访问使用
(2)私有仓库:不对外开放,往往位于私有网络,只有公司内部人员可以使用。
按供应商和面向群体划分
- (1) sponsor(赞助) registry:第三方的 registry,供客户和 docker 社区版使用
- (2) mirror (镜像) registry:第三方的 registry,只让客户使用,例如阿里云必须注册才能使用
- (3) vendor (供应商) registry:由发布 docker 镜像的供应商提供的 registry,例如像 Google 和 Redhat 提供了镜像仓库服务
- (4) private registry:通过没有防火墙和额外的安全层的私有实体提供的 registry,仅供内部使用

常用镜像仓库
docker hub的地址为Docker Hub Container Image Library | App Containerizationhttps://hub.docker.com/
我们也可以搭建自己的私服仓库,比如Nexus,或者Harbor,docker registry(不推荐)。

可以通过该命令进行查看当前本地镜像的详细信息。