当前位置: 首页 > news >正文

Docker之数据卷和Dockerfile

目录

 一、Docker数据管理

二、数据卷

创建数据卷 

查看数据卷

删除数据卷

挂载数据卷

三、数据卷容器

创建数据卷容器

测试数据卷容器

备份数据卷容器

还原数据卷容器

四、Dockerfile

什么是Dockerfile

基本结构

常用指令

快速入门

编写Dockerfile文件

构建镜像并测试


 一、Docker数据管理

在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。

容器中的管理数据主要有两种方式:

  • 数据卷(Data Volumes):容器内数据直接映射到本地主机环境;

  • 数据卷容器(Data Volume Containers): 使用特定容器维护数据卷;

如何使用docker cp命令在宿主机和docker容器之间复制文件:

docker cp 宿主机绝对路径 容器id:路径

二、数据卷

数据卷是 Docker容器中用于持久化数据的一种机制,它可以将容器内的数据存储到宿主机中,以便在容器被删除或重新创建时保留数据。

它可以提供很多有用的特性:

  • 数据卷可以在容器之间共享和重用;

  • 对数据卷的修改会立马生效;

  • 对数据卷的更新,不会影响镜像;

  • 数据卷默认会一直存在,即使容器被删除;

注意:数据卷的生命周期独立于容器的生命周期,因此即使容器被删除,数据卷中的数据仍然可以被保留。

创建数据卷 

docker volume create 数据卷名称

此时,数据卷默认会放到 /var/lib/docker/volumes 路径下,会发现所新建的数据卷位置,查看命令如下:

ls -1 /var/lib/docker/volumes

查看数据卷

 查看所有的数据卷:

docker volume ls

查看指定数据卷的详细信息(显示一个 JSON 格式的数据):

docker volume inspect 数据卷名称

删除数据卷

docker volume rm 数据卷名称

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷,无主的数据卷可能会占据很多空间,所以要及时删除。

挂载数据卷

创建数据卷并挂载中指定容器:

docker run -d \-it \--name tomcat01 \--mount source=my-vol,target=/webapp \centos:latest

上述命令是将 my-vol 数据卷挂载中容器 tomcat01 中的 webapp 目录。

注意: 1)my-vol 为要挂载的数据卷,如果数据卷不存在,docker 会自动创建;/webapp 为容器上目录,如果目录不存在, docker会自动创建。 2)加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车。

使用自定义目录充当数据卷并挂载到指定容器:  

docker run -d \-it \--name tomcat02 \--mount type=bind,source=/root/webapp02,target=/root/webapp02 \centos:latest  

--mount 选项的 type 参数支持三种类型的数据卷:

属性说明
type=volume

普通数据卷(默认即这种类型),映射到主机/var/lib/docker/volumes路径下

例如:--mount type=volume,source=my-vol,target=/webapp

type=bind

绑定数据卷,映射到主机指定路径下

例如:--mount type=bind,source=/webapp,target=/webapp2

type=tmpfs

临时数据卷,只存在于内存中

例如:--mount type=tmpfs,target=/app

三、数据卷容器

数据卷容器是一个特殊的容器,它的主要目的是提供一个持久化的存储空间,其他容器可以通过挂载这个容器中的数据卷来共享数据。数据卷容器本身不运行任何应用程序,它只是提供一个数据卷的存储空间。

当我们需要在多个容器之间共享数据时,可以使用数据卷容器。我们可以在一个容器中创建一个数据卷容器,并将需要共享的数据卷挂载到该容器中,其他容器可以通过挂载该数据卷容器中的数据卷来访问这些数据。

数据卷容器的好处是,它可以提供一个中心化的存储空间,容器之间可以通过挂载数据卷容器中的数据卷来共享数据,而不需要每个容器都去管理数据卷。此外,数据卷容器可以独立于其他容器进行管理和维护,可以方便地备份和恢复数据。

创建数据卷容器

创建一个名为 db_data 的容器,并设定该容器中的数据卷为 db_data 目录。

docker run -it -d --name db_data -v /db_data centos:latest

测试数据卷容器

 创建一个名为 db1 的容器,并设定数据卷容器为 db_data

docker run -it -d --name db1 --volumes-from db_data centos:latest

进入 db1 容器,并在容器的数据卷中创建文件测试是否挂载成功:

# 进入db1容器
docker exec -it db1 bash
# 切换进数据卷
cd db_data
# 创建文件
echo "db1 beifen test" > db1_test.txt

这时,可以发现在容器 db1 中创建的文件,同时出现在了 db_data 容器中的 db_data 数据卷目录中,则证明数据卷容器挂载测试成功。  

备份数据卷容器

新建1个名为 beifen 的(暂时性,之后会删除)容器,由于 volumes-from 了 db_data ,所以在根目录下也会生成1个 db_data 文件夹,经过执行命令后,将 db_data 文件下的数据压缩在 kongkong 文件夹下,并存在宿主机上的 container_backup 下

docker run --rm --name beifen --volumes-from db_data -v /kongkong:/container_backup centos:latest tar cvf /container_backup/backup.tar /db_data

属性介绍:

属性说明
runcreate+start
--rm创建之后删除容器
--name容器名称
--volumes-from来自于哪个数据卷容器的容器NAME
-v给容器挂载存储卷,挂载到容器的某个目录

还原数据卷容器

新建一个数据卷容器 db_data2 :

docker run -it -d --name db_data2 -v /db_data centos:latest

