镜像 docker image
Docker 镜像是什么
概念
- Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。
- 我们可以把 Docker image 理解成一个模板, 可以通过这个模板实例化出来很多容器。
- image 里面是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。
每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker 镜像中每一层文件系统都是只读的。
构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。
镜像生活案例
镜像相当于我们 java 或者 C++中的类,相当于一个模板,可以很方便的构建出来不同的对象。
镜像分层生活案例
我们以日常的地板为例,开发商的房子提供给用户的时候一般是做好了地暖,而这些地暖其实是一层一层添加的,最底层的钢筋水泥层,然后添加保温层,采暖管,再铺设水泥层,到最后交付的时候家家户户都是水泥面,这一层一般是不可修改的,最上层用户一般会再铺设商木地板或者地板砖每家每户的选择不一样,相当于我们镜像的容器层。
为什么需要镜像
在部署应用时,通过手工或写一些脚本的方式进行部署。这样部署面临问题就是云端和本地环境一致问题。用户为每个应用打包过程比较繁琐,需要配置和给配置文件修改等操作,非常费劲。
然而,Docker 镜像就是为了解决这个小小的打包功能,突然一夜之间成名。那么,你可能说 Docker 镜像就是个压缩包,是的,你猜对了,它就像一个压缩包文件。它是如何解决 Paas 时代所面临的云端和本地一致性问题?很简单,它是把一个镜像制作成一个完整的操作系统所有文件和对应的目录结构,这样的压缩包是跟你本地和测试环境用的操作系统一摸一样。
docker 最大的贡献就是定义了容器镜像的分层的存储格式,docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。
docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便的将其用于个人用途或与其他 Docker 用户公开共享。
镜像命令详解
1. 命令清单
命令 | 别名 | 功能 | 备注 |
---|---|---|---|
docker images | docker image ls/docker image list | 列出本地镜像 | 必须掌握 |
docker tag | docker image tag | 给镜像打标签,可用于推送镜像仓库 | 必须掌握 |
docker pull | docker image pull | 从镜像仓库拉取镜像 | 必须掌握 |
docker push | docker image push | 推送镜像到仓库 | 必须掌握 |
docker rmi | docker image rm/ docker image remove | 删除本地镜像 | 必须掌握 |
docker build | docker image build | 通过 dockerfile 制作镜像 | 必须掌握 |
docker save | docker image save | 将指定镜像保存成 tar 归档文件 | 必须掌握 |
docker load | docker image load | 导入使用docker save 命令导出的镜像 | 必需掌握 |
docker image inspect | 查看镜像详细信息 | 必需掌握 | |
docker history | docker image history | 查看镜像历史 | |
docker import | docker image import | 从归档文件docker export中创建镜像。 | |
docker image prune | 删除不使用的文件 |
2. docker images
功能: 列出本地镜像
语法
docker images [OPTIONS] [REPOSITORY[:TAG]]
3. docker tag
4. docker rmi
5. docker save
6. docker load
7. docker image inspect
8. docker history
9. docker import
10. docker image prune