目 录CONTENT

文章目录

Docker容器镜像

Sakura
2023-08-10 / 0 评论 / 0 点赞 / 15 阅读 / 10653 字 / 正在检测是否收录...

一: 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容器镜像

  1. 命令行搜索

# 搜索镜像
docker search centos

# 下载镜像:不写tag,则会下载默认的tag,也就是latest
docker pull centos

  1. 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 可以被多个镜像共享。

  1. 查看 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 不经常用

0

评论区