【Docker#5】Docker Image(镜像)
目录
一:🔥 Docker Image 概述
🦋 docker镜像是什么
定义:Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。
-
特性:可以理解为一个模板,通过该模板可以实例化出多个容器。镜像内部采用分层文件系统(Union FS),这样既可以充分利用共享层,又可以减少存储空间占用。
-
分层:每一层文件系统称为一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但 docker 镜像中每层文件系统都是只读的,联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。
构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的 可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。
类比了解

- 镜像:类似于 Java 或 C++ 中的类,可以方便地构建出不同的对象。
- 分层:类似房屋装修,最底层是钢筋水泥,依次添加保温层、采暖管、水泥层,最后用户铺设木地板或地砖,每一层都可以独立修改,但最终呈现为一个整体。
🦋 为什么需要镜像?
背景:在部署应用时,通过手工或写一些脚本的方式进行部署。这样部署面临问题就是云端和本地环境一致问题。用户为每个应用打包过程比较繁琐,需要配置和给中修改等操作,非常费劲。
然而,Docker 镜像就是为了解决这个小小的打包功能,突然一夜之间成名。它是如何解决 Paas 时代所面临的云端和本地一致性问题?
-
很简单,它是把一个镜像制作成一个完整的操作系统所有文件和对应的目录结构(本质:Docker 镜像就是个压缩包),这样的压缩包是跟你本地和测试环境用的操作系统一摸一样。
-
一致性:解决云端和本地环境的一致性问题,确保应用在不同环境中运行一致。
-
便捷性:提供了一种打包应用程序和预配置服务器环境的便捷方式,便于个人使用或与他人共享。
二:🔥 镜像命令详解
以下是常用的 Docker 镜像命令清单表格:
| 命令 | 别名 | 功能 |
|---|---|---|
| docker images | docker image ls/docker image list | 列出本地镜像 |
| docker tag | docker image tag | 给镜像打标签,可用于推送镜像仓库 |
| docker pull | docker image pull | 从镜像仓库拉取镜像 |
| docker push | docker image push | 推送镜像到仓库 |
| docker rmi | docker image rm/ docker image remove | 删除本地镜像 |
| docker build | docker image build | 通过 dockerfile 制作镜像 |
| docker save | docker image save | 将指定镜像保存成 tar 归档文件 |
| docker load | docker image load | 导入使用 docker save 命令导出的镜像 |
| docker image inspect | 查看镜像详细信息 | |
| docker history | docker image history | 查看镜像历史 |
| docker import | 从归档文件 docker export 中创建镜像 | |
| docker image prune | 删除不使用的镜像 |
🦋 docker rmi
功能:删除镜像
docker rmi [OPTIONS] IMAGE [IMAGE...]
参数:
-f:强制删除--no-prune:不移除该镜像的过程镜像,默认移除
通过镜像ID进行删除

也可以通过名称 +tag 进行删除操作
rm: 删除容器rmi: 删除镜像
注意:如果镜像被容器引用了,那么我们需要先把容器停止退出,然后将容器删除掉

如果存在镜像正在被使用,如果需要删除的话,可以加一个
-f参数进行强制删除操作
🦋 docker save
功能:将指定镜像保存成tar归档文件
docker save [OPTIONS]IMAGE [IMAGE...]
-
别名:
docker image save -
参数
-o:输出文件路径
示例:这里我们目前存在几个镜像,然后对其中一个镜像进行保存:

docker save -o mynginx1.tar nginx:1.23.4
将镜像保存了之后,我们查看当前目录发现多了一个压缩文件

🦋 docker load
功能:导入使用 docker save 命令导出的镜像
docker load [OPTIONS]
-
别名:
docker image load -
参数
-
-input,-i:指定导入的文件,代替STDIN -
--quiet,-q:精简输出信息
示例:指定tar包进行加载操作
docker load -i mybusybox1.tar

如果后面参数是 -q 的话,会将具体的加载数据进行精简化
🦋 docker history
功能:显示镜像历史
docker history [OPTIONS] IMAGE
-
别名:
docker image history -
参数:
-
-H,--human:大小和日期采用人容器读的格式展现 -
--no-trunc:显示全部信息,不要隔断 -
-q,--quiet:只显示镜像id信息
-
docker history nginx:1.23.4

🦋 docker import
功能:从归档文件中创建镜像。
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
- 别名:docker image import
- 参数:
-c:应用 Docker 指令-m:提交说明
样例:
docker import my_ubuntu_v3.tar maxhou/ubuntu:v4
🦋 docker image prune
功能:删除不使用的镜像
docker image prune [OPTIONS]
-
语法:
docker image prune [OPTIONS] -
关键参数:
-
-a,-all:删除全部不使用的镜像 -
-filter filter:指定过滤条件 -
-f,--force:不提示是否删除
-
示例:
docker image prune -a # 这个是一个危险操作,会将我们所有的镜像全部清理掉

