Docker(二) dockerfile创建镜像(图文)

目录

零:docker镜像原理

0.1:镜像分层的理解

0.2:镜像分层的优势

0.3:docker镜像本质

一:创建镜像

1.1:容器转镜像

1.2:镜像的导入与导出

1.3:docker file

1.4:docker file实例


零:docker镜像原理

0.1:镜像分层的理解

        对于一个多层蛋糕来说,其味道是由组成它的各层的口味共同决定的。

        docker镜像(image)就像是个多层蛋糕。

        如果我们要制作一个依赖jar包镜像,可能会包含三层内容。第一层:操作系统层、第二层:jdk层、、第三层: 依赖jar包层(这层独立的原因,详见这篇《如何打一个瘦jar包》)。

        这样的一个镜像主要作为辅助镜像存在。后续部门或公司的任何工程都能基于这个镜像来制作业务的镜像。

0.2:镜像分层的优势

        一:利于复用和扩展。镜像分层的方式它类似于面向对象编程的“继承”的思想,如果想扩展镜像的功能,只需要追加新的层即可。

        二:便于更新。例如一个存在两个版本的镜像,其版本分别为1.0和2.0,大小分别为100兆和120兆。同时两个版本中有95兆的共有层内容。那么我们先拉取了1.0版本,然后再拉取2.0版本的时候。那么我们并非将高版本的120兆全部拉取下来。而是只拉取除了95兆部分的25兆非共享内容即可。(这部分原理见下面的docker file)

0.3:docker镜像本质

        其本质是一个分层的文件系统。

        这里使用的技术叫“统一文件系统(union file system)”。这种技术可以将不同层整合成一个文件系统,这可以让使用者觉得镜像是一个整体,感受不到多个层的存在。

一:创建镜像

1.1:容器转镜像

        通过命令将容器转为镜像,这样做的好处是能比较直观的扩展镜像的内容。要注意以下几点

        1:以数据卷的形式加载到容器中的内容,不能被docker commit命令导出。容器中其他路径的内容可以被导出。

        2:创建的容器名需要小写。

# 容器转镜像的命令:docker commit 容器id 镜像名称:版本号
[root@docker01 ~]# docker commit de0ad6f0ef3b centosvolumn:1.0

1.2:镜像的导入与导出

        为了方便镜像的传输,一般使用docker的导入导出命令来实现。如下所示。

# 导出镜像的命令: docker save -o 包名.扩展名 镜像名:版本号
[root@docker01 ~]# docker save -o centosvolumn.tar centosvolumn:1.0 

# 导入镜像的命令: docker load -i 包名.扩展名
[root@docker01 ~]# docker load -i centosvolumn.tar

1.3:docker file

        docker file是包含了很多指令的文本文件。下面分别以centos7 和redis7 的官方镜像的docker file为例进行演示。

        进入 https://hub.docker.com 搜索 centos 的官方镜像,如下图所示

        Docker(二) dockerfile创建镜像(图文)_第1张图片

         点击某个版本镜像的dockerfile连接,进入github网站,可以看到如下图红框所示的dockerfile内容。其中的"FROM"、"ADD"、"LABEL"、"CMD"等红色字体是关键字。from表示集成的父级镜像是谁,add表示需要添加哪些内容到镜像中,label中的内容多为说明性内容可忽略,cmd是创建执行的命令。

        Docker(二) dockerfile创建镜像(图文)_第2张图片

        下图是redis7 的dockerfile,其内容较多,其中"ENV"关键字表示需要设置的环境变量,"RUN"是需要执行的一系列命令," EXPOSE"是暴露的端口,"WORKDIR"是redis程序运行的路径。

        Docker(二) dockerfile创建镜像(图文)_第3张图片

        dockerfile的命令很多,在此不一一列举和说明,后续应该会写专题博客来详述。

1.4:docker file实例

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 .

        第四步,查看效果,如下图红框中的内容即新增出来的镜像

        Docker(二) dockerfile创建镜像(图文)_第4张图片

         第五步,以新创建的镜像运行容器,可以在容器中看到java的信息和vim的效果,如下图所示

        Docker(二) dockerfile创建镜像(图文)_第5张图片       

你可能感兴趣的:(docker)