一,介绍
Docker是一种开源的容器化平台,可用于构建、部署和运行应用程序。它使用容器技术,将应用程序及其依赖项打包在一个独立的、可移植的容器中,以便在不同的环境中运行。
Docker的主要用途包括:(一次构建、随处运行 )
1. 应用程序的快速部署和交付:Docker可以将应用程序及其依赖项打包成一个独立的容器,使应用程序在不同的环境中具有一致的运行方式,简化了应用程序的部署和交付过程。
2. 资源的高效利用:Docker可以在宿主机上运行多个独立的容器,每个容器都是相互隔离的,可以有效地利用宿主机的资源,提高资源利用率。
3. 环境的一致性:Docker容器包含了应用程序及其依赖项,可以确保在不同的环境中容器的运行结果一致,避免了由于环境差异导致的问题。
4. 快速扩展和弹性伸缩:Docker可以快速创建和销毁容器,使应用程序的扩展和伸缩更加灵活和快速,可以根据需求动态地调整容器的数量。
5. 简化开发环境的配置:Docker可以将开发环境打包成容器,使开发者可以在不同的机器上快速搭建相同的开发环境,提高开发效率。
Docker的作用原理如下:
1. 镜像(Image):Docker使用镜像作为容器的基础,镜像是一个只读的文件系统,包含了运行应用程序所需的所有文件和配置。镜像可以通过Dockerfile定义,也可以从Docker Hub等镜像仓库中获取。
2. 容器(Container):容器是从镜像创建的一个运行实例,它是一个独立的、可执行的应用程序。容器与宿主机之间共享操作系统内核,但彼此之间是相互隔离的,每个容器都有自己的文件系统、进程空间和网络接口。
3. Docker引擎(Docker Engine):Docker引擎是Docker的核心组件,它负责管理和运行容器。它包括了Docker守护进程(Docker Daemon)和Docker客户端(Docker Client)。Docker守护进程负责管理容器的生命周期、资源分配和网络配置等,而Docker客户端则提供了与Docker守护进程进行交互的命令行工具或API。
4. Docker网络(Docker Networking):Docker提供了一种灵活的网络模型,可以创建多种类型的网络,如桥接网络、主机网络和覆盖网络等。这些网络可以连接不同的容器,实现容器之间的通信和网络访问。
5. Docker存储(Docker Storage):Docker提供了多种存储驱动,用于管理容器的持久化数据。它可以将容器的数据保存在宿主机的文件系统、网络存储或云存储中。
二,安装
-
前提条件
-
目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上,要求系统为64位、Linux系统内核版本为 3.8以上,这里选用Centos7.x
-
-
查看自己的内核
-
uname命令用于打印当前系统相关信息(内核版本号、硬件架构、主机名称和操作系统类型等)。uname -r
-
1.基本组成
-
镜像(image)
-
Docker 镜像(Image)就是一个只读的模板。镜像可以用来创建 Docker 容器,一个镜像可以创建很多容器。它也相当于是一个root文件系统。比如官方镜像 centos:7 就包含了完整的一套 centos:7 最小系统的 root 文件系统。相当于容器的“源代码”,docker镜像文件类似于Java的类模板,而docker容器实例类似于java中new出来的实例对象。
-
容器与镜像的关系就像面向对象编程中的对象和类
Docker 面向对象 镜像 类 容器 对象
-
-
容器(container)
-
从面向对象角度,Docker 利用容器(Container)独立运行的一个或一组应用,应用程序或服务运行在容器里面,容器就类似于一个虚拟化的运行环境,容器是用镜像创建的运行实例。就像是Java中的类和实例对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器为镜像提供了一个标准的和隔离的运行环境,它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
-
从镜像容器角度,可以把容器看做是一个简易版的 Linux 环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
-
-
仓库(repository)
-
仓库(Repository)是集中存放镜像文件的场所。
-
类似于:
-
Maven仓库,存放各种jar包的地方;
-
github仓库,存放各种git项目的地方;
-
Docker公司提供的官方registry被称为Docker Hub,存放各种镜像模板的地方。
-
-
仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
-
最大的公开仓库是 Docker Hub(https://hub.docker.com/)
-
存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云 、网易云等
-
-
小总结
-
需要正确的理解仓库/镜像/容器这几个概念:
-
Docker 本身是一个容器运行载体或称之为管理引擎。我们把应用程序和配置依赖打包好形成一个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成Docker容器实例(类似Java中new出来一个对象)。
-
image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
-
-
镜像文件
-
image文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
-
-
容器实例
-
一个容器运行一种服务,当我们需要的时候,就可以通过docker客户端创建一个对应的运行实例,也就是我们的容器
-
-
仓库
-
就是放一堆镜像的地方,我们可以把镜像发布到仓库中,需要的时候再从仓库中拉下来就可以了。
-
-
2.基本步骤
Install Docker Engine on CentOS | Docker Docs -----帮助文档
-
卸载旧版本
yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine
-
yum安装gcc相关
-
CentOS7能上外网
-
yum -y install gcc
-
yum -y install gcc-c++
-
-
安装需要的软件包
yum install -y yum-utils
-
设置stable镜像仓库
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
-
更新yum 软件包索引
yum makecache fast
-
安装DOCKER CE
yum install docker-ce docker-ce-cli containerd.io
-
启动docker
systemctl start docker
-
测试
-
docker version
-
docker run hello-world
-
-
卸载
-
systemctl stop docker
-
yum remove docker-ce docker-ce-cli containerd.io
-
rm -rf /var/lib/docker
-
rm -rf /var/lib/containerd
-
3.添加加速器
是什么
注册一个属于自己的阿里云账户(可复用淘宝账号)
获得加速器地址连接
-
登陆阿里云开发者平台
-
点击控制台
-
选择容器镜像服务
-
获取加速器地址,如:https://ifr3l35w.mirror.aliyuncs.com
粘贴脚本直接执行
# 您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器 mkdir -p /etc/docker tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://ifr3l35w.mirror.aliyuncs.com"] } EOF
重启服务器
sudo systemctl daemon-reload sudo systemctl restart docker
4.运行原理
为什么Docker会比VM虚拟机快
-
docker有着比虚拟机更少的抽象层
-
由于docker不需要Hypervisor(虚拟机)实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
-
-
docker利用的是宿主机的内核,而不需要加载操作系统OS内核
-
当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。进而避免引寻、加载操作系统内核返回等比较费时费资源的过程,当新建一个虚拟机时,虚拟机软件需要加载OS,返回新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了返回过程,因此新建一个docker容器只需要几秒钟。
-
四,常用命令
1.帮助启动类
-
启动docker: systemctl start docker
-
停止docker: systemctl stop docker
-
重启docker: systemctl restart docker
-
查看docker状态: systemctl status docker
-
开机启动: systemctl enable docker
-
查看docker概要信息: docker info
-
查看docker总体帮助文档: docker --help
-
查看docker命令帮助文档: docker 具docker 体命令 --help
2.镜像命令
-
docker images
-
列出本地主机上的镜像(选项说明)
-
REPOSITORY:表示镜像的仓库源
-
TAG:镜像的标签版本号
-
IMAGE ID:镜像ID
-
CREATED:镜像创建时间
-
SIZE:镜像大小
同一仓库源可以有多个 TAG版本,代表这个仓库源的不同个版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。
-
-
OPTIONS说明:
-
-a :列出本地所有的镜像(含历史映像层)
-
-q :只显示镜像ID。
-
-
-
docker search 某个XXX镜像名字
-
命令:docker search [OPTIONS] 镜像名字
-
案例:docker search redis
-
NAME:镜像名称
-
DESCRIPTION:镜像说明
-
STARS:点赞数量
-
OFFICIAL:是否官方的
-
AUTOMATED:是否是自动构建的
-
-
OPTIONS说明:
-
--limit : 只列出N个镜像,默认25个
-
docker search --limit 5 redis
-
-
docker pull 某个XXX镜像名字
-
目的:下载镜像
-
docker pull 镜像名字[:TAG]
-
docker pull 镜像名字
-
没有TAG就是最新版,等价于docker pull 镜像名字:latest
-
-
-
docker system df 查看镜像/容器/数据卷所占的空间
-
docker rmi 某个XXX镜像名字ID
-
目的:删除镜像
-
删除单个:docker rmi -f 镜像ID
-
删除多个:docker rmi -f 镜像名1:TAG 镜像名2:TAG
-
删除全部:docker rmi -f $(docker images -qa)
-
3.容器命令
-
新建+启动容器
-
docker run [OPTIONS] IMAGE COMMAND
-
OPTIONS说明(出现问题注意命令顺序)
-
OPTIONS说明(常用):有些是一个减号,有些是两个减号
-
--name="容器新名字" 为容器指定一个名称;
-
-d: 后台运行容器并返回容器ID,也即启动守护式容器(后台运行);
-
-i:以交互模式运行容器,通常与 -t 同时使用;
-
-t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;也即启动交互式容器(前台有伪终端,等待交互);
-
-P: 随机端口映射,大写P
-
-p: 指定端口映射,小写p
参数 说明 -p hostPort:containerPort 端口映射 -p 8080:80 -p ip:hostPort:containerPort 配置监听地址 -p 10.0.0.100:8080:80 -p ip::containerPort 随机分配端口 -p 10.0.0.100::80 -p hostPort:containerPort:udp 指定协议 -p 8080:80:tcp -p 81:80 -p 443:443 指定多个 -
启动交互式容器(前台命令行)
-
docker images
-
docker run -it centos /bin/bash
-
-
-
-
列出当前所有正在运行的容器
-
docker ps [OPTIONS]
-
-a :列出当前所有正在运行的容器+历史上运行过的
-
-l :显示最近创建的容器。
-
-n:显示最近n个创建的容器。
-
-q :静默模式,只显示容器编号。
-
-
-
启动已停止运行的容器
-
docker start 容器ID或者容器名
-
-
重启容器
-
docker restart 容器ID或者容器名
-
-
停止容器
-
docker stop 容器ID或者容器名
-
-
强制停止容器
-
docker kill 容器ID或容器名
-
-
删除已停止的容器
-
docker rm 容器ID
-
一次性删除多个容器实例
-
docker rm -f $(docker ps -a -q)
-
docker ps -a -q | xargs docker rm
-
-
-
重要
-
有镜像才能创建容器,这是根本前提(下载一个Redis6.0.8镜像演示)
-
启动守护式容器(后台服务器)
-
在大部分的场景下,我们希望 docker 的服务是在后台运行的,我们可以过 -d 指定容器的后台运行模式。
使用镜像centos:latest以后台模式启动一个容器
docker run -d centos
问题:然后docker ps -a 进行查看, 会发现容器已经退出 很重要的要说明的一点: Docker容器后台运行,就必须有一个前台进程. 容器运行的命令如果不是那些一直挂起的命令(比如运行top,tail),就是会自动退出的。
这个是docker的机制问题,比如你的web容器,我们以nginx为例,正常情况下,我们配置启动服务只需要启动响应的service即可。例如service nginx start但是,这样做,nginx为后台进程模式运行,就导致docker前台没有运行的应用,这样的容器后台启动后,会立即自杀因为他觉得他没事可做了.所以,最佳的解决方案是,将你要运行的程序以前台进程的形式运行,常见就是命令行模式,表示我还有交互操作,别中断。
-
docker run -d 容器名
-
redis 前后台启动演示case
-
前台交互式启动:docker run -it redis:6.0.8
-
后台守护式启动:docker run -d redis:6.0.8
-
-
-
查看容器日志
-
docker logs 容器ID
-
-
查看容器内运行的进程
-
docker top 容器ID
-
-
查看容器内部细节
-
docker inspect 容器ID
-
-
进入正在运行的容器并以命令行交互
-
docker exec -it 容器ID bashShell
-
重新进入docker attach 容器ID
-
案例演示,用centos或者unbuntu都可以
-
上述两个区别
-
attach 直接进入容器启动命令的终端,不会启动新的进程用exit退出,会导致容器的停止。
-
exec 是在容器中打开新的终端,并且可以启动新的进程用exit退出,不会导致容器的停止。
-
推荐大家使用 docker exec 命令,因为退出容器终端,不会导致容器的停止。
-
用之前的redis容器实例进入试试
-
进入redis服务
-
docker exec -it 容器ID /bin/bash
-
docker exec -it 容器ID redis-cli
-
一般用-d后台启动的程序,再用exec进入对应容器实例
-
-
-
-
-
从容器内拷贝文件到主机上
-
容器→主机
-
docker cp 容器ID:容器内路径 目的主机路径
-
-
4.镜像commit操作案例
-
docker commit提交容器副本使之成为一个新的镜像
-
docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名]
-
案例演示ubuntu安装vim
-
从Hub上下载ubuntu镜像到本地并成功运行
-
原始的默认Ubuntu镜像是不带着vim命令的
[root@51143a3abecf /]# vim bash: vim: command not found
-
外网连通的情况下,安装vim
yum install vim
如果碰到以下问题:Failed to download metadata for repo ‘AppStream’ Error: Failed to download metadata for repo ‘AppStream’
因为centOS8于2021年12月31日停止了源的服务,而现在时间是2022年2月10日,所以之前的方法都不行的原因所在(本质是源的问题)。
解决办法:
cd /etc/yum.repos.d/ sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* yum update -y
-
安装完成后,commit我们自己的新镜像
[root@iZ2ze2rikqlh3ql1n2cw61Z yum.repos.d]# docker commit -m="add vim cmd" -a="renzhe" 51143a3abecf chenxin/mycentos:1.1 sha256:48faf74abbfa82dc9de8d893df616438faa5e2b1e4f8f3bf0282d7cd42bfe516 [root@iZ2ze2rikqlh3ql1n2cw61Z yum.repos.d]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE renzhe/mycentos 1.1 48faf74abbfa 25 seconds ago 559MB tomcat latest fb5657adc892 9 months ago 680MB redis latest 7614ae9453d1 9 months ago 113MB hello-world latest feb5d9fea6a5 12 months ago 13.3kB centos latest 5d0da3dc9764 12 months ago 231MB
-
5.上传到阿里云
-
本地镜像素材类型
[root@iZ2ze2rikqlh3ql1n2cw61Z yum.repos.d]# docker images chenxin/mycentos REPOSITORY TAG IMAGE ID CREATED SIZE renzhe/mycentos 1.1 48faf74abbfa 16 minutes ago 559MB
-
阿里云开发者平台
-
创建镜像仓库
-
选择控制台,进入容器镜像服务
-
选择个人实例
-
命名空间—继续
-
仓库名称—继续
-
进入管理界面获得脚本
-
-
将镜像推送到阿里云(按官方给的案例执行即可)
-
将镜像推送到阿里云registry
-
管理界面脚本
-
脚本实例
-
#1. 登录阿里云Docker Registry $ docker login --username=yunfei.ji@aliyun.com registry.cn-hangzhou.aliyuncs.com #用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码。 #您可以在访问凭证页面修改凭证密码。 #2. 从Registry中拉取镜像 $ docker pull registry.cn-hangzhou.aliyuncs.com/douluodalu/qibaoliulizong:[镜像版本号] #3. 将镜像推送到Registry $ docker login --username=yunfei.ji@aliyun.com registry.cn-hangzhou.aliyuncs.com $ docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/douluodalu/qibaoliulizong:[镜像版本号] $ docker push registry.cn-hangzhou.aliyuncs.com/douluodalu/qibaoliulizong:[镜像版本号] #请根据实际镜像信息替换示例中的[ImageId]和[镜像版本号]参数。 #4. 选择合适的镜像仓库地址 #从ECS推送镜像时,可以选择使用镜像仓库内网地址。推送速度将得到提升并且将不会损耗您的公网流量。 #如果您使用的机器位于VPC网络,请使用 registry-vpc.cn-hangzhou.aliyuncs.com 作为Registry的域名登录。 #5. 示例 #使用"docker tag"命令重命名镜像,并将它通过专有网络地址推送至Registry。 $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE registry.aliyuncs.com/acs/agent 0.7-dfb6816 37bb9c63c8b2 7 days ago 37.89 MB $ docker tag 37bb9c63c8b2 registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816 #使用 "docker push" 命令将该镜像推送至远程。 $ docker push registry-vpc.cn-hangzhou.aliyuncs.com/acs/agent:0.7-dfb6816
-
-
将阿里云上的镜像下载到本地
#2. 从Registry中拉取镜像 $ docker pull registry.cn-hangzhou.aliyuncs.com/douluodalu/qibaoliulizong:[镜像版本号]
6.本地镜像发布到私有库
6.1、是什么
-
官方Docker Hub地址:https://hub.docker.com/,中国大陆访问太慢了且准备被阿里云取代的趋势,不太主流。
-
Dockerhub、阿里云这样的公共镜像仓库可能不太方便,涉及机密的公司不可能提供镜像给公网,所以需要创建一个本地私人仓库供给团队使用,基于公司内部项目构建镜像。
-
Docker Registry是官方提供的工具,可以用于构建私有镜像仓库
6.2、将本地镜像推送到私有库
6.2.1、下载镜像Docker Registry
[root@iZ2ze2rikqlh3ql1n2cw61Z local]# docker pull registry Using default tag: latest latest: Pulling from library/registry 79e9f2f55bf5: Pull complete 0d96da54f60b: Pull complete 5b27040df4a2: Pull complete e2ead8259a04: Pull complete 3790aef225b9: Pull complete Digest: sha256:169211e20e2f2d5d115674681eb79d21a217b296b43374b8e39f97fcf866b375 Status: Downloaded newer image for registry:latest docker.io/library/registry:latest
6.2.2、运行私有库Registry,相当于本地有个私有Docker hub
# 默认情况,仓库被创建在容器的/usr/local/myregistry/目录下,建议自行用容器卷映射,方便于宿主机联调 [root@iZ2ze2rikqlh3ql1n2cw61Z local]# docker run -d -p 5000:5000 -v /usr/local/myregistry/:/tmp/registry --privileged=true registry ab87e780b72e89abe7f5181283edd63813800f495cba58fd09ef0fd12cec92bd
查看镜像:
6.2.3、案例演示创建一个新镜像,ubuntu安装ifconfig命令
-
从Hub上下载ubuntu镜像到本地并成功运行
[root@iZ2ze2rikqlh3ql1n2cw61Z local]# docker run -it ubuntu /bin/bash Unable to find image 'ubuntu:latest' locally latest: Pulling from library/ubuntu 7b1a6ab2e44d: Pull complete Digest: sha256:626ffe58f6e7566e00254b638eb7e0f3b11d4da9675088f4781a50ae288f3322 Status: Downloaded newer image for ubuntu:latest
-
原始的Ubuntu镜像是不带着ifconfig命令的
root@52690518b4c3:/# ifconfig bash: ifconfig: command not found
-
外网连通的情况下,安装ifconfig命令并测试通过
apt-get update apt-get install net-tools ifconfig
-
安装完成后,commit我们自己的新镜像
# docker commit -m="提交的描述信息" -a="作者" 容器ID 要创建的目标镜像名:[标签名] # 命令:在容器外执行,记得 [root@iZ2ze2rikqlh3ql1n2cw61Z local]# docker commit -m="ifconfig cmd add" -a="renzhe.zz" ab87e780b72e renzheubuntu:1.2 sha256:4c8297d97b9c7fabfcca447dc36f11a003bf7893299bdea5917372c377681969
[root@iZ2ze2rikqlh3ql1n2cw61Z local]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE renzheubuntu 1.2 4c8297d97b9c 40 seconds ago 26.2MB renzhe/mycentos 1.1 48faf74abbfa 55 minutes ago 559MB registry.cn-hangzhou.aliyuncs.com/douluodalu/qibaoliulizong 1.1 48faf74abbfa 55 minutes ago 559MB tomcat latest fb5657adc892 9 months ago 680MB redis latest 7614ae9453d1 9 months ago 113MB registry latest b8604a3fe854 10 months ago 26.2MB ubuntu latest ba6acccedd29 11 months ago 72.8MB hello-world latest feb5d9fea6a5 12 months ago 13.3kB centos latest 5d0da3dc9764 12 months ago 231MB
-
启动我们的新镜像并和原来的对比
[root@iZ2ze2rikqlh3ql1n2cw61Z local]# docker commit -m="ifconfig cmd add" -a="yunfeiji" ab87e780b72e renzheubuntu222:1.2 sha256:cdd9732578cd5b44ad57702a2122c8e71503bdf99674f5dcd1adb6d2a62b6730
[root@iZ2ze2rikqlh3ql1n2cw61Z local]# docker images [root@iZ2ze2rikqlh3ql1n2cw61Z local]# docker run -it renzheubuntu222:1.2 /bin/bash
6.2.4、curl验证私服库上有什么镜像
[root@iZ2ze2rikqlh3ql1n2cw61Z local]# curl -XGET http://localhost:5000/v2/_catalog {"repositories":[]} # 空的,可以看到,目前私服库没有任何镜像上传过
6.2.5、将新镜像zzyyubuntu:1.2修改符合私服规范的Tag
# 按照公式: docker tag 镜像:Tag Host:Port/Repository:Tag # 自己host主机IP地址,填写同学你们自己的,不要粘贴错误 # 使用命令 docker tag 将renzheubuntu222:1.2 这个镜像修改为localhost:5000/renzheubuntu222:1.2 [root@iZ2ze2rikqlh3ql1n2cw61Z local]# docker tag renzheubuntu222:1.2 localhost:5000/renzheubuntu222:1.2
查看镜像:
[root@iZ2ze2rikqlh3ql1n2cw61Z local]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE renzheubuntu222 1.2 cdd9732578cd 9 minutes ago 26.2MB localhost:5000/renzheubuntu222 1.2 cdd9732578cd 9 minutes ago 26.2MB renzheubuntu 1.2 0f4a22da2e25 13 minutes ago 26.2MB <none> <none> 4c8297d97b9c 27 minutes ago 26.2MB renzhe/mycentos 1.1 48faf74abbfa About an hour ago 559MB registry.cn-hangzhou.aliyuncs.com/douluodalu/qibaoliulizong 1.1 48faf74abbfa About an hour ago 559MB tomcat latest fb5657adc892 9 months ago 680MB redis latest 7614ae9453d1 9 months ago 113MB registry latest b8604a3fe854 10 months ago 26.2MB ubuntu latest ba6acccedd29 11 months ago 72.8MB hello-world latest feb5d9fea6a5 12 months ago 13.3kB centos latest 5d0da3dc9764 12 months ago 231MB