目录
零:docker镜像原理
0.1:镜像分层的理解
0.2:镜像分层的优势
0.3:docker镜像本质
一:创建镜像
1.1:容器转镜像
1.2:镜像的导入与导出
1.3:docker file
1.4:docker file实例
对于一个多层蛋糕来说,其味道是由组成它的各层的口味共同决定的。
docker镜像(image)就像是个多层蛋糕。
如果我们要制作一个依赖jar包镜像,可能会包含三层内容。第一层:操作系统层、第二层:jdk层、、第三层: 依赖jar包层(这层独立的原因,详见这篇《如何打一个瘦jar包》)。
这样的一个镜像主要作为辅助镜像存在。后续部门或公司的任何工程都能基于这个镜像来制作业务的镜像。
一:利于复用和扩展。镜像分层的方式它类似于面向对象编程的“继承”的思想,如果想扩展镜像的功能,只需要追加新的层即可。
二:便于更新。例如一个存在两个版本的镜像,其版本分别为1.0和2.0,大小分别为100兆和120兆。同时两个版本中有95兆的共有层内容。那么我们先拉取了1.0版本,然后再拉取2.0版本的时候。那么我们并非将高版本的120兆全部拉取下来。而是只拉取除了95兆部分的25兆非共享内容即可。(这部分原理见下面的docker file)
其本质是一个分层的文件系统。
这里使用的技术叫“统一文件系统(union file system)”。这种技术可以将不同层整合成一个文件系统,这可以让使用者觉得镜像是一个整体,感受不到多个层的存在。
通过命令将容器转为镜像,这样做的好处是能比较直观的扩展镜像的内容。要注意以下几点
1:以数据卷的形式加载到容器中的内容,不能被docker commit命令导出。容器中其他路径的内容可以被导出。
2:创建的容器名需要小写。
# 容器转镜像的命令:docker commit 容器id 镜像名称:版本号
[root@docker01 ~]# docker commit de0ad6f0ef3b centosvolumn:1.0
为了方便镜像的传输,一般使用docker的导入导出命令来实现。如下所示。
# 导出镜像的命令: docker save -o 包名.扩展名 镜像名:版本号
[root@docker01 ~]# docker save -o centosvolumn.tar centosvolumn:1.0
# 导入镜像的命令: docker load -i 包名.扩展名
[root@docker01 ~]# docker load -i centosvolumn.tar
docker file是包含了很多指令的文本文件。下面分别以centos7 和redis7 的官方镜像的docker file为例进行演示。
进入 https://hub.docker.com 搜索 centos 的官方镜像,如下图所示
点击某个版本镜像的dockerfile连接,进入github网站,可以看到如下图红框所示的dockerfile内容。其中的"FROM"、"ADD"、"LABEL"、"CMD"等红色字体是关键字。from表示集成的父级镜像是谁,add表示需要添加哪些内容到镜像中,label中的内容多为说明性内容可忽略,cmd是创建执行的命令。
下图是redis7 的dockerfile,其内容较多,其中"ENV"关键字表示需要设置的环境变量,"RUN"是需要执行的一系列命令," EXPOSE"是暴露的端口,"WORKDIR"是redis程序运行的路径。
dockerfile的命令很多,在此不一一列举和说明,后续应该会写专题博客来详述。
1.4.1 docker file 的编写。
我们先在宿主机上编写dockerfile。我想基于centos7 的官方镜像做扩展。编写一个包含了vim命令和java环境的 dokcer file。
第一步,将要用到的安装包放到宿主机的指定路径(这里我为了省事,直接将jdk的安装包放到了docker file的同目录下)
第二步,编写docker file。文件名随意,比如我的是 mycentos_java_dockerfile 内容如下所示
# 基础镜像名称 : 版本号
FROM centos:7
# 维护人员信息 姓名 <邮箱>
MAINTAINER darkdragonking
# 执行命令 创建目录
RUN mkdir /usr/local/java
# 执行的命令 安装vim
RUN yum install -y vim
# 将宿主机中的安装包复制到镜像中。 这里需要指明安装包的路径 以及 安装包在镜像中的路径
ADD openjdk-11.0.2_linux-x64_bin.tar.gz /usr/local/java/
# 设置java的环境变量。毋需再设置/etc/profile中的内容了
ENV JAVA_HOME /usr/local/java/jdk-11.0.2
ENV PATH $JAVA_HOME/bin:$PATH
# 设置进入容器后的工作目录
WORKDIR /usr/local
#启动容器后的命令
CMD /bin/bash
第三步,通过docker file生成 镜像
# 命令关键字 build -f参数后紧跟dockerfile文件名 -t参数后跟随的是期望的镜像名称和版本号。
# 别忘了最后的那个 . 这个点是为生成后的docker镜像指定上下文的路径。一般写个. 表示将当前的目录
# 作为上下文赋予新建的docker镜像。如果有特殊需要,可以将宿主机中的具体目录写在 . 的位置也可以。
[root@docker01 ~]# docker build -f centos_dockerfile -t mycentos7:1.0 .
第四步,查看效果,如下图红框中的内容即新增出来的镜像
第五步,以新创建的镜像运行容器,可以在容器中看到java的信息和vim的效果,如下图所示