type
status
date
slug
summary
tags
category
icon
password
一、概念
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker在狭义上来说就是一个进程,在广义上的说法是一个虚拟容器——应用容器(Application Container)。Docker进程和普通进程并无任何区别,就是一个普通的应用进程,是用来操作镜像文件的。所以Docker进程+构建的应用镜像文件就等于Docker容器。
1.1 Docker的应用场景
- Web 应用的自动化打包和发布。
- 自动化测试和持续集成、发布。
- 在服务型环境中部署和调整数据库或其他的后台应用。
- 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
1.2 与虚拟机的比较
![notion image](https://ossfile.zhulinz.top/images/202309151516252.jpeg?t=5652a0ac-9f4c-4de7-a495-e6afc4cd00d1)
Docker相对虚拟机的优点:
- 启动速度快,容器启动本质就是一个开启一个进程而已,因此都是秒启,而 VM 通常要更久。
- 资源利用率高,一台普通 PC 可以跑成百上千个容器,你跑十个 VM 试试。
- 性能开销小, VM 通常需要额外的 CPU 和内存来完成 OS 的功能,这一部分占据了额外的资源。
1.3、Docker的基本组成
- 镜像:Docker 镜像是一个预配置的、可移植的、可重复使用的应用程序环境。它包含运行应用程序所需的软件、库、配置和其他依赖项。Docker 镜像由 Dockerfile 文件定义,可以使用 Dockerfile 文件来构建和定制镜像。
- 容器:Docker 容器是 Docker 镜像的运行实例。容器可以运行在 Docker 主机上,也可以在不同的主机之间进行迁移。容器是 Docker 的核心功能,它们提供了隔离和可移植性。
- 仓库:Docker 仓库是一个存储和管理 Docker 镜像的中央存储库。您可以使用 Docker 仓库来共享和分发您的应用程序镜像。
二、Docker的安装配置
2.1 安装
2.1.1 卸载旧版本
![notion image](https://ossfile.zhulinz.top/images/202311151324565.png?t=6977930d-2a58-4bc2-a6d2-f5e18b03909b)
2.1.2 安装yum工具
![notion image](https://ossfile.zhulinz.top/images/202311151326648.png?t=97701abf-01ea-473a-ba78-d7f621680af9)
2.1.3 设置镜像仓库地址
- 官方默认的镜像仓库
- 阿里云镜像仓库
![notion image](https://ossfile.zhulinz.top/images/202311151328404.png?t=3a218440-7558-4c06-870f-70c20f70b5f7)
2.1.4 开始安装Docker
安装前建议先将将服务器上的软件包信息现在本地缓存,以提高安装软件的速度
![notion image](https://ossfile.zhulinz.top/images/202311151330441.png?t=d912897e-64aa-438a-af21-ef9792fb0c92)
![notion image](https://ossfile.zhulinz.top/images/202311151330696.png?t=522a382c-8986-4fd6-935e-5ff636e5331a)
2.1.5 启动Docker
2.1.6 阿里云镜像加速
2.1.7 运行Hello World映像测试
2.2 卸载
2.2.1 卸载Docker依赖
2.2.2 删除Docker资源
三、Docker的常用命令
镜像管理
容器管理
网络管理
数据管理
四、Docker run的流程和底层原理
底层原理
- Docker是一个 Client-Server结构的系统,Docker的守护进程运行在主机上,通过Socker从客户端访问
- DockerServer接收到DockerClient的指令,就会执行这个命令
![notion image](https://ossfile.zhulinz.top/images/202309151632828.png?t=6eac2843-4296-46f9-8e01-9b1e10dd40a4)
Docker为什么比VM快
![notion image](https://ossfile.zhulinz.top/images/202309151632119.png?t=07d88f18-6e9b-42e3-bbe7-8e075da5bda5)
- Docker有着比虚拟机更少的抽象层,由于Docker不需要Hypervisor实现硬件资源虚拟化,运行在Docker容器上的程序直接使用的都是实际物理机的硬件资源,因此在Cpu、内存利用率上Docker将会在效率上有明显优势。
- Docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,Docker不需要和虚拟机一样重新加载一个操作系统,避免了引导、加载操作系统内核这个比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载Guest OS,这个新建过程是分钟级别的,而Docker由于直接利用宿主机的操作系统则省略了这个过程,因此新建一个Docker容器只需要几秒钟。
ㅤ | Docker容器 | 虚拟机(VM) |
操作系统 | 与宿主机共享OS | 宿主机OS上运行宿主机OS |
存储大小 | 镜像小,便于存储与传输 | 镜像庞大(vmdk等) |
运行性能 | 几乎无额外性能损失 | 操作系统额外的cpu、内存消耗 |
移植性 | 轻便、灵活、适用于Linux | 笨重、与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
五、Docker镜像讲解
镜像是什么
镜像是一种轻量级,可执行的软件包,用来打包软件运行环境和基于运行软件开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。所有的应用,直接打包成docker镜像,就可以直接跑起来
Docker镜像加载原理
UnionFS(联合文件系统):一种分层、轻量级且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不通目录挂载到同一个虚拟文件系统下(unite serveral directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础,镜像可以通过分层来继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。 特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker 的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是 UnionFS 。
bootfs(boot file system)主要包含bootloader和kernel,bootloader主要是引导加载kerel,Linux刚启动时会加载 bootfs文件系统,在Docker镜像的最底层时bootfs。这一层与我们典型的Linux/Unix内核是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs
rootfs(root file system)在bootfs之上,包含的就是典型的 Linux系统中的 /dev、/proc、/bin、/etc 等标准文件。rootfs 就是各种不同的操作系统发行版。
![notion image](https://ossfile.zhulinz.top/images/202309151647756.png?t=5c204af4-15fd-4db2-9dd7-46cbbb07ef19)
平时安装的虚拟机的CentOS都是好几个G,为什么Docker中才200MB?
![notion image](https://ossfile.zhulinz.top/images/202309151650910.png?t=267c8a48-1994-4c41-a725-05d4a0495e71)
对于一个精简的 OS,rootfs 可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为底层使用的是主机的Kernel,自己只需要提供rootfs就可以了。由此可见,对于不同linux发行版,bootfs是基本一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。
分层理解
当我们下载一个镜像的时候,可以看到,是一层一层的在下载!
![notion image](https://ossfile.zhulinz.top/images/202309151650480.png?t=ea4e9daa-626f-4d9c-8293-8a1c6184c7f6)
资源共享:如果有多个镜像从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有的容器服务,且每一层的镜像都可以被共享。
理解
- 所有的 Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上创建新的镜像层
- 举一个简单的例子,假如基于 Ubuntu Linux 16.04 创建一个新的镜像,这就是新镜像的第一层;如果要在该镜像中添加python包,就会在基础镜像层之上创建了新的一个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层
![notion image](https://ossfile.zhulinz.top/images/202309151650813.png?t=ba52241d-df41-46f3-adfc-580ce9c35b79)
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。下图中举了一个简单的例子,每个镜像层包含 3 个文件,而镜像包含了来自两个镜像层的 6 个文件
![notion image](https://ossfile.zhulinz.top/images/202309151650402.png?t=ab02032e-1356-4b5b-82e3-3f10c12887d6)
上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。 下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有 6 个文件,这是因为最上层中的文件7 是文件 5 的一个更新版本
![notion image](https://ossfile.zhulinz.top/images/202309151650224.png?t=d0cec95f-42df-44a8-bff2-c034faa2d283)
- 这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
- Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统一的文件系统。
- Linux 上可用的存储引擎有 AUFS、Overlay2、Device Mapper、Btrfs 以及 ZFS。顾名思义,每种存储引擎都基于 Linux 中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。
- Docker 在 Windows 上仅支持 windowsfilter 一种存储引擎,该引擎基于 NTFS 文件系统之上实现了分层和 CoW[1]。
- 下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。
![notion image](https://ossfile.zhulinz.top/images/202309151650084.png?t=78856d09-cb73-4341-b899-f49396dc35e2)
特点
Docker镜像都是只读的,当容器启动时,一个新的可写层被加载到镜像的顶部!这一层就是我们通常说的容器层,容器之下的都叫镜像层!
![notion image](https://ossfile.zhulinz.top/images/202309151650414.png?t=45b6788c-e216-4a87-b5e8-99b97b236ca6)
Commit镜像
当我们通过镜像启动一个容器时,分为了两层:容器层和镜像层;镜像层是可读的,容器层可写,我们的所有操作都是基于容器层,当我们对容器层修改完后,就可以再将修改后的容器层和不变的镜像曾一起打包成一个新的镜像,也就是本节要讲的Commit镜像
- Author:拾荒😂
- URL:https://blog.zhulinz.top//article/docker-1
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!