目录
1. 镜像是什么??
(1)镜像的解析如下:
- 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 用户公开共享。
2. 镜像命令详解
2.1 镜像命令清单
(1)整体命令如下:
命令 | 别名 | 功能 |
---|---|---|
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 image import | 从归档文件docker export中创建镜像。 |
docker image prune | 删除不使用的镜像 |
(2)命令docker images、docker image inspect、docker tag、docker pull、docker push见博客《Docker的镜像仓库》。本文就不在介绍了。
docker_rmi_44">2.2 docker rmi命令
(1)功能:
- 删除镜像。
(2)语法:
docker rmi [OPTIONS] IMAGE [IMAGE...]
(3)别名:
docker image rm, docker image remove
(4)关键参数:
- -f:强制删除;
- –no-prune:不移除该镜像的过程镜像,默认移除;
(5)样例:
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:2c8ed5408179ff4f53242a4bdd2706110ce000be239fe37a61be9c52f704c437
docker_save_72">2.3 docker save命令
(1)功能:
- 将指定镜像保存成 tar 归档文件。
(2)语法:
docker save [OPTIONS] IMAGE [IMAGE...]
(3)别名:
docker image save
(4)关键参数:
- -o:输出到的文件。
(5)样例:
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_103">2.4 docker load命令
(1)功能:
- 导入使用 docker save 命令导出的镜像。
(2)语法:
docker load [OPTIONS]
(3)别名:
docker image load
(4)关键参数:
- –input , -i:指定导入的文件,代替 STDIN。
- –quiet , -q:精简输出信息。
(5)样例:
root@139-159-150-152:/data/myworkdir# docker load -i
mynginx_1.22.1.tar
Loaded image: nginx:1.22.1
docker_history_131">2.5 docker history命令
(1)功能:
- 显示镜像历史。
(2)语法:
docker history [OPTIONS] IMAGE
(3)别名:
docker image history
(4)关键参数:
- -H , --human:大小和日期采用人容易读的格式展现
- –no-trunc:显示全部信息,不要隔断;
- -q, --quiet:只显示镜像 id 信息;
(5)样例:
root@139-159-150-152:/data/myworkdir# docker history nginx:1.21.1
IMAGE CREATED CREATED BYSIZE COMMENT
822b7ec2aaf2 18 months ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 18 months ago /bin/sh -c #(nop) STOPSIGNALSIGQUIT 0B
<missing> 18 months ago /bin/sh -c #(nop) EXPOSE 800B
<missing> 18 months ago /bin/sh -c #(nop) ENTRYPOINT
["/docker-entr… 0B
<missing> 18 months ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB
<missing> 18 months ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
<missing> 18 months ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB
<missing> 18 months ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB
<missing> 18 months ago /bin/sh -c set -x && addgroup --system -… 63.9MB
<missing> 18 months ago /bin/sh -c #(nop) ENVPKG_RELEASE=1~buster 0B
<missing> 18 months ago /bin/sh -c #(nop) ENVNJS_VERSION=0.6.1 0B
<missing> 18 months ago /bin/sh -c #(nop) ENVNGINX_VERSION=1.21.1 0B
<missing> 18 months ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 18 months ago /bin/sh -c #(nop) CMD ["bash"]0B
<missing> 18 months ago /bin/sh -c #(nop) ADD
file:4ff85d9f6aa246746… 69.3MB
docker_import_176">2.6 docker import命令
(1)功能:
- 从归档文件中创建镜像。
(2)语法:
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
(3)别名:
docker image import
(4)关键参数:
- -c:应用 docker 指令创建镜像;
- -m:提交时的说明文字;
(5)样例:
docker import my_ubuntu_v3.tar maxhou/ubuntu:v4
docker_image_prune_202">2.7 docker image prune命令
(1)功能:
- 删除不使用的镜像。
(2)语法:
docker image prune [OPTIONS]
(3)关键参数:
- -a , --all:删除全部不使用的镜像;
- –filter filter:指定过滤条件;
- -f, --force:不提示是否删除;
(4)样例:
docker image prune
docker_build_223">2.8 docker build命令
(1)功能:
- docker build 命令用于使用 Dockerfile 创建镜像。
(2)语法:
docker build [OPTIONS] PATH | URL | -
(3)关键参数:
- –build-arg=[]:设置镜像创建时的变量;
- -f:设指定要使用的 Dockerfile 路径;
- –label=[]:设设置镜像使用的元数据;
- –no-cache:设创建镜像的过程不使用缓存;
- –pull:设尝试去更新镜像的新版本;
- –quiet, -q:设安静模式,成功后只输出镜像 ID;
- –tag, -t:设镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签。
- –network:设默认 default。在构建期间设置 RUN 指令的网络模式
(4)样例:
docker build -t mynginx:v1 .
3. 镜像的操作
(1)查找镜像:
[xiaomaker@xiaomaker-virtual-machine:docket]$ docker search busybox
(2)下载镜像:
[xiaomaker@xiaomaker-virtual-machine:docket]$ docker pull busybox:1.36.0
(3)查看镜像及列表存储位置:
- 遍历查看镜像:
[xiaomaker@xiaomaker-virtual-machine:docket]$ docker images busybox
- 查看镜像仓库在本地的存储信息:
- 进入/var/lib/docker/目录查看 overlay2/repositories.json 文件,该文件记录已拉取镜像文件的信息。
- 查看本地镜像,可以发现和 repositories.json 文件记录的信息相同。
[xiaomaker@xiaomaker-virtual-machine:docker]$ cd /var/lib/docker/
- 镜像过滤:
docker image ls ubuntu #根据仓库名列出镜像
docker image ls ubuntu:18.04 #列出特定的某个镜像,也就是说指定仓库名和标签
docker image ls 还支持强大的过滤器参数 --filter,或者简写 -f。之前
我们已经看到了使用过滤器来列出虚悬镜像的用法,它还有更多的用法。查看某个位置之前的镜像 before,查看某个位置之后的镜像 since。
root@139-159-150-152:/data/myworkdir# docker image ls -f
before=ubuntu:18.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 b6f507652425 18 months ago 135MB
root@139-159-150-152:/data/myworkdir# docker image ls -f
since=ubuntu:18.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 20.04 e40cf56b4be3 3 weeks ago 72.8M
(4)查看镜像详情:
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker image inspect busybox:1.36.0
(5)查看镜像分层:
- Docker history 可以查看分层:
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker history busybox:1.36.0
- docker image inspect 可以查看详细的分层:
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker image inspect busybox:1.36.0
- 一些镜像下载的时候也可以看到是一层一层下载的:
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker pull nginx:1.21.1
1.21.1: Pulling from library/nginx
a330b6cecb98: Pull complete
5ef80e6f29b5: Pull complete
f699b0db74e3: Pull complete
0f701a34c55e: Pull complete
3229dce7b89c: Pull complete
ddb78cb2d047: Pull complete
Digest: sha256:a05b0cdd4fc1be3b224ba9662ebdf98fe44c09c0c9215b45f84344c12867002e
Status: Downloaded newer image for nginx:1.21.1 docker.io/library/nginx:1.21.1
(6)打标签:
docker tag busybox:1.36.0
ccr.ccs.tencentyun.com/maxhou6/busyboxbymaxhou:v3.0
(7)推送镜像:
docker pull ccr.ccs.tencentyun.com/maxhou6/busyboxbymaxhou:v3.0
(8)运行容器:
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker run -it --rm
(9)镜像删除:可以根据 id 和名字删除,对于使用的镜像需要先清理容器再删除镜像
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker rmi busybox:1.36.0
4. 离线迁移镜像
(1)服务器 1 上镜像保存为 tar 文件,如操作系统为 ubuntu:
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker save -o busybox.tar busybox
[xiaomaker@xiaomaker-virtual-machine:docker]$ ll
total 147740
drwxr-xr-x 2 root root 4096 Mar 13 16:28 ./
drwx--x--x 5 root root 4096 Mar 13 15:03 ../
-rw------- 1 root root 5101568 Mar 13 16:28 busybox.tar
-rw------- 1 root root 146172416 Mar 13 15:05 mynginx_1.22.1.tar
(2)scp 或者只用使用可视化工具拷贝镜像到第二台服务器上:
[xiaomaker@xiaomaker-virtual-machine:docker]$ scp busybox.tar
root@43.138.218.166:/data/maxhou
The authenticity of host '43.138.218.166 (43.138.218.166)' can't
be established.
ECDSA key fingerprint is
SHA256:ai8KwGyM5W/iocUP8O00OMX7hriCD3ajd3wHVvdazTs.
Are you sure you want to continue connecting
(yes/no/[fingerprint])? yes
Warning: Permanently added '43.138.218.166' (ECDSA) to the list of
known hosts.
root@43.138.218.166's password:
busybox.tar
(3)从 tar 中恢复镜像:
[root@VM-8-12-centos maxhou]# docker load -i busybox.tar
baacf561cfff: Loading layer
[==================================================>]
5.092MB/5.092MB
Loaded image: busybox:1.36.0
[root@VM-8-12-centos maxhou]# docker images
REPOSITORY TAG IMAGE ID CREATED
SIZE
busybox 1.36.0 7cfbbec8963d 3 weeks ago
4.86MB
rabbitmq 3.9-management ef80153df89f 2 months ago
269MB
ubuntu 1.0 955bd67a1123 3 months ago
344MB
myubuntu 1.0 1de21ccbd1a1 3 months ago
344MB
busybox latest 827365c7baf1 3 months ago
4.86MB
redis 7.0 0256c63af7db 3 months ago
117MB
nginx latest 1403e55ab369 3 months ago
142MB
tomcat latest 1dad8c5497f9 4 months ago
474MB
ubuntu latest 6b7dfa7e8fdb 4 months ago
77.8MB
mysql 5.7 d410f4167eea 4 months ago
495MB
maxhou/stress-ng latest ceec0900d3e1 2 years ago
7.34MB
lmmdock/fork-bomb latest fb27e67e6244 2 years ago
934MB
cuilc/mycat latest 2d46917d5584 6 years ago
846MB
(4)执行 docker run 检查镜像是否可以正常运行:
[root@VM-8-12-centos maxhou]# docker run -it --rm busybox:1.36.0
sh
/ #
/ # ls /
bin dev etc home lib lib64 proc root sys tmp
usr var
/ # exit
5. 镜像存储的压缩与共享
(1)拉取 nginx 镜像,如果本地没有,镜像是从仓库拉取,如果有会提示镜像已经存在,并且是最新的。
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker pull nginx:1.21.1
1.21.1: Pulling from library/nginx
Digest:
sha256:a05b0cdd4fc1be3b224ba9662ebdf98fe44c09c0c9215b45f84344c1267002e
Status: Image is up to date for nginx:1.21.1
docker.io/library/nginx:1.21.1
(2)Docker images 查看本地镜像,可以看到该镜像为 142Mb:
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker images
REPOSITORY TAG IMAGE
ID CREATED SIZE
ccr.ccs.tencentyun.com/maxhou/mybusybox v0.2
bab98d58e29e 6 days ago 4.86MB
busybox latest
bab98d58e29e 6 days ago 4.86MB
maxhou/mybusybox v0.1
bab98d58e29e 6 days ago 4.86MB
registry.cn-hangzhou.aliyuncs.com/maxhou/busybox v0.3
bab98d58e29e 6 days ago 4.86MB
grafana/grafana latest
944e84f25bc7 10 days ago 329MB
nginx 1.22.1
8c9eabeac475 11 days ago 142MB
nginx 1.23.3
904b8cb13b93 11 days ago 142MB
ubuntu 22.04
74f2314a03de 11 days ago 77.8MB
hello-world latest
feb5d9fea6a5 17 months ago 13.3kB
nginx 1.21.1
822b7ec2aaf2 18 months ago 133MB
(3)从上面看到 nginx 为 1.21.1 的大小是 140 多 MB,但是我们从 docker hub 上查看可以看到镜像是 50 多 MB,说明发生了压缩,因为仓库到本地需要走网络,所以文件越小越好:
(4)把一个镜像打多个 tag,然后同时推送仓库,可以看到是说层已经存在,不会重复存储:
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker tag nginx:1.22.1
maxhou/mybitnginx:1.22.1
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker tag nginx:1.22.1
maxhou/mybitnginx:1.22.2
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker tag nginx:1.22.1
maxhou/mybitnginx:1.22.3
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker tag nginx:1.22.1
maxhou/mybitnginx:1.22.4
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker push maxhou/mybitnginx -a
(5)添加一个新的镜像到我们的仓库的时候,如果 docker hub 发现已经有了是 mount的,不是从本地推上去的:
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker tag nginx:1.16.1
maxhou/mybitnginx:1.16.1
[xiaomaker@xiaomaker-virtual-machine:docker]$ docker push
maxhou/mybitnginx:1.16.1
The push refers to repository [docker.io/maxhou/mybitnginx]
c23548ea0b99: Mounted from library/nginx
82068c842707: Mounted from library/nginx
c2adabaecedb: Mounted from library/nginx
1.16.1: digest:
sha256:2963fc49cc50883ba9af25f977a9997ff9af06b45c12d968b7985dc1e9254e4b size: 948