docker镜像管理
镜像结构和原理
镜像就是创建容器的模板,含有启动容器所需要的文件系统及所需要的内容,因此镜像主要用于方便和快速的创建并启动容器
镜像理由是一层一层的文件系统:Union FS(联合文件系统),可以将几层目录挂载到一起(类似俄罗斯套娃),形成一个虚拟文件系统,虚拟文件系统的目录结构就像普通 linux 目录结构一样,镜像通过这些文件,再加上宿主机的内核共同构成了一个 linux 的虚拟环境,每一层文件系统叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限:readonly、readwrite、writeout-able。但是镜像中每一层文件系统都是只读的,构建镜像的时候,从一个最基本的操作系统开始,每个构建提交的操作都相当与做一层的修改,增加了一层文件系统,一层层往上叠加,上层的修改会覆盖底层该位置的可见性,当使用镜像的时候,我们只会看见一个整体,并不知道里面有几层,实际上也不需要知道
一个典型的 Linux 文件系统由 bootfs 和 rootfs 两部分组成
bootfs(boot file system)主要包含 bootloader 和 kernel,bootloader 主要用于引导加载 kernel。系统刚启动时会加载 bootfs 文件系统,kernel 加载到内存后,接管系统的控制权,bootfs 就会被 umount 掉
rootfs(root file system)就是我们看到的/dev、/proc、/bin、/etc 等目录和文件,不同的 linux 发行版本(如 ubuntu 和 centos)主要在 rootfs 这一层会有所区别
一般的镜像通常都比较小,镜像直接调用宿主机的内核,镜像中只提供 rootfs,也就是只需包括最基本的命令、配置文件和程序库等相关文件就可以了
容器、镜像和父镜像关系:
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 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。
- 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/
1 | #修改源替换成阿里源:将/etc/apk/repositories中的 dl-cdn.alpinelinux.org 改成 mirrors.aliyun.com |
搜索镜像
- 官方网站进行镜像的搜索:http://hub.docker.com
- 执行
docker search
命令进行搜索
如果联网下载,一般不会使用命令搜索,而是去官网搜索
docker 镜像加速
登录阿里云 –> 容器镜像服务 –> 镜像中心 –> 镜像加速器
1 | sudo mkdir -p /etc/docker |
docker image
1 | # docker help image |
下载镜像 pull
1 | # docker help pull |
1 | [root@ubuntu1804 ~]#docker pull hello-world |
1 | $ docker pull nginx:stable-alpine |
下载后的镜像位于:
1 | /var/lib/docker/overlay2/镜像ID |
查看镜像分层历史 history
1 | $ docker image history nginx:latest |
查看容器详细信息 inspect
1 | $ docker image inspect nginx:latest |
查看本地镜像 ls
等同于 docker images
1 | # docker image ls --help |
1 | $ docker image ls |
REPOSITORY 仓库:
- 由某特定的 docker 镜像的所有迭代版本组成的镜像仓库
- 一个 Registry 中可以存在多个 Repository
- Repository 可分为“顶层仓库”和“用户仓库”
- Repository 用户仓库名称一般格式为“用户名/仓库名”
- 每个 Repository 仓库可以包含多个 Tag(标签),每个标签对应一个镜像
镜像导出 save
将本地镜像导出为一个文件(tar 格式),然后复制到其他服务器,导入使用
1 | # docker help image save |
常见用法:以下两种用法等价
1 | docker save -o /path/file.tar IMAGE1 IMAGE2 ... |
镜像导入 load
save
导出的镜像 tar 文件,使用load
导入
1 | # docker help image load |
常见用法:以下两种用法等价
1 | docker load -i /data/myimages.tar |
删除镜像 rm
删除本地镜像
1 | # docker help image rm |
1 | alias rmi='docker image ls -aq | xargs -n1 docker image rm' |
镜像打标签 tag
给镜像打标签,类似于起别名,但通常要遵守一定的命名规范,才可以上传到指定的仓库
1 | docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG] |
tag 默认为 latest
先 tag 给镜像打标签,然后再 save 导出镜像,拷贝到其他机器,其他机器可以 load 导入