新建1个名为 huanyuan 的(暂时性,之后会删除)容器,由于 volumes-from 了 db_data2,所以在根目录下也会生成1个 db_data 文件夹,宿主机上的 host_backup 目录映射到了容器中的 container_backup 文件夹下,并解压至 db_data 文件夹下

docker run --rm --name huanyuan --volumes-from db_data2 -v ~/host_backup:/container_backup centos:latest tar xvf /container_backup/backup.tar -C /db_data

四、Dockerfile

什么是Dockerfile

Dockerfile 是用来构建 Docker 镜像的文本格式的配置文件,是由一系列命令参数构成的脚本。

总之,用户可以使用 Dockerfile 来快速创建自定义的镜像。

基本结构

Dockerfile 由一行行命令语句组成, 并且支持以#开头的注释行,一般而言, Dockerfile 主体内容分为四部分: 基础镜像信息、 维护者信息、 镜像操作指令和容器启动时执行指令。

部分命令
基础镜像信息FROM`
维护者信息MAINTAINER`
镜像操作指令RUN、(COPY/ADD)、EXPOSE、WORKDIR、ONBUILD、USER、VOLUME等
容器启动时执行指令CMD、ENTRYPOINT

常用指令

指令名称说明格式示例
FROM定义基础镜像FROM <image_name>:<tag>
MAINTAINER`定义镜像作者MAINTAINER <author_name>
RUN在镜像中执行命令RUN <command>
CMD定义容器启动后默认执行的命令CMD <command>
EXPOS指定容器对外暴露的端口EXPOSE <port>
ENV设置环境变量ENV <key> <value>
ADD将本地文件添加到镜像中ADD <source> <destination>
COPY将本地文件复制到镜像中COPY <source> <destination>
WORKDIR指定容器内的工作目录WORKDIR <path>

注意:ADD和COPY的区别!ADD命令用于复制操作,但是会对压缩文件(tar, gzip, bzip2, etc)做提取和解压操作;而COPY仅限于复制。

快速入门

启动虚拟机,进入 CentOS7 系统。创建文件夹上传 jdk 的安装包:

# 创建文件夹
mkdir -p /ceshi/java
# 使用rz命令上传jdk安装包
rz jdk-8u221-linux-x64.tar.gz

将 jdk-8u221-linux-x64.tar.gz 上传到 Linux 或者使用 cp 命令复制一个本地已经有的 jdk-8u221-linux-x64.tar.gz 文件到指定目录中。

在同级目录下创建 Dockerfile 文件。

touch Dockerfile

注意:Dockerfile 文件没有后缀,文件名D必须是大写。

 

编写Dockerfile文件

 

指定基础镜像,并且必须是第一条指令:

FROM centos:latest

指明该镜像的作者和其电子邮件:

MAINTAINER kongkong "kongkong@qq.com"

在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录:

WORKDIR /ceshi/java

jdk安装文件复制到镜像中,并完成解压操作:

ADD jdk-8u151-linux-x64.tar.gz /ceshi/java/

注:如果在宿主机的当前路径下,文件直接使用相对路径即可;

配置环境变量:

ENV JAVA_HOME=/ceshi/java/jdk1.8.0_151
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH

构建镜像并测试

docker build -t jdk8:v1.0 .

-t jdk8:v1.0 用于给新构建的镜像取名为jdk8 , 并设定版本为 v1.0 ;注意最后有个点,代表使用当前路径的 Dockerfile 进行构建 。

查看镜像:

docker images

创建并启动容器:

docker run -it jdk8:v1.0 /bin/bash

测试:

java -version

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 2024 年最新使用 Wechaty 开源框架搭建部署微信机器人(微信群智能客服案例)
  • 前端二维码工具小程序产品使用说明书
  • RISC-V特权架构 - 模式切换与委托
  • Leetcode 68. 文本左右对齐
  • GFS分布式 文件系统
  • 前端小白的学习之路(Vue2 一)
  • Excel全套213集教程
  • 【数据结构】考研真题攻克与重点知识点剖析 - 第 5 篇:树与二叉树
  • Rust 实现线程安全的 Lock Free 计数器
  • Springboot使用教程
  • c语言:操作符
  • 【远程桌面】Microsoft Remote Desktop 4 mac
  • 景芯2.5GHz A72训练营dummy添加(一)
  • 4.8作业
  • 蓝桥杯 历届真题 双向排序【第十二届】【省赛】【C组】
  • 77. Combinations
  • bearychat的java client
  • CAP理论的例子讲解
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • JavaScript类型识别
  • Making An Indicator With Pure CSS
  • MaxCompute访问TableStore(OTS) 数据
  • quasar-framework cnodejs社区
  • React组件设计模式(一)
  • tweak 支持第三方库
  • vue学习系列(二)vue-cli
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 浮现式设计
  • 聚簇索引和非聚簇索引
  • 扑朔迷离的属性和特性【彻底弄清】
  • 我的面试准备过程--容器(更新中)
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​1:1公有云能力整体输出,腾讯云“七剑”下云端
  • #1015 : KMP算法
  • #NOIP 2014# day.1 T2 联合权值
  • #pragma once
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (C++17) std算法之执行策略 execution
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)Kafka离线安装 - Zookeeper下载及安装
  • (分布式缓存)Redis持久化
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)四层和七层负载均衡的区别
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • **PHP分步表单提交思路(分页表单提交)
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET NPOI导出Excel详解
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • .net6Api后台+uniapp导出Excel