Docker的配置和优化及镜像管理

 

 

Docker 镜像管理

镜像介绍

 镜像介绍和结构

image

 

镜像即创建容器的模版,含有启动容器所需要的文件系统及所需要的内容,因此镜像主要用于方便和快速的创建并启动容器

镜像含里面是一层层的文件系统,叫做 Union FS(联合文件系统),联合文件系统,可以将几层目录挂载到一起(就像千层饼,洋葱头,俄罗斯套娃一样),形成一个虚拟文件系统,虚拟文件系统的目录结构就像普通 linux 的目录结构一样,镜像通过这些文件再加上宿主机的内核共同提供了一个 linux 的虚拟环境,每一层文件系统叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读
(readonly)、读写(readwrite)和写出(whiteout-able),但是镜像中每一层文件系统都是只读的,
构建镜像的时候,从一个最基本的操作系统开始,每个构建提交的操作都相当于做一层的修改,增加了
一层文件系统,一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层
把底层遮住了一样,当使用镜像的时候,我们只会看到一个完全的整体,不知道里面有几层,实际上也不
需要知道里面有几层,结构如下:

image

 

一个典型的 Linux文件系统由 bootfs 和 rootfs 两部分组成
bootfs(boot file system) 主要包含bootloader和kernel,bootloader主要用于引导加载 kernel,Linux
刚启动时会加载bootfs文件系统,当boot加载完成后,kernel 被加载到内存中后接管系统的控制权,bootfs
会被 umount 掉
rootfs (root file system) 包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc 等标准目录和文件,
不同的 linux 发行版(如 ubuntu 和 CentOS ) 主要在 rootfs 这一层会有所区别。
一般的镜像通常都比较小,官方提供的Ubuntu镜像只有60MB多点,而 CentOS 基础镜像也只有200MB
左右,一些其他版本的镜像甚至只有几MB,比如: busybox 才1.22MB,alpine镜像也只有5M左右。镜
像直接调用宿主机的内核,镜像中只提供 rootfs,也就是只需要包括最基本的命令,配置文件和程序库等
相关文件就可以了。
下图就是有两个不同的镜像在一个宿主机内核上实现不同的rootfs。

 

image

 

容器、镜像和父镜像关系: 

image

 

范例: 查看镜像的分层结构

docker pull nginx 

#查看镜像分层历史

docker image history nginx 

[root@master2 ~]# docker image history nginx 
IMAGE          CREATED      CREATED BY                                      SIZE      COMMENT
ec4ed8b5299e   5 days ago   CMD ["nginx" "-g" "daemon off;"]                0B        buildkit.dockerfile.v0
<missing>      5 days ago   STOPSIGNAL SIGQUIT                              0B        buildkit.dockerfile.v0
<missing>      5 days ago   EXPOSE map[80/tcp:{}]                           0B        buildkit.dockerfile.v0
<missing>      5 days ago   ENTRYPOINT ["/docker-entrypoint.sh"]            0B        buildkit.dockerfile.v0
<missing>      5 days ago   COPY 30-tune-worker-processes.sh /docker-ent…   8.19kB    buildkit.dockerfile.v0
<missing>      5 days ago   COPY 20-envsubst-on-templates.sh /docker-ent…   4.1kB     buildkit.dockerfile.v0
<missing>      5 days ago   COPY 15-local-resolvers.envsh /docker-entryp…   4.1kB     buildkit.dockerfile.v0
<missing>      5 days ago   COPY 10-listen-on-ipv6-by-default.sh /docker…   4.1kB     buildkit.dockerfile.v0
<missing>      5 days ago   COPY docker-entrypoint.sh / # buildkit          4.1kB     buildkit.dockerfile.v0
<missing>      5 days ago   RUN /bin/sh -c set -x     && groupadd --syst…   85.7MB    buildkit.dockerfile.v0
<missing>      5 days ago   ENV DYNPKG_RELEASE=1~trixie                     0B        buildkit.dockerfile.v0
<missing>      5 days ago   ENV PKG_RELEASE=1~trixie                        0B        buildkit.dockerfile.v0
<missing>      5 days ago   ENV ACME_VERSION=0.4.1                          0B        buildkit.dockerfile.v0
<missing>      5 days ago   ENV NJS_RELEASE=1~trixie                        0B        buildkit.dockerfile.v0
<missing>      5 days ago   ENV NJS_VERSION=0.9.9                           0B        buildkit.dockerfile.v0
<missing>      5 days ago   ENV NGINX_VERSION=1.31.2                        0B        buildkit.dockerfile.v0
<missing>      5 days ago   LABEL maintainer=NGINX Docker Maintainers <d…   0B        buildkit.dockerfile.v0
<missing>      6 days ago   # debian.sh --arch 'amd64' out/ 'trixie' '@1…   85.9MB    debuerreotype 0.17

 

