目录:
- Docker 镜像是什么
- 镜像生活案例
- 镜像分层生活案例
- 为什么需要镜像
- 镜像命令详解
- 镜像命令清单
- docker images
- docker tag
- docker pull
- docker push
- docker rmi
- docker save
- docker load
- docker history
- docker import
- docker image prune
- docker build
- 镜像操作案例
- 查找镜像
- 下载镜像
- 查看镜像及列表存储位置
- 打标签
- 推送镜像
- 运行容器
- 镜像删除
- 镜像综合实战
- 实战一、离线迁移镜像
- 实战二、镜像存储的压缩与共享
1. Docker 镜像是什么
- Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。
- 我们可以把 Docker image 理解成一个模板, 可以通过这个模板实例化出来很多容器。
- image 里面是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。
- 每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker镜像中每一层文件系统都是只读的。
- 构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。
2.镜像生活案例
镜像相当于我们 java 或者 C++中的类,相当于一个模板,可以很方便的构建出来不同的对象。
3.镜像分层生活案例
我们以日常的地板为例,开发商的房子提供给用户的时候一般是做好了地暖,而这些地暖其实是一层一层添加的,最底层的钢筋水泥层,然后添加保温层,采暖管,再铺设水泥层,到最后交付的时候家家户户都是水泥面,这一层一般是不可修改的,最上层用户一般会再铺设商木地板或者地板砖每家每户的选择不一样,相当于我们镜像的容器层。
4.为什么需要镜像
- 在部署应用时,通过手工或写一些脚本的方式进行部署。这样部署面临问题就是云端和本地环境一致问题。用户为每个应用打包过程比较繁琐,需要配置和给中修改等操作,非常费劲。
- 然而, Docker 镜像就是为了解决这个小小的打包功能,突然一夜之间成名。那么,你可能说 Docker 镜像就是个压缩包,是的,你猜对了,它就像一个压缩包文件。它是如何解决 Paas 时代所面临的云端和本地一致性问题?很简单,它是把一个镜像制作成一个完整的操作系统所有文件和对应的目录结构,这样的压缩包是跟你本地和测试环境用的操作系统一摸一样。
- docker 最大的贡献就是定义了容器镜像的分层的存储格式, docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。
- docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便的将其用于个人用途或与其他 Docker 用户公开共享。
5.镜像命令详解
镜像命令清单
docker images
功能
列出本地镜像
语法
docker images [OPTIONS] [REPOSITORY[:TAG]]
别名
docker image ls, docker image list
关键参数
- -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
- --digests :显示镜像的摘要信息;
- -f :显示满足条件的镜像;
- --format :指定返回值的模板文件;
- --no-trunc :显示完整的镜像信息;
- -q :只显示镜像 ID。
样例
#列出本地全部镜像
docker images
#列出本地镜像中 REPOSITORY 为 ubuntu 的镜像列表。
docker images ubuntu
docker tag
功能
标记本地镜像,将其归入某一仓库。
语法
docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
别名
docker image tag
样例
docker tag ubuntu:22.04 myregistry.com/myubuntu:22.04
docker pull
参考镜像仓库命令
docker push
参考镜像仓库命令
docker rmi
功能
删除镜像
语法
docker rmi [OPTIONS] IMAGE [IMAGE...]
别名
docker image rm, docker image remove
关键参数
-f :强制删除;
--no-prune :不移除该镜像的过程镜像,默认移除;
样例
root@139-159-150-152:/data/var/lib/docker/overlay2# docker rmi
maxhou/mybusybox:v0.1
Untagged: maxhou/mybusybox:v0.1
Untagged:
maxhou/mybusybox@sha256:2c8ed5408179ff4f53242a4bdd2706110ce000be23
9fe37a61be9c52f704c437
docker save
功能
将指定镜像保存成 tar 归档文件。
语法
docker save [OPTIONS] IMAGE [IMAGE...]
别名
docker image save
关键参数
-o :输出到的文件
样例
root@139-159-150-152:/data/myworkdir# docker save -o
mynginx_1.22.1.tar nginx:1.22.1
root@139-159-150-152:/data/myworkdir# ll
total 142756
drwxr-xr-x 2 root root 4096 Mar 13 15:05 ./
drwx--x--x 5 root root 4096 Mar 13 15:03 ../
-rw------- 1 root root 146172416 Mar 13 15:05 mynginx_1.22.1.tar
docker load
功能
导入使用 docker save 命令导出的镜像
语法
docker load [OPTIONS]
别名
docker image load
关键参数
--input , -i : 指定导入的文件,代替 STDIN。
--quiet , -q : 精简输出信息。
样例
root@139-159-150-152:/data/myworkdir# docker load -i
mynginx_1.22.1.tar
Loaded image: nginx:1.22.1
docker image inspect
功能
查看镜像详细信息
语法
docker image inspect [OPTIONS] IMAGE [IMAGE...]
注意事项:
docker inspect 会自动检查是镜像还是容器然后显示相信信息
样例
#查看镜像详细信息
docker images inspect nginx:1.23.3
docker history
功能
显示镜像历史
语法
docker history [OPTIONS] IMAGE
别名
docker image history
关键参数
-H , --human :大小和日期采用人容易读的格式展现
--no-trunc :显示全部信息,不要隔断;
-q, --quiet: 只显示镜像 id 信息;
样例
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]
关键参数
-a , --all : 删除全部不使用的镜像;
--filter filter:指定过滤条件;
-f, --force :不提示是否删除;
样例
docker image prune
docker build
功能
docker build 命令用于使用 Dockerfile 创建镜像
语法
docker build [OPTIONS] PATH | URL | -
关键参数
- --build-arg=[] :设置镜像创建时的变量;
- -f :指定要使用的 Dockerfile 路径;
- --label=[] :设置镜像使用的元数据;
- --no-cache :创建镜像的过程不使用缓存;
- --pull :尝试去更新镜像的新版本;
- --quiet, -q :安静模式,成功后只输出镜像 ID;
- --rm :设置镜像成功后删除中间容器;
- --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
- --network: 默认 default。在构建期间设置 RUN 指令的网络模式
样例
docker build -t mynginx:v1 .
6.镜像操作案例
查找镜像
下载镜像
查看镜像及列表存储位置
遍历查看镜像
查看镜像仓库在本地的存储信息
进入/data/var/lib/docker/image/目录,注意存储位置老师的是修改后的/data
查看 overlay2/repositories.json 文件,该文件记录已拉取镜像文件的信息
查看本地镜像, 发现和 repositories.json 文件记录的信息相同
镜像过滤
根据仓库名列出镜像
docker image ls ubuntu
列出特定的某个镜像,也就是说指定仓库名和标签
docker image ls ubuntu:18.04
docker image ls 还支持强大的过滤器参数 --filter,或者简写 -f。之前我们已经看到了使用过滤器来列出虚悬镜像的用法,它还有更多的用法。查看某个位置之前的镜像 before,查看某个位置之后的镜像 since
查看镜像详情
查看镜像分层
Docker history 可以查看分层
docker image inspect 可以查看详细的分层
一些镜像下载的时候也可以看到是一层一层下载的
打标签
推送镜像
运行容器
镜像删除
镜像的删除:可以根据 id 和名字删除,对于使用的镜像需要先清理容器再删除镜像
7.镜像综合实战
实战一、离线迁移镜像
1. 服务器 1 上镜像保存为 tar 文件,如操作系统为 ubuntu
2. scp 或者只用使用可视化工具拷贝镜像到第二台服务器上
3. 从 tar 中恢复镜像
4. 执行 docker run 检查镜像是否可以正常运行
实战二、镜像存储的压缩与共享
1. 拉取 nginx 镜像,如果本地没有,镜像是从仓库拉取,如果有会提示镜像已经存在,并且是最新的。
2. Docker images 查看本地镜像,可以看到该镜像为 142Mb
3. 从上面看到 nginx 为 1.21.1 的大小是 140 多 MB,但是我们从 docker hub 上查看可以看到镜像是 50 多 MB,说明发生了压缩,因为仓库到本地需要走网络,所以文件越小越好
4. 把一个镜像打多个 tag,然后同时推送仓库,可以看到是说层已经存在,不会重复存储
5. 添加一个新的镜像到我们的仓库的时候,如果 docker hub 发现已经有了是 mount的,不是从本地推上去的