Docker的配置和优化及镜像管理
Docker 镜像管理
镜像介绍
镜像介绍和结构

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

一个典型的 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。

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

范例: 查看镜像的分层结构
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
浙公网安备 33010602011771号