Docker容器数据卷和DockerFile

1. 引言

  • 对于Java语言,我们需要编写java源代码,然后用编译器对源代码文件进行编译得到class文件,最后虚拟机再对class文件进行解释执行

  • Docker中,我们该如何生成自己的镜像,然后把镜像放到镜像库中呢?这就需要用到DockerFile

  • Redis中,我们想把数据持久化到硬盘上,我们采用AOF或者RDB的方式,但对于Docker容器如何实现数据在宿主机和容器间进行共享持久化呢?这就需要用到数据卷。

2. Docker容器数据卷

2.1 容器数据卷是什么?

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

2.2 容器数据卷能干嘛?

  • 可以完成容器到宿主主机、宿主主机到容器的双方向数据共享
  • 特点
    • 数据卷可在容器之间共享或重用数据
    • 卷中的更改可以直接生效
    • 数据卷中的更改不会包含在镜像的更新中
    • 数据卷的生命周期一直持续到没有容器使用它为止
  • 卷的设计目的就是数据的持久化,完全独立于容器的生成周期,因此Docker不会在容器删除时删除其挂载的数据卷

2.3 数据卷添加

方式一:在容器内添加

方式二:DockerFile添加

2.3.1 直接命令添加

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

  • 执行以下命令:
    docker run -it -v /myDataVolume:/dataVolumeContain centos

2.3.2 查看数据卷是否挂载成功

  • 查看数据卷是否起作用:
    docker inspect 镜像ID

这里写图片描述

2.3.3 容器和宿主机之间数据共享

容器停止退出后,主机修改后数据是否可以同步到容器?答案:可以

2.3.4 命令(带权限)

  • 命令:docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名(容器内readonly,只读,不可写)

  • 执行以下命令:
    docker run -it -v /myDataVolume:/dataVolumeContain:ro centos

  • 查看数据卷是否起作用:
    docker inspect 镜像ID

这里写图片描述
此方式,容器中数据卷只读

3. DockerFile介绍

3.1 DockerFile是什么

  • DockerFile为镜像模板的描述文件
  • DockerFile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本

3.2 DockerFile构建过程解析

  • DockerFile文件说明:
    • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
    • 指令按照从上到下,顺序执行
    • #表示注释
    • 每条指令都会创建一个新的镜像层,并对镜像进行提交
  • Docker执行DockerFile的大致流程:
    • docker从基础镜像运行一个容器
    • 执行一条指令并对容器作出修改
    • 执行类似docker commit的操作提交一个新的镜像层
    • docker再基于刚提交的镜像运行一个新容器
    • 执行dockerfile中的下一条指令直到所有指令都执行完成

3.3 如何自定义构建一个镜像?

  • 编写DockerFile文件

  • docker build

    docker build -f /mydocker/Dockerfile -t scorpios/centos .

  • docker run

4. DockerFile体系结构说明

参数说明
FROM基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER镜像维护者的姓名和邮箱地址
RUN容器构建时需要运行的命令
EXPOSE当前容器对外暴露的端口
WORKDIR指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点
ENV用来在构建镜像过程中设置环境变量
ADD将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY类似ADD,拷贝文件和目录到镜像中。将从构建上下文<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
VOLUME容器数据卷,用于数据保存和持久化工作
CMD
ENTRYPOINT
ONBUILD

当使用DockerFile中的VOLUME属性添加数据卷时:
这里写图片描述

5. 使用DockerFile构建镜像

5.1 需求

使原始的centos7镜像,具备以下功能:vim+ifconfig+jdk8

5.2 Jdk8下载

Jdk8镜像下载地址:https://www.oracle.com/java/technologies/downloads/#java8

把下载好的Jdk8包上传到服务器上

5.3 编写DockerFile

Dockerfile文件的第一个字母必须为大写:D

FROM centos
MAINTAINER scorpios<scorpios@163.com>
 
ENV MYPATH /usr/local
WORKDIR $MYPATH
 
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u171-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u171-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
 
EXPOSE 80
 
CMD echo $MYPATH
CMD echo "success--------------ok"
CMD /bin/bash

5.4 构建

  • docker build -t 新镜像名字:TAG .
  • docker build -t mycentos7:1.2.1 .

上面TAG后面有个空格,有个点

5.5 运行镜像

查看镜像并运行镜像:

  • docker run -it 新镜像名字:TAG
  • eg:docker run -it mycentos7:1.2.1

6. 虚悬镜像

  • 仓库名、标签都是<none>的镜像,俗称dangling image
  • 查看虚悬镜像:docker image ls -f dangling=true
  • 删除:docker image prune
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

止步前行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值