镜像仓库 Registry
统一保存镜像而且是多个不同镜像版本的地方,叫做镜像仓库

  • Docker hub: docker官方的公共仓库,已经保存了大量的常用镜像,可以方便大家直接使用
  • 阿里云,网易等第三方镜像的公共仓库
  • Image registry: docker 官方提供的私有仓库部署工具,无web管理界面,目前使用较少
  • Harbor: vmware 提供的自带web界面自带认证功能的镜像私有仓库,目前有很多公司使用

镜像的地址格式

nginx = docker.io/library/nginx:latest
nginx:latest
nginx:1.20.0
docker.io/library/nginx:1.20.0
docker.io/library/alpine
registry.cn-hangzhou.aliyuncs.com/wangxiaochun/busybox:v1.0
harbor.wang.org/project/centos:7.2.1511
172.20.0.100/project/centos: latest

 

搜索镜像

 搜索镜像

官方网站进行镜像的搜索
docker 官网:
http://hub.docker.com
http://dockerhub.com

https://hub-stage.docker.com/

 

在官方的docker 仓库中搜索指定名称的docker镜像,也会有很多三方镜像。
第三方仓库

https://quay.io/ #红帽公司维护
https://registry.k8s.io  #kubernetes 仓库
http://cr.console.aliyun.com #阿里云仓库

 

Alpine 介绍

Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得
到开源社区越来越多的青睐。在保持瘦身的同时,Alpine 还提供了自己的包管理工具 apk,可以通过 https://pkgs.alpinelinux.org/packages 网站上查询包信息,也可以直接通过 apk 命令直接查询和安装各种软件。

Alpine 由非商业组织维护的,支持广泛场景的 Linux发行版,它特别为资深/重度Linux用户而优化,关
注安全,性能和资源效能。Alpine 镜像可以适用于更多常用场景,并且是一个优秀的可以适用于生产的
基础系统/环境。


Alpine Docker 镜像也继承了 Alpine Linux 发行版的这些优势。相比于其他 Docker 镜像,它的容量非
常小,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 200 MB),且拥有非常友好的包管理机制。
官方镜像来自 docker-alpine 项目。
目前 Docker 官方已开始推荐使用 Alpine 替代之前的 Ubuntu 做为基础镜像环境。这样会带来多个好
处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等

下表是官方镜像的大小比较: 

REPOSITORY         TAG           IMAGE ID         VIRTUAL SIZE
busybox             latest       beae173ccac6      1.24MB
alpine             latest       4e38e38c8ce0      4.799 MB
debian             latest       4d6ce913b130      84.98 MB
ubuntu             latest       b39b81afc8ca      188.3 MB
centos             latest       8efe422e6104      210 MB

Alpine 官网: https://www.alpinelinux.org/
Alpine 官方仓库: https://github.com/alpinelinux
Alpine 官方镜像: https://hub.docker.com/_/alpine/
Alpine 官方镜像仓库: https://github.com/gliderlabs/docker-alpine
Alpine 阿里云的镜像仓库: https://mirrors.aliyun.com/alpine/

 

docker pull alpine:3.11.3

范例: alpine 管理软件

 

/ # cat /etc/apk/repositories
https://dl-cdn.alpinelinux.org/alpine/v3.15/main
https://dl-cdn.alpinelinux.org/alpine/v3.15/community
#修改源替换成国内源
sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/' /etc/apk/repositories
sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/'
/etc/apk/repositories
sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/' /etc/apk/repositories

 

#更新源
apk update #相当于 apt update

#安装软件
apk add vim#相当于 apt install vim

#删除软件
apk del openssh openntp vim #相当于 apt remove openssh

#安装常见软件
apk update && apk --no-cache add bash curl telnet  wget net-tools pstree zip
unzip

#安装常用编译工具
apk update && apk --no-cache add gcc make curl zip unzip net-tools pstree wget
libgcc libc-dev libcurl libc-utils pcre-dev zlib-dev libnfs pcre pcre2 libevent
libevent-dev iproute2

 

