前言

大家好,我是沐风晓月,本文收录于沐风晓月的专栏《容器管理》,更多内容可以关注我的博客: https://blog.csdn.net/wisdom_futrue

今天我们主要探讨,docker镜像的使用,如果你还没有安装docker,参考:CentOS7操作系统离线安装docker

一. 什么是docker的镜像?

1.1 镜像是什么

如果从概念上来看,基本上是这样的: 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

对上面的概念的理解:

  1. docker的镜像是一个模板,或者说是一个只读文件;
  2. 在这个模板中包含应用和应用运行时所需要的环境;
  3. docker的镜像采用的是分层的文件系统,每次对镜像修改将以”读写层“的形式增加在原来的只读文件的模板上。
  4. Docker 镜像(Image)是用于创建 Docker 容器的模板

1.2 docker镜像分层结构

docker分层镜像机制:docker镜像是分层创建的,DockerFile中每一条指令都会新建一层;

为什么要采用镜像的分层结构?

主要是为了共享资源,有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。

如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是否也会被修改?

不会,因为copy-on-write特性,修改会被限制在单个容器内。只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。

1.3 分层的好处?

不分层的痛点: 我们拉取一个镜像,比如redis镜像需要100M, 下次我们要下载一个redis新版本,尽管两个版本的差异只是改了一行配置文件,但也要重新下载100M。这样就非常低效。

我们都知道备份中有个词叫:差异备份,那能不能让docker实现差异下载。 比如第一次下载的时候需要下载所有层,但第二次的时候前面几层下载过了就不要重新下载了。

比如: 第一次下载MySQL:

【云原生】Docker的镜像实战指南-LMLPHP

当第二次下载的时候:

【云原生】Docker的镜像实战指南-LMLPHP

可以看到前面的几层,全部都显示已经存在,不需要额外下载了 。

这种思想和我们常用的版本管理工具git也是一样的!
如果版本2是基于版本1的基础上,那么版本2不需要copy一份全量的数据,只需一份和版本1差异化的增量数据即可!

这样的最终好处是,可以体现在以下方面:

  • 拉取更快:因为分层了,只需拉取本地不存在的层即可!
  • 存储更少:因为共同的层只需存储一份即可!
  • 运行时存储更少:容器运行时可以共享相同的层

二. docker镜像的存储

2.1 使用docker的默认镜像存储路径

在默认情况下,docker拉取的镜像放在/var/lib/docker 的目录下:

[root@mufeng63 ~]# docker info |grep "Docker Root Dir"
 Docker Root Dir: /var/lib/docker
[root@mufeng63 imagedb]# cd /var/lib/docker/
[root@mufeng63 docker]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
redis        6.2       7614ae9453d1   15 months ago   113MB
redis        latest    7614ae9453d1   15 months ago   113MB
mysql        5.7       c20987f18b13   15 months ago   448MB
mysql        latest    3218b38490ce   15 months ago   516MB

[root@mufeng63 docker]# find . -name 3218b38490ce*
./image/overlay2/imagedb/content/sha256/3218b38490cec8d31976a40b92e09d61377359eab878db49f025e5d464367f3b

2.2 自定义docker的存储路径

我们刚刚看到存储路径默认在/var/lib/docker中,如果想把路径改为: /data/docker

可以参考以下方法:

  • 创建要存储的路径:
[root@mufeng63 ~]# mkdir -p /data/docker
  • 创建docker的守护进程的配置文件
[root@mufeng63 ~]# cd /etc/docker/
[root@mufeng63 docker]# vim daemon.json 
[root@mufeng63 docker]# cat daemon.json 
{
  
  "registry-mirrors": ["https://ywrd8tun.mirror.aliyuncs.com"],
  "data-root":"/data/docker"
}

  • 重新加载docker并查看路径
[root@mufeng63 docker]# systemctl restart docker
[root@mufeng63 docker]# docker info |grep "Docker R"
 Docker Root Dir: /data/docker