🦋 docker build
功能:使用 Dockerfile 创建镜像。
docker build [OPTIONS] PATH | URL | -
- 参数:
--build-arg=[]:设置镜像创建时的变量-f:指定 Dockerfile 路径--label=[]:设置镜像元数据--no-cache:不使用缓存--pull:尝试更新镜像--quiet,-q:安静模式--tag,-t:镜像名称及标签--network:设置网络模式
样例:
docker build -t mynginx:v1 .
三:🔥 docker操作实战
🦋 查找以及下载镜像
① 查找镜像(一般可能会出现网络问题,这个出错也不影响后面的下载)
docker search busybox

② 拉取镜像
docker pull busybox:1.36.0

注意:下载镜像时,可以看到镜像是分层下载的。
③ 检查是否拉取成功了
docker images

镜像过滤
① 根据仓库名列出镜像
docker image ls nginx # 或者docker images busybox
② 列出特定的某个镜像(指定仓库名和标签)
docker image ls nginx:1.23.4
③ 查看某个位置之前的镜像,使用过滤器参数 --filter 或 -f
docker image ls -f before=nginx:1.23.4
④ 查看某个位置之后的镜像
docker image ls -f since=nginx:1.23.4

🦋 查看镜像及列表存储位置
① 查看镜像
docker images busybox

② 查看镜像仓库在本地的存储信息
- Docker 镜像的存储位置默认在
/var/lib/docker目录下。可以通过修改配置文件来更改存储位置。 - 进入var/lib/docker/image/目录
cd /data/var/lib/docker/image/
cd overlay2/ # overlay2 是 docker 的存储驱动
cat repositories.json

然后将这段 json 数据在线格式化得到如下内容:
{
"Repositories": {
"busybox": {
"busybox:1.35.0": "sha256:95f45f955052d6485b34fb167a1b938e3dd684b4fc43115a77faf23593d4c513",
"busybox@sha256:98ad9d1a2be345201bb0709b0d38655eb1b370145c7d94ca1fe9c421f76e245a": "sha256:95f45f955052d6485b34fb167a1b938e3dd684b4fc43115a77faf23593d4c513"
},
"nginx": {
"nginx:1.23.4": "sha256:a7be6198544f09a75b26e6376459b47c5b9972e7aa742af9f356b540fe852cd4",
"nginx@sha256:f5747a42e3adcb3168049d63278d7251d91185bb5111d2563d58729a5c9179b0": "sha256:a7be6198544f09a75b26e6376459b47c5b9972e7aa742af9f356b540fe852cd4"
}
}
}
③ 查看本地镜像, 发现和 repositories.json 文件记录的信息相同
docker image inspect busybox:1.35.0
🦋 打标签并且推送到个人仓库
① 打标签: 先将我们的镜像进行标签的修改
docker tag busybox:1.35.0 island/mybusyboxby:v1.0
② 推送镜像:执行推送命令
docker push island/mybusyboxby:v1.0

🦋 运行镜像
我们启动镜像的时候通过一个交互式的方式进行启动
docker run -it busybox:1.36.0

在另一个终端输入命令可以查看我们的镜像是否启动了
docker ps

测试下效果

我们最后通过exit进行退出操作
我们可以在ps后面加上-a参数来查看镜像运行数据
docker ps -a
#带上参数-a可以查看到已经停止的容器

删除镜像
docker rmi IMAGEID

🦋 离线迁移镜像
# 步骤1:保存镜像为tar文件
docker save -o mytest.tar busybox:1.35.0
# 步骤2:拷贝镜像到第二台服务器
scp mytest.tar root@123.60.26.220:/docker_test
#通过scp命令将mytest.tar文件拷贝到123.60.26.220root用户下的/docker_test路径中
# 步骤3:从tar文件中恢复镜像
docker load -i mytest.tar
# 步骤4:检查镜像是否正常运行(启动镜像)
docker run -it busybox:1.35.0

🦋 压缩共享实战
nginx在服务端是50多MB

但是当我们拉取到客户端上,大小就是142MB

我们先登录上腾讯仓库
docker login ccr.ccs.tencentyun.com --username=100038760726
我们现在将本地镜像进行打标签操作
docker tag nginx:1.23.3 ccr.ccs.tencentyun.com/undoom/busybox:v1.0
打完了标签就能看到本地存在了这个镜像了

现在我们开始进行推送操作
docker push ccr.ccs.tencentyun.com/undoom/busybox:v1.0

在远端仓库可以看到我们的镜像,这里可以发现进行了一个压缩操作


如果仓库中已经存在了相同的镜像的话,我们仓库中只是多了一个tag,其他的并不会变

四:🔥 共勉
😋 以上就是我对 【Docker#5】Docker Image(镜像) 的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉

更多推荐
所有评论(0)