下载镜像
从 docker 仓库将镜像下载到本地,命令格式如下:

NAME: 是镜像名,格式:仓库服务器:端口/项目名称/镜像名称,仓库服务器:端口/项目名称/可以省略,默认
docker.io/library/
TAG: 即版本号,如果不指定:TAG,则下载最新版镜像,即latest

 

查看本地镜像

docker images 可以查看下载至本地的镜像

https://docs.docker.com/engine/reference/commandline/images/

 

执行结果的显示信息说明:

REPOSITORY      #镜像所属的仓库名称
TAG         #镜像版本号(标识符),默认为latest
IMAGE ID       #镜像唯一ID标识,如果ID相同,说明是同一个镜像有多个名称
CREATED       #镜像在仓库中被创建时间
VIRTUAL SIZE    #镜像的大小

docker images --format命令用于指定在输出中显示映像信息的格式。格式字符串由多个占位符组成,
每个占位符代表映像的特定属性。

#常用的格式占位符:Golang的模
{{.Repository}}:映像的仓库名称。
{{.Tag}}:映像的标签。
{{.ID}}:映像的ID。
{{.Digest}}:映像的摘要值。
{{.CreatedAt}}:映像的创建时间。
{{.Size}}:映像的大小。

 

#示例

docker images --format "{{.Repository}}\t{{.Tag}}\t{{.Size}}"

 

#只查看指定REPOSITORY的镜像

docker images tomcat

 

#只查看镜像的REPOSITORY和TAG

docker images --format "{{.Repository}}:{{.Tag}}"
nginx:latest
alpine:3.11.3

 

 

镜像导出
利用docker save命令可以将从本地镜像导出为一个打包 tar文件,然后复制到其他服务器进行导入使用
注意:镜像导出支持多个镜像导出

 

常见用法: 

#导出为tar格式
docker save -o /path/file.tar IMAGE1 IMAGE2 ...

docker save IMAGE1 IMAGE2 ... > /path/file.tar

 

#说明:
Docker save 使用IMAGE ID导出,在导入后的镜像没有REPOSITORY和TAG,显示为<none>

 

范例: 导出指定镜像

[root@master2 ~]# docker images
                                                                                                                                       i Info →   U  In Use
IMAGE           ID             DISK USAGE   CONTENT SIZE   EXTRA
alpine:3.11.3   ab00606a4262       8.64MB          2.8MB        
nginx:latest    ec4ed8b5299e        238MB           66MB        

 

docker save -o nginx.tar nginx:latest

docker save -o alpine.tar alpine:3.11.3

docker save ec4ed8b5299e > nginx.tar

docker save alpine:3.11.3 nginx:latest  > m.tar

scp nginx.tar   10.0.0.7:/data 

 

范例:导出所有镜像到一个打包文件

#方法1:

docker save `docker images | awk 'NR>1 {print $1}'` > all.tar

#方法2:

docker images | awk 'NR>1 {print $1}'|xargs docker save -o all2.tar

#方法3:

将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG

docker images --format "{{.Repository}}:{{.Tag}}"|xargs docker save -o all3.tar

docker images --format "{{.Repository}}:{{.Tag}}"|xargs docker save > all4.tar 

#方法4:

将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG

docker save `docker images --format "{{.Repository}}:{{.Tag}}"` -o all5.tar 

 

镜像导入

利用docker load命令可以将镜像导出的打包或压缩文件再导入
注意:镜像导入只能支持单个镜像导入,不支持多个镜像导入

常见用法: 

docker load -i /path/file.tar

docker load < nginx.tar

[root@master2 ~]# docker images
                                                                                                                                       i Info →   U  In Use
IMAGE   ID             DISK USAGE   CONTENT SIZE   EXTRA

 

docker load -i nginx.tar

[root@master2 ~]# docker images           
                                                                                                                                       i Info →   U  In Use
IMAGE          ID             DISK USAGE   CONTENT SIZE   EXTRA
nginx:latest   ec4ed8b5299e        238MB           66MB  

 

docker load < nginx.tar

 

范例: 一次导出多个镜像

docker images

docker save `docker images | awk 'NR>1 {print $1}'` > all.tar

docker load  < all.tar

 

面试题: 将一台主机的所有镜像传到另一台主机

docker images

#方法1:将所有镜像导入到一个文件中,此方法导入后可以看REPOSITORY和TAG