可以看到路径已经改为了/data/docker .

三. 访问docker官方的共有镜像仓库

docker 提供了一个公有镜像仓库: Docker Hub 。 操作docker的时候,如果没有指定镜像仓库地址,默认使用的是官方的镜像仓库地址。

地址: https://hub.docker.com/

案例一: 拉取MySQL镜像

用docker search可以查看当前的可以下载镜像

[root@mufeng63 ~]# docker search mysql --limit 5
NAME             DESCRIPTION                                      STARS     OFFICIAL   AUTOMATED
mysql            MySQL is a widely used, open-source relation…   14013     [OK]       
mariadb          MariaDB Server is a high performing open sou…   5345      [OK]       
percona          Percona Server is a fork of the MySQL relati…   603       [OK]       
phpmyadmin       phpMyAdmin - A web interface for MySQL and M…   777       [OK]       
circleci/mysql   MySQL is a widely used, open-source relation…   29                   
[root@mufeng63 ~]# 

使用docker pull 拉取,如果不指定版本,默认拉取最新版本:

[root@mufeng63 ~]# docker pull mysql:5.7

如何查看自己的镜像是从哪里拉取呢?

可以用以下命令:

[root@mufeng63 ~]# docker info |tail
 Docker Root Dir: /data/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Registry Mirrors:
  https://ywrd8tun.mirror.aliyuncs.com/
 Live Restore Enabled: false

四. 与镜像相关的命令

4.1 搜索镜像

