一: Docker 容器镜像
1. docker images 查看本地容器镜像
# 第一种:docker images
docker images
# 第二种: docker image list / docker image --help
docker image list
2. 查看 docker 容器镜像本地存储位置
cd /var/ls/docker
[root@localhost docker]# ls
buildkit containers engine-id image network overlay2 plugins runtimes swarm tmp volumes
3. 搜索 Docker Hub容器镜像
命令行搜索
# 搜索镜像
docker search centos
# 下载镜像:不写tag,则会下载默认的tag,也就是latest
docker pull centos
Docker Hub 界面搜索
Docker Hub Container Image Library | App Containerization
每个容器镜像都有 Tag , 用来表示各种各样的版本
# 1. 下载Mysql最新版本的镜像
docker pull mysql:latest
# 2. 下载Mysql5.7
docker pull myslq:5.7
# 使用docker images查看镜像
docker images
4. 删除容器镜像
镜像长期保存在本地会导致本地的存储资源不够用 , 甚至会导致某些服务起不来
运行中的容器需要向停止容器 , 再删除容器 , 才能删除容器镜像
# 1. 容器名+tag
docker rmi mysql:latest
# 2. 容器id
docker rmi 容器ID
二: Docker 容器镜像介绍
1. Docker image
Docker 镜像是只读的容器模板,是 Docker 容器基础 ( 可以自己制作容器模版分享给其他人 )
为 Docker 容器提供了静态文件系统运行环境(rootfs)( 模版是静态的 , 想要运行 docker 是动态的 )
是容器的静止状态
容器是镜像的运行状态
2. 联合文件系统
联合文件系统(union filesystem)
联合文件系统是实现联合挂载技术的文件系统
联合挂载技术可以实现在一个挂载点同时挂载多个文件系统,将挂载点的原目录与被挂载内容进行整合,使得最终可见的文件系统包含整合之后的各层文件和目录
现在 docker 的文件系统已经不是联合文件系统的
3. Docker Overlays ( 目前用的 )
registry/repository
: registry ( Docker Hub ) 是 repository ( Centos , Nginx , Msyql ) 的集合,repository 是镜像的集合image:image 是存储镜像相关的元数据,包括镜像的架构,镜像默认配置信息,镜像的容器配置信息等等。它是“逻辑”上的概念,并无物理上的镜像文件与之对应。
layer:layer(镜像层) 组成了镜像,单个 layer 可以被多个镜像共享。
查看 Docker Host 存储驱动方式
docker info | grep overlay
4. 了解 iamges 分层
ls /var/lib/docker/image/overlays
[root@localhost ~]# ls /var/lib/docker/image/overlay2
distribution imagedb layerdb repositories.json
这个目录是查找的入口,非常重要。它存储了镜像管理的元数据
repositories.json
记录了 repo 与镜像 ID 的映射关系imagedb
记录了镜像架构,操作系统,构建镜像的容器 ID 和配置以及 rootfs 等信息layerdb
记录了每层镜像层的元数据
# 查看镜像长ID
cat repositories.json | grep 99afc808f15b
# 每一个镜像的长名称
[root@localhost overlay2]# ls imagedb/content/sha256
5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6 92034fe9a41f4344b97f3fc88a8796248e2cfa9b934be58379f3dbc150d07d9d eff1bf1d76c1f016fde79c8d570b9758c959d08c64124e2ae644ad75bd865d1f
89da1fb6dcb964dd35c3f41b7b93ffc35eaf20bc61f2e1335fea710a18424287 99afc808f15be15cd1d9890394123034a79d1f3204d5b417d8558990cdf30167
# 查看每个分层
ls 长ID
# 里面保存了imagedb ,创建的时间,作者,环境变量.... ,并且里面还有各个分层的ID
# 查看分层文件位置
# 1.
[root@localhost overlay2]# ls layerdb/sha256/4f15baf3c136dbeff8c6f90737f0e54bd641095fd6441e359a1789ccbe554714
cache-id diff parent size tar-split.json.gz
# 2.9ff999开头的为分层文件的位置
[root@localhost overlay2]# cat layerdb/sha256/4f15baf3c136dbeff8c6f90737f0e54bd641095fd6441e359a1789ccbe554714/cache-id
9ff999f00d8b04f423442a3c95775578cf25d7cec5910a874e51813375783d5b[root@localhost overlay2]#
# 3. /var/lib/docker/overlay2
ls /var/lib/docker/overlay2/9ff999f00d8b04f423442a3c95775578cf25d7cec5910a874e51813375783d5b
4. Docker 容器与镜像
# 1. 首先启动一个容器
docker run -d nginx:latest
# 2.查看分层文件位置
mount | grep overlay
可以看到,启动容器会 mount 一个 overlay 的联合文件系统到容器内。这个文件系统由三层组成:
lowerdir:只读层,即为镜像的镜像层。
upperdir:读写层,该层是容器的读写层,对容器的读写操作将反映在读写层。
workdir: overlayfs 的内部层,用于实现从只读层到读写层的 copy_up 操作。
merge:容器内作为同一视图联合挂载点的目录。
# 查看各个分层内容
ls /var/lib/docker/overlay2/l/容器ID
5. 容器内写入文件
容器中创建的文件对于容器镜像是没有影响的 , 因为容器镜像是云原生种不可变的基础设施
# 查看镜像是否有变化
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest d13c942271d6 2 weeks ago 72.8MB
bash latest 5557e073f11c 2 weeks ago 13MB
nginx latest 605c77e624dd 3 weeks ago 141MB
centos latest 5d0da3dc9764 4 months ago 231MB
[root@localhost ~]# cat /var/lib/docker/image/overlay2/repositories.json | grep 5d0da3dc9764
{"Repositories"{"centos:latest":"sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6","centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177":"sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6"}}}
[root@localhost ~]# cat /var/lib/docker/image/overlay2/imagedb/content/sha256/5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
{"os":"linux","rootfs":{"type":"layers","diff_ids":["sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59"]}}
[root@localhost ~]# ls
/var/lib/docker/image/overlay2/layerdb/sha256/74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59:
cache-id diff size tar-split.json.gz
[root@localhost ~]# cat /var/lib/docker/image/overlay2/layerdb/sha256/74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59/cache-id
b17bc5c5103514923a30983c48f909e06f366b7aa1e85f112b67abb3ef5cd0cb
[root@localhost ~]# cat /var/lib/docker/image/overlay2/layerdb/sha256/74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59/diff
sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
[root@localhost ~]# ls /var/lib/docker/overlay2/b17bc5c5103514923a30983c48f909e06f366b7aa1e85f112b67abb3ef5cd0cb
committed diff link
[root@localhost ~]# ls /var/lib/docker/overlay2/b17bc5c5103514923a30983c48f909e06f366b7aa1e85f112b67abb3ef5cd0cb/diff/
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
# 查看容器是否有变化
[root@localhost ~]# mount | grep overlay
type overlay (rw,relatime,seclabel,lowerdir=/var/lib/docker/overlay2/l/R2W2LEMDPRIUFYDVSLIQSCYTGX:/var/lib/docker/overlay2/l/R2XTGODAA67NQJM44MIKMDUF4W,upperdir=/var/lib/docker overlay2/7f0b54c748171872ce564305e394547555cb1182abf802c2262384be3dc78a8f/diff,workdir=/var/lib/docker/overlay2/7f0b54c748171872ce564305e394547555cb1182abf802c2262384be3dc78a8f/work)
[root@localhost ~]# ls -l /var/lib/docker/overlay2/l/
总用量 0
lrwxrwxrwx. 1 root root 77 1月 25 01:41 R2W2LEMDPRIUFYDVSLIQSCYTGX -> ../7f0b54c748171872ce564305e394547555cb1182abf802c2262384be3dc78a8f-init/diff
lrwxrwxrwx. 1 root root 72 1月 25 00:29 R2XTGODAA67NQJM44MIKMDUF4W -> ../b17bc5c5103514923a30983c48f909e06f366b7aa1e85f112b67abb3ef5cd0cb/diff
[root@localhost ~]# ls /var/lib/docker/overlay2/7f0b54c748171872ce564305e394547555cb1182abf802c2262384be3dc78a8f/diff
msb.txt
[root@localhost ~]# ls /var/lib/docker/overlay2/7f0b54c748171872ce564305e394547555cb1182abf802c2262384be3dc78a8f/merged/
bin etc lib lost+found mnt opt root sbin sys usr
dev home lib64 media msb.txt proc run srv tmp var
三: Docker 容器镜像操作命令
1. docker commit
把正在运行的容器提交为一个容器镜像 , 以便于分享不可变的基础设施
docker 通过 commit 和 build 操作实现镜像的构建
commit 将容器提交为一个镜像
build 在一个镜像的基础上构建镜像
docker commit 容器ID 容器名:tag
docker commit ...... SakuraCentos:new
2. docker save
导出容器镜像 , 方便分享
导出的文件是一个 tar 包
docker save -o centos.tar centos:latest
docker save -o TestDocker.tar sakuracentos:new
3. docker load
把他人分享的容器镜像导入到本地,这通常是容器镜像分发方式之一
docker load -i sakuracentos.tar
4. docker export
把正在运行的容器导出
docker export -o centos.tar centos:latest
在本地不会有镜像生成
5. docker import
导入使用docker export导入的容器做为本地容器镜像
# 和 load 不一样需要加上容器名:tag
docker import sauracentox.tar centos:latest
如果使用了 docker export 导出了镜像 , 不能使用 docker load 导入 , 只能使用 docker import
docker export 和 docker import 不经常用
评论区