docker image save `docker image --format " {{.Repository}}:{{.Tag}}"` -o all.tar
scp all.tar 10.0.0.100:/data

docker load -i /data/all.tar

docker images

 

 

镜像打标签

docker tag 可以给镜像打标签,类似于起别名,但通常要遵守一定的命名规范,才可以上传到指定的仓库

格式

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

 

#TARGET_IMAGE[:TAG]格式一般形式
仓库主机FQDN或IP[:端口]/项目名(或用户名)/image名字:版本

 

[root@master2 ~]# docker images -a       
                                                                                                                                       i Info →   U  In Use
IMAGE        ID             DISK USAGE   CONTENT SIZE   EXTRA
<untagged>   ec4ed8b5299e        238MB           66MB   

docker tag ec4ed8b5299e nginx:latest

[root@master2 ~]# docker images 
                                                                                                                                       i Info →   U  In Use
IMAGE          ID             DISK USAGE   CONTENT SIZE   EXTRA
nginx:latest   ec4ed8b5299e        238MB           66MB     

docker tag alpine alpine:3.11

 

 

 

清理dangling状态的镜像
dangling images表示TAG为的镜像
范例:删除dangling状态的镜像

#dangling images表示TAG为<none>的镜像

[root@master2 ~]# docker images
                                                                                                                                       i Info →   U  In Use
IMAGE   ID             DISK USAGE   CONTENT SIZE   EXTRA
[root@master2 ~]# 
[root@master2 ~]# docker images -q -f dangling=true
ec4ed8b5299e

范例: 清除dangling和不再使用的镜像

docker image prune

[root@master2 ~]# docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: sha256:ec4ed8b5299e5e90694af7750eb6dffd2627317d30544d056b0371f8082f7bce
deleted: sha256:ec4ed8b5299e5e90694af7750eb6dffd2627317d30544d056b0371f8082f7bce
deleted: sha256:3b2371e667437fb3b406f090081775daf1ebcdb981d19bc497703b150f49e356
deleted: sha256:bc43fdf9d4cb5c6feaff3c85b6e3163763df21db594ec9e4f8c9238725e48d39

Total reclaimed space: 65.99MB
[root@master2 ~]# docker images
                                                                                                                                       i Info →   U  In Use
IMAGE   ID             DISK USAGE   CONTENT SIZE   EXTRA
[root@master2 ~]# docker images -q -f dangling=true

 

docker image prune -a -f

 

删除镜像

docker rmi 命令可以删除本地镜像

docker images

docker rmi ec4ed8b5299e

docker rmi alpine:3.11.3

 

范例: 删除所有镜像

docker rmi -f `docker images -q`

docker rmi -f `docker images -qa`

docker images -qa|xargs docker rmi

docker images -qa|xargs docker rmi -f

 

 

拉取不可描述的镜像
利用下面网站做代理,可以实现拉取原本从国内可能无法直接访问的镜像

https://docker.aityp.com/
https://dockerproxy.com/
https://github.com/DaoCloud/public-image-mirror
https://github.com/kubesre/docker-registry-mirrors/

#输入无法拉取的镜像路径,生成代理拉取镜像的命令
registry.k8s.io/ingress-nginx/controller:v1.9.1

 

#无法直接下载指定镜像

docker pull registry.k8s.io/ingress-nginx/controller:v1.9.1

 

#执行上面网站生成代理拉取镜像命令,拉取成功

docker pull swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/controller:v1.9.1

#确认拉取成功

docker images

#重新打上原来的标签

docker tag swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/controller:v1.9.1  registry.k8s.io/ingress-nginx/controller:v1.9.1

#确认标签

[root@master2 ~]# docker images
                                                                                                                                       i Info →   U  In Use
IMAGE                                                                                      ID             DISK USAGE   CONTENT SIZE   EXTRA
registry.k8s.io/ingress-nginx/controller:v1.9.1                                            65c804ad254a        417MB          118MB        
swr.cn-north-4.myhuaweicloud.com/ddn-k8s/registry.k8s.io/ingress-nginx/controller:v1.9.1   65c804ad254a        417MB          118MB        
[root@master2 ~]# 

#删除代理的标签,只保留原有标签

docker rmi registry.k8s.io/ingress-nginx/controller:v1.9.1

#确认只有原有标签

docker images

 

 

posted @ 2026-06-30 20:40  minger_lcm  阅读(13)  评论(0)    收藏  举报