应用程序或者环境依赖以Docker的形式打包以后就是Docker镜像,镜像可以作为模板运行创建、启动容器,从而运行应用程序。
镜像的唯一标识是长度128位的Image ID(跟Container ID相似),也可以使用前16位表示;也可以使用镜像的名字(REPOSITORY)和版本号(TAG)两部分组合唯一标示,如mariadb:latest。
1.镜像分层
Docker镜像采用分层机制,相同的部分独立成为一个文件层级,如果有多个镜像包含相同的文件层级,同一台机器上只需要保持一份即可,大大节省镜像空间。
Docker的镜像通过联合文件系统(Union FileSystem)将各层文件系统叠加成一个完成的文件系统。docker history IMAGE
命令可以查看镜像的分层信息。
已有的分层只能读不能修改,并且上层优先级高于下层优先级,如果需要修改下层的文件,需要在原有镜像分层的基础上添加一个空白层,空白层中可以描述对下层文件的修改。
2.生成镜像
2.1 通过docker commit命令从容器生成镜像
大致步骤为基于镜像创建容器 --> 在容器中修改部分内容 --> 使用docker commit生成新镜像
。
这种方式生成镜像,层数越来越多,可能超过联合文件系统允许的最大层数;另外,如果需要修改镜像,尤其是底层镜像,上层镜像需要跟着一起修改时,通过容器方式生成新镜像,工作量巨大,维护困难。
2.2 通过Dockerfile生成镜像(推荐)
这种方式生成镜像与Linux系统中的make工具类似,make工具依赖于Makefile文件,Makefile文件描述了整个工程所有文件的编译顺序、编译规则,Makefile有自己的书写格式、关键字、函数。通过Makefile文件,make工具才能做到以一行命令完成程序的自动编译。
Docker使用了同样的机制来创建镜像,Dockerfile起到了至关重要的作用。
3.镜像相关命令
3.1 查看本地镜像
docker images
3.2 查找Docker仓库中的镜像
docker search IMAGE
3.3 从Docker仓库下载镜像
dokcer pull IMAGE
3.4 以镜像为模板创建并启动容器
docker run IMAGE
3.5 将容器提交为新镜像
docker commit [选项] CONTAINER_ID IMAGE
选项
-m "改动信息"
-a "作者相关信息"
3.6 向Docker仓库推送镜像
docker push IMAGE
3.7 删除指定名称镜像
docker rmi IMAGE
3.8 删除所有镜像
docker rmi -f $(docker images)
4.实例
通过MariaDB镜像创建并启动容器,同时指定容器名称(--name)、映射本地端口(-p)、配置环境变量(-e)、绑定数据卷(-v [host-dir]:[container-dir]:[rw|ro]),并且后台运行(-d)。
sudo docker run --name mariadb \
-v /data/mariadb/data:/var/lib/mysql \
-p 3307:3306 \
-e MYSQL_ROOT_PASSWORD= \
-e MYSQL_ROOT_HOST=% \
-d mariadb:10.2
网友评论