-
将运用与运行的环境打包形成容器运行,运行可以伴随着容器,担心我们对数据的要求希望是持久化的
-
容器之间希望有可能共享数据
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个容器
-
启动镜像dc01
-
docker run -it --name dc01 镜像名
-
在dataVolumeContainer2中新增内容
-
-
dc02和dc03继承自dc01
-
volumes-from
-
docker run -it --name dc02 --volumes -from dc01 镜像名
-
docker run -it --name dc03 --volumes -from dc01 镜像名
-
分别在在dataVolumeContainer2中新增内容
-
-
回到dc01可以看到02/03各自添加的都能共享
-
删除dc01,dc2修改后dc03可以访问
-
删除dc02后dc03可以访问
-
新增dc04继承dc03在删除dc03
-
结论:容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器去使用它为止
四、DockerFile
DockerFile是用来构建docker镜像的构建文件,是由一系列命令和参数构成的脚本
构建三步骤
-
编写DockerFile文件
-
docker build
-
docker run
五、DockerFile构建过程解析
DockerFile内容基础知识
-
每条保留字之类都必须为大写字母且后面要跟随至少一个参数
-
指令按照从上到下,顺序执行
-
#表示注解
-
每条命令都会创建一个新的镜像层,并对镜像进行提交
Docker执行DockerFile的大致流程
-
docker从基础镜像运行一个容器
-
执行一条命令对容器作出修改
-
执行类似docker commit的操作提交一个新的镜像层
-
docker再基于刚提交的镜像云运行一个新容器
-
执行dockerfile中的下一条指令直到所有命令都执行完成
从应用软件的角度来看,DockerFile、Docker镜像与Docker容器分别代表软件的三个不同阶段
-
DockerFile是软件的原材料
-
Docker镜像是软件的交付品
-
Docker容器则可以认为是软件运行态
DockerFile面向开发,Docker镜像成为交付标准,Docker容器涉及部署与运维,三者缺一不可,合理充当Docker体系的基石
-
DockerFile,需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的东西包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版本、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等待。
-
Docker镜像,在用DockerFile定义一个文件之后,dockerBuild时会产生一个Docker镜像时,会真正开始提供服务。
-
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使用数据卷容器,就可以很方便的发布程序了