Docker容器虚拟化(四):容器数据卷与DockerFile

  • 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,担心我们对数据的要求希望是持久化的

  • 容器之间希望有可能共享数据

Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然就没有了。

为了能保存数据在docker中我们使用卷

一、数据卷

        卷就是目录或者文件,存在于一个或多个容器中,由docker挂载到容器中,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或者共享数据的特效:

        卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会再容器删除时删除其挂载的数据卷。

特点:

  • 数据卷可以在容器之间共享或者重用数据

  • 卷中的更改可以直接生效

  • 数据卷中的更改不会包含在镜像的更新中

  • 数据卷的生命周期一直持续到没有容器使用它为止

二、容器内添加数据卷

  • 直接命令添加

    • docker run -it -v /宿主机绝对路径目录:/容器内路径 镜像名

    • 查看数据是否挂载成功 docker inspect 容器id   查看json中的Volumes属性Binds属性

    • 在宿主机中的目录下新建host.txt文件,容器内对应的路径也会存在host.txt文件,在容器内修改host文件 添加文字,宿主机内的文件也被修改

    • 容器停止退出后,主机修改后数据也是同步的

      • 容器使用exit停止退出

      • 主机修改host.txt文件

      • 容器重新启动并进入

      • 查看主机修改过的host.txt文件

      • 内容同步

    • 带权限的卷  docker run -it -v /宿主机绝对路径目录:/容器内路径:ro 镜像名   只读卷宿主机可读可写,容器只可读

  • DockerFile添加

    • 在根目录下添加mydocker文件夹并进入

    • 可在DockerFile中使用VOLUME命令来给镜像添加一个或多个数据卷

      • VOLUME["/dataVolumeContainer","/dataVolumeContainer2","/dataVolumeContainer3"](这里都是容器的路径)

      • 出于可移植和分享的考虑,用于-v主机目录:容器目录这种方法不能够直接在DockerFile中实现。

      • 由于宿主机目录是依赖于特定宿主机的,并不能够保证在所有的宿主机上都存在这样的特定目录

    • 编写DockerFile

FROM centos
VOLUME["/dataVolumeContainer1","/dataVolumeContainer2"]
CMD echo "finished,------success1"
CMD /bin/bash
  • 使用build命令编译文件,新建镜像

    • docker build -f /文件所在目录 -t 编译后的镜像名称

  • 启动刚刚新建的镜像

  • 查看容器数据卷对应的宿主机上的目录

    • docker inspect 镜像id(宿主机上执行)

  • Docker挂载主机目录Docker访问出现cannot open directory.:Permission denied。

    • 解决方法:在挂载目录后面多加一个--privileged=true参数

三、数据卷容器

        命名的容器挂载数据卷,其他容器通过挂载的这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器

通过之前新建的镜像来实现数据共享,通过镜像实例出dc01、dc02、dc03  3个容器

  1. 启动镜像dc01

    1. docker run -it --name dc01 镜像名

    2. 在dataVolumeContainer2中新增内容

  2. dc02和dc03继承自dc01

    1. volumes-from

    2. docker run -it --name dc02 --volumes -from dc01 镜像名

    3. docker run -it --name dc03 --volumes -from dc01 镜像名

    4. 分别在在dataVolumeContainer2中新增内容

  3. 回到dc01可以看到02/03各自添加的都能共享

  4. 删除dc01,dc2修改后dc03可以访问

  5. 删除dc02后dc03可以访问

  6. 新增dc04继承dc03在删除dc03

  7. 结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器去使用它为止

四、DockerFile

DockerFile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本

构建三步骤

  1. 编写DockerFile文件

  2. docker build

  3. docker run

五、DockerFile构建过程解析

DockerFile内容基础知识

  • 每条保留字之类都必须为大写字母且后面要跟随至少一个参数

  • 指令按照从上到下,顺序执行

  • #表示注解

  • 每条命令都会创建一个新的镜像层,并对镜像进行提交

Docker执行DockerFile的大致流程

  1. docker从基础镜像运行一个容器

  2. 执行一条命令对容器作出修改

  3. 执行类似docker commit的操作提交一个新的镜像层

  4. docker再基于刚提交的镜像云运行一个新容器

  5. 执行dockerfile中的下一条指令直到所有命令都执行完成

从应用软件的角度来看,DockerFile、Docker镜像与Docker容器分别代表软件的三个不同阶段

  • DockerFile是软件的原材料

  • Docker镜像是软件的交付品

  • Docker容器则可以认为是软件运行态

DockerFile面向开发,Docker镜像成为交付标准,Docker容器涉及部署与运维,三者缺一不可,合理充当Docker体系的基石

  1. DockerFile,需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的东西包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版本、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等待。

  2. Docker镜像,在用DockerFile定义一个文件之后,dockerBuild时会产生一个Docker镜像时,会真正开始提供服务。

  3. Docker容器,容器是直接提供服务的。

六、DockerFile保留字指令

  • FROM:基础镜像,当前新镜像是基于哪个镜像的

  • MAINTAINER:镜像维护者的姓名和邮箱地址

  • RUN:容器构建时需要运行的命令

  • EXPOSE:当前容器对外暴露出的端口

  • WORKDIR:指定在创建容器后,终端默认登录的进来工作目录,一个落脚点

  • ENV:用来构建镜像过程中设置环境变量

    • ENV MY_PATH /usr/mytest

    • 这个环境变量可以在后学的任何RUN命令中使用,这就如同在命令前面定义了环境变量前缀一样;也可以直接在其他命令中直接使用这些环境变量。如:WORKDIR $MY_PATH

  • ADD:将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包

  • COPY:类似ADD,拷贝文件和目录到镜像中。

    • 将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内的<指定路径>位置

      • COPY src dest

      • COPY ["src","dest"]

  • VOLUME:容器数据卷,用于数据保存和持久化工作

  • CMD

    • 指定一个容器启动时需要运行的命令

    • DockerFile中可以有多个CMD指令, CMD会被 docker run 之后的参数替换

  • ENTRYPOINT

    • 指定一个容器启动时需要运行的命令

    • 但是不会被docker run参数覆盖  docker run会追加在后面

  • ONBUILD:当构建一个被继承的DockerFile时运行命令,父镜像在被子继承后父镜像的onbuild被触发

六、实战编写tomcat的DockerFile

先下载好jdk和tomcat的文件包,和DockerFile文件放在一起

FROM centos
#作者
MAINTAINER gyx
#宿主机中的文件拷贝到容器中
ADD jdk-8u171-linux-x64.tar.gz /usr/local/
ADD apache-tomcat-9.0.8.tar.gz /usr/local/
#安装vim编译器
RUN yum -y install vim
#设置工作路径
ENV MYPATH /usr/local
WORKDIR $MYPATH
#配置tomcat和jdk的环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_171
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.8
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.8
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin
#容器运行时监听的端口
EXPOSE 8080
#启动容器运行tomcat
CMD /usr/local/apache-tomcat-9.0.8/bin/startup.sh && -F /usr/local/apache-tomcat-9.0.8/bin/logs/catalina.out

启动的时候tomcat中的webapps使用数据卷容器,就可以很方便的发布程序了

猜你喜欢

转载自blog.csdn.net/qq_34886352/article/details/81906749