docker基础
Docker历史
2010年,几个搞IT的年轻人,就在美国成立了一家公司dotCloud,做一些pass的云计算服务 !LXC有关的容器技术
他们将自己的技术 容器化技术 进行了一个统一的简化命名,就是Docker
Docker纲诞生的时候是没有引起行业的注意!在激烈的行业竞争下,他们公司就快活不下去了,这个时候呢,他们就想了一个词,叫做 开源【开放源代码】
2013年Docker开源了 !
越来越多的人发现了Docker的优点 然后自然就是火了,Docker每个月都会更新一个版本!
2014年4月9日,Docker1.0发布!
Docker为什么会火呢? 因为它轻巧啊
在容器技术出来之前呢,大家都是用的是虚拟机技术
虚拟机 在windows中,我们需要安装VM,通过这个软件呢,我们可以模拟出来一台乃至多台电脑,但是呢,太笨重了,虚拟机也是属于咱们虚拟化技术Docker其实也是一种虚拟化技术
比如呢 vm linux centos 原生镜像,为了开好几台呢,我们需要开启这个虚拟机,就很占内存
Docker呢,也需要隔离,为了减小体积,这时候它已经不再是一个电脑了,而是最核心的环境,我感觉4m就可以了,这时候这个镜像呢,十分小巧,这时候运行镜像就可以了,秒级启动,就是这么快 !
Docker是什么
Docker简介
Docker属于Linux容器的一种封装,提供简单易用的容器使用接口,它也是目前最流行的Linux容器解决方案。Docker 将软件代码和其依赖,全打包在一个文件中。运行单个文件,就会生成虚拟容器。在这个虚拟容器中,不管本地的操作系统是如何的不同,此容器都能照常运行
Docker的用途
- 提供一次性的环境:本地测试别人的软件、持续集成的时候提供单元测试和构建的环境
- 提供弹性的云服务:因为Docker容器可以随时启动或关闭,所以非常适合动态规划和缩容
- 组建微服务构架:通过多个容器,服务的部署能更加灵活,帮助实现微服务构架
- 不需要虚拟硬件和操作系统,轻量级,占用体积小,启动快
Docker容器和vm区别
- VM:使用Hypervisor提供虚拟机的运行平台,管理每个VM中操作系统的运行。每个VM都要有自己的操作系统、应用程序和必要的依赖文件等
- Docker容器:使用Docker引擎进行调度和隔离,提高了资源利用率,在相同硬件能力下可以运行更多的容器实例;每个容器拥有自己的隔离化用户空间
虚拟机与Docker容器对比
Docker容器是如何工作的
Docker的三大组成要素
- 镜像:Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的配置参数。 镜像不包含任何动态数据,其内容在构建之后也不会被改变。镜像可以用来创建Docker容器,用户可以使用设备上已有的镜像来安装多个相同的Docker容器
- 容器:镜像创建的运行实例,Docker利用容器来运行应用。每个容器都是相互隔离的、保证安全的平台。我们可以把容器看做是一个轻量级的Linux运行环境。
- 镜像仓库:集中存放镜像文件的地方。用户创建完镜像后,可以将其上传到公共仓库或者私有仓库,需要在另一台主机上使用该镜像时,只需要从仓库上下载即可。
Docker运行流程
- Docker客户端:用于和Docker守护进程(Docker Daemon)建立通信的客户端。Docker客户端只需要向Docker服务器或者守护进程发出请求(Docker构建、Docker拉取和Docker启动等指令),服务器或者守护进程将完成所有工作并返回结果
- 如橙色流程所示,执行Docker构建指令会根据Docker文件构建一个镜像存放于本地Docker主机
- 如蓝色流程所示,执行Docker拉取指令会从云端镜像仓库拉取镜像至本地Docker主机或将本地镜像推送至远端镜像仓库
- 如黑色流程所示,执行Docker启动指令会将镜像安装至容器并启动容器
- Docker主机:一个物理或者虚拟的机器用于执行 Docker守护进程和容器
- Docker守护进程:接收并处理Docker客户端发送的请求,监测Docker API的请求和管理Docker对象,比如镜像、容器、网络和数据卷
Docker安装与加速
安装
[root@z yum.repos.d]# curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 100 1919 100 1919 0 0 8416 0 --:--:-- --:--:-- --:--:-- 8453
[root@z yum.repos.d]# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
[root@z ~]# yum -y install docker-ce
[root@z ~]# systemctl enable --now docker.service
Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
Docker常用命令
命令 | 功能 |
---|---|
docker search | 在Docker Hub上搜索映像 |
docker pull | 从镜像仓库中拉取镜像 |
docker images | 查看当前主机上的镜像 |
docker create | 创建一个容器 |
docker start | 启动一个或多个容器 |
docker run | 创建并启动容器 |
docker attach | 连接到一个正在运行的容器,不能执行任何命令,可以使用Ctrl+c退出,但是容器也也会被迫停止 |
docker ps | 列出正在运行的容器 |
docker logs | 查看容器日志 |
docker restart | 重启容器 |
docker stop | 停止一个或多个容器 |
docker kill | 杀死一个或多个正在运行的容器 |
docker rm | 删除一个或多个容器 |
docker exec | 进入到一个正在运行的容器里,可以给容器指定一个终端,执行部分命令 |
docker info | 显示整个docker系统的信息 |
docker inspect | 显示一个容器的的信息 |
docker存储驱动
原理说明
Docker最开始采用AUFS作为文件系统,也得益于AUFS分层的概念,实现了多个Container可以共享同一个image。但由于AUFS未并入Linux内核,且只支持Ubuntu,考虑到兼容性问题,在Docker 0.7版本中引入了存储驱动, 目前,Docker支持AUFS、Btrfs、Device mapper、OverlayFS、ZFS五种存储驱动
写时复制(CoW)
所有驱动都用到的技术——写时复制(CoW)。CoW就是copy-on-write,表示只在需要写时才去复制,这个是针对已有文件的修改场景。比如基于一个image启动多个Container,如果为每个Container都去分配一个image一样的文件系统,那么将会占用大量的磁盘空间。而CoW技术可以让所有的容器共享image的文件系统,所有数据都从image中读取,只有当要对文件进行写操作时,才从image里把要写的文件复制到自己的文件系统进行修改。所以无论有多少个容器共享同一个image,所做的写操作都是对从image中复制到自己的文件系统中的复本上进行,并不会修改image的源文件,且多个容器操作同一个文件,会在每个容器的文件系统里生成一个复本,每个容器修改的都是自己的复本,相互隔离,相互不影响。使用CoW可以有效的提高磁盘的利用率
用时分配(allocate-on-demand)
用时分配是用在原本没有这个文件的场景,只有在要新写入一个文件时才分配空间,这样可以提高存储资源的利用率。比如启动一个容器,并不会为这个容器预分配一些磁盘空间,而是当有新文件写入时,才按需分配新空间
五种存储驱动基本原理
1.AUFS
AUFS(AnotherUnionFS)是一种Union FS,是文件级的存储驱动。AUFS能透明覆盖一或多个现有文件系统的层状文件系统,把多层合并成文件系统的单层表示。简单来说就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。这种文件系统可以一层一层地叠加修改文件。无论底下有多少层都是只读的,只有最上层的文件系统是可写的。当需要修改一个文件时,AUFS创建该文件的一个副本,使用CoW将文件从只读层复制到可写层进行修改,结果也保存在可写层。在Docker中,底下的只读层就是image,可写层就是Container
2、Overlay
Overlay是Linux内核3.18后支持的,也是一种Union FS,和AUFS的多层不同的是Overlay只有两层:一个upper文件系统和一个lower文件系统,分别代表Docker的镜像层和容器层。当需要修改一个文件时,使用CoW将文件从只读的lower复制到可写的upper进行修改,结果也保存在upper层。在Docker中,底下的只读层就是image,可写层就是Container。
3、Device mapper
Device mapper是Linux内核2.6.9后支持的,提供的一种从逻辑设备到物理设备的映射框架机制,在该机制下,用户可以很方便的根据自己的需要制定实现存储资源的管理策略。前面讲的AUFS和OverlayFS都是文件级存储,而Device mapper是块级存储,所有的操作都是直接对块进行操作,而不是文件。Device mapper驱动会先在块设备上创建一个资源池,然后在资源池上创建一个带有文件系统的基本设备,所有镜像都是这个基本设备的快照,而容器则是镜像的快照。所以在容器里看到文件系统是资源池上基本设备的文件系统的快照,并不有为容器分配空间。当要写入一个新文件时,在容器的镜像内为其分配新的块并写入数据,这个叫用时分配。当要修改已有文件时,再使用CoW为容器快照分配块空间,将要修改的数据复制到在容器快照中新的块里再进行修改。Device mapper 驱动默认会创建一个100G的文件包含镜像和容器。每一个容器被限制在10G大小的卷内,可以自己配置调整
4、Btrfs
Btrfs被称为下一代写时复制文件系统,并入Linux内核,也是文件级存储驱动,但可以像Device mapper一直接操作底层设备。Btrfs把文件系统的一部分配置为一个完整的子文件系统,称之为subvolume 。采用 subvolume,一个大的文件系统可以被划分为多个子文件系统,这些子文件系统共享底层的设备空间,在需要磁盘空间时便从底层设备中分配,类似应用程序调用 malloc()分配内存一样。为了灵活利用设备空间,Btrfs 将磁盘空间划分为多个chunk 。每个chunk可以使用不同的磁盘空间分配策略。比如某些chunk只存放metadata,某些chunk只存放数据。这种模型有很多优点,比如Btrfs支持动态添加设备。用户在系统中增加新的磁盘之后,可以使用Btrfs的命令将该设备添加到文件系统中。Btrfs把一个大的文件系统当成一个资源池,配置成多个完整的子文件系统,还可以往资源池里加新的子文件系统,而基础镜像则是子文件系统的快照,每个子镜像和容器都有自己的快照,这些快照则都是subvolume的快照。当写入一个新文件时,在容器的快照里为其分配一个新的数据块,文件写在这个空间里,这个叫用时分配。而当要修改已有文件时,使用CoW复制分配一个新的原始数据和快照,在这个新分配的空间变更数据,变结束再更新相关的数据结构指向新子文件系统和快照,原来的原始数据和快照没有指针指向,被覆盖
5、ZFS
ZFS 文件系统是一个革命性的全新的文件系统,它从根本上改变了文件系统的管理方式,ZFS 完全抛弃了“卷管理”,不再创建虚拟的卷,而是把所有设备集中到一个存储池中来进行管理,用“存储池”的概念来管理物理存储空间。过去,文件系统都是构建在物理设备之上的。为了管理这些物理设备,并为数据提供冗余,“卷管理”的概念提供了一个单设备的映像。而ZFS创建在虚拟的,被称为“zpools”的存储池之上。每个存储池由若干虚拟设备(virtual devices,vdevs)组成。这些虚拟设备可以是原始磁盘,也可能是一个RAID1镜像设备,或是非标准RAID等级的多磁盘组。于是zpool上的文件系统可以使用这些虚拟设备的总存储容量
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通