// 搜索带 nginx 关键字的镜像
[root@mufeng63 ~]# docker search nginx 
NAME                                              DESCRIPTION                                      STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                         18354     [OK]       
bitnami/nginx                                     Bitnami nginx Docker Image                       155                  [OK]
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   23                   [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   84                   
kasmweb/nginx                                     An Nginx image based off nginx:alpine

// 搜索官方提供的带 nginx 关键字的镜像
$ docker search --filter=is-official=true  nginx
NAME      DESCRIPTION                STARS     OFFICIAL   AUTOMATED
nginx     Official build of Nginx.   16924     [OK]    

// 搜索所有收藏数超过4的带 nginx 关键字的镜像
$ docker search --filter=stars=4  nginx

// 搜索自动创建的仓库(镜像)
$ docker search nginx --filter "is-automated=true"  

// 搜索mysql 并只看前3个

[root@mufeng63 ~]# docker search mysql --limit 3
NAME      DESCRIPTION                                      STARS     OFFICIAL   AUTOMATED
mysql     MySQL is a widely used, open-source relation…   14013     [OK]       
mariadb   MariaDB Server is a high performing open sou…   5345      [OK]       
percona   Percona Server is a fork of the MySQL relati…   603       [OK]    

这里返回的一些关键字:

  • NAME :仓库名称,包括docker ID,或者非官方仓库的组织名称
  • DESCRIPTION :描述
  • STARS :收藏数(表示该镜像的受欢迎程度)
  • OFFICIAL: 是否官方创建
  • AUTOMATED: 是否自动创建

4.2 查看本地镜像

[root@mufeng63 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        5.7       c20987f18b13   15 months ago   448MB
[root@mufeng63 ~]# docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        5.7       c20987f18b13   15 months ago   448MB

同一个仓库源可以有多个TAG,代表这个仓库源的不同版本,我们使用镜像仓库源:镜像标签来定义不同的镜像

可以使用 inspect命令查看镜像的详细信息

[root@mufeng63 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        5.7       c20987f18b13   15 months ago   448MB

[root@mufeng63 ~]# docker image inspect mysql:5.7
[
    {
        "Id": "sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76",
        "RepoTags": [
            "mysql:5.7"
        ],
        "RepoDigests": [
            "mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2021-12-21T02:56:51.419272329Z",
        "Container": "6ab3c250aff0cce746e68539255208e6468cfe4a745272cd0d765394038caa18",
        "ContainerConfig": {
            "Hostname": "6ab3c250aff0",

使用history还可以查看历史镜像,也就是查看各个层具体内容是什么,各层的创建信息。

【云原生】Docker的镜像实战指南-LMLPHP

4.3 给镜像打标签

为了方便在后续工作中使用特定镜像,还可以使用 docker tag 命令来为本地镜像任
意添加新的标签。例如,添加一个新的 mufengmysql:latest 镜像标签:

[root@mufeng63 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        5.7       c20987f18b13   15 months ago   448MB
[root@mufeng63 ~]# docker tag mysql:5.7 mufengmysql:latest
[root@mufeng63 ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mufengmysql   latest    c20987f18b13   15 months ago   448MB
mysql         5.7       c20987f18b13   15 months ago   448MB
[root@mufeng63 ~]# 

4.4 删除和清理镜像

  • 使用docker rmi 或者docker image rm 命令,可以加-f表示强制删除。
[root@mufeng63 ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
mufengmysql   latest    c20987f18b13   15 months ago   448MB
mysql         5.7       c20987f18b13   15 months ago   448MB
[root@mufeng63 ~]# docker rmi mufengmysql:latest 
Untagged: mufengmysql:latest
[root@mufeng63 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        5.7       c20987f18b13   15 months ago   448MB

  • 如果有容器的时候,需要先删除容器,在删除镜像,使用镜像ID删除:
[root@mufeng63 ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
mysql        5.7       c20987f18b13   15 months ago   448MB
[root@mufeng63 ~]# docker rmi c20987f18b13
Untagged: mysql:5.7
Untagged: mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Deleted: sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76
Deleted: sha256:6567396b065ee734fb2dbb80c8923324a778426dfd01969f091f1ab2d52c7989
Deleted: sha256:0910f12649d514b471f1583a16f672ab67e3d29d9833a15dc2df50dd5536e40f
Deleted: sha256:6682af2fb40555c448b84711c7302d0f86fc716bbe9c7dc7dbd739ef9d757150
Deleted: sha256:5c062c3ac20f576d24454e74781511a5f96739f289edaadf2de934d06e910b92
Deleted: sha256:8805862fcb6ef9deb32d4218e9e6377f35fb351a8be7abafdf1da358b2b287ba
Deleted: sha256:872d2f24c4c64a6795e86958fde075a273c35c82815f0a5025cce41edfef50c7
Deleted: sha256:6fdb3143b79e1be7181d32748dd9d4a845056dfe16ee4c827410e0edef5ad3da
Deleted: sha256:b0527c827c82a8f8f37f706fcb86c420819bb7d707a8de7b664b9ca491c96838
Deleted: sha256:75147f61f29796d6528486d8b1f9fb5d122709ea35620f8ffcea0e0ad2ab0cd0
Deleted: sha256:2938c71ddf01643685879bf182b626f0a53b1356138ef73c40496182e84548aa
Deleted: sha256:ad6b69b549193f81b039a1d478bc896f6e460c77c1849a4374ab95f9a3d2cea2
[root@mufeng63 ~]# docker images
REPOSITORY   TAG       IMAGE ID   CREATED   SIZE
[root@mufeng63 ~]# 

  • 批量删除
# 停止所有容器

docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop

# 删除所有容器
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm


#  删除异常停止的docker容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'`

# 可以删除所有名字中带 “none” 关键字的镜像
docker rmi $(docker images | grep "none" | awk '{print $3}') 


# 删除所有镜像
docker image rm $(docker image ls -q) -f
# 删除所有镜像
docker rmi `docker images -q`


总结

以上就是关于容器镜像的全部内容,关注我,一起学习和探讨。

💕 好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
💕 博客主页:mufeng.blog.csdn.net
💕 本文由沐风晓月原创,首发于CSDN博客
💕 全力以赴,持续学习,不负如来不负卿,喜欢的话记得点赞收藏哦

04-08 14:36