02、数据卷(Data Volumes)以及dockefile详解

目录

1、Docker 数据管理

2、数据卷(Data Volumes)

3、数据卷容器

4、dockerfile

5、dockerfile基本结构

6、docker使用Dockerfile创建jdk容器

启动虚拟机,进入CentOS

7、dockerfile实践经验


1、Docker 数据管理

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

容器中的管理数据主要有两种方式:
数据卷 Data Volumes 容器内数据直接映射到本地主机环境;
数据卷容器(Data Volume Containers 使用特定容器维护数据卷

注1:上章节还介绍过cp命令在宿主机和docker容器之间复制文件
        docker cp 宿主机绝对路径  容器id:路径

2、数据卷(Data Volumes)

数据卷是一个可供一个或多个容器使用的特殊目录,它将主机操作系统目录直接映射进容器,它可以提供很多有用的特性:
   1.数据卷 可以在容器之间共享和重用
   2.对数据卷的修改会立马生效
   3.对数据卷的更新,不会影响镜像
   4.数据卷 默认会一直存在,即使容器被删除

  

数据卷相关操作:

2.1.创建数据卷

docker volume create my-vol

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

 ## 参数可以为数字“1”,字母L:大小写均可,但效果不一样 
     ls -1 /var/lib/docker/volumes

2.2.查看所有的数据卷

docker volume ls

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

docker volume inspect my-vol 

2.4.删除一个volume

docker volume rm my-vol

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

## 挂载数据卷,最好是通过run而非create/start创建启动容器
## create/start命令创建启动容器后,再挂载数据卷相当麻烦,要修改很多配置文件,但并非不可以

2.5.启动一个挂载数据卷的容器

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


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

注1:linux命令结尾加斜杠有什么用
          加了“\”意为将最后的回车换行给注释了,系统理解为命令还没有结束,因而是继续等待用户进行输入,直到读到结束符,如回车

 注2:source=my-vol,target=/webapp
          my-vol为要挂载的数据卷,如果数据卷不存在,docker会自动创建
          /webapp为容器上目录,如果目录不存在, Docker会自动创建   

 注3:mount选项高级用法
          --mount选项的type参数支持三种类型的数据卷
          --mount标志:由多个名值对组成,逗号分隔,每个键值由 <key> = <value> 元组组成 
          1.type=volume普通数据卷(默认即这种类型),映射到主机/var/lib/docker/volumes路径下;   
            --mount type=volume,source=my-vol,target=/webapp
            注:type的默认值,提前先创建数据卷
          2.bind:绑定数据卷,映射到主机指定路径下;
            --mount type=bind,source=/webapp,destination=/webapp2
          3.tmpfs :临时数据卷,只存在于内存中
            docker run -d \
              -it \
              --name tmptest \
              --mount type=tmpfs,destination=/app \
              nginx:latest

3、数据卷容器

如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载

  

数据卷容器相关操作:

3.1.新建数据卷容器

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

3.2.用容器db1测试数据卷容器是否可用

docker run -it -d --name db1 --volumes-from db_data centos:latest
     docker exec -it db1 bash
     cd db_data
     ## 使用echo命令向db1_test.txt中写入内容
     echo "db1 beifen test" > db1_test.txt

3.3.备份数据卷容器

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

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

   注:
   1)run:create+start
   2)--rm:创建之后删除容器
   3)--name:容器名称
   4)--volumes-from:来自于哪个数据卷容器的容器NAME
   5)-v:给容器挂载存储卷,挂载到容器的某个目录

3.4.还原数据卷容器

1.新建一个数据卷容器db_data2
       docker run -it -d --name db_data2 -v /db_data centos:latest

2.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
       新建1个名为huanyuan的(暂时性,之后会删除)容器,由于volumes-from了db_data2,所以在根目录下也会生成1个db_data文件夹,宿主机上的host_backup_path下的压缩数据映射到了container_backup文件夹下,并解压至db_data文件夹下     

4、dockerfile

dockerfile 是一个文本格式的配置文件, 用户可以使用 Dockerfile 来快速创建自定义的镜像,另外,使用Dockerfile去构建镜像好比使用pom去构建maven项目一样,有异曲同工之妙

  

5、dockerfile基本结构

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

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

6、docker使用Dockerfile创建jdk容器

启动虚拟机,进入CentOS

6.1 创建文件夹上传jdk的安装包,和在同级目录下编写Dockerfile文件
      $ mkdir –p /zking/java
      # 注意d是大写
      $ touch Dockerfile 

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

6.2 编写 Dockerfile 文件
      6.2.1 vi Dockerfile进入编辑模式
      :wq  #退出并保存文件
      :q!  #退出不保存文件
      按i键进入insert编辑模式

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

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

      MAINTAINER zs "zs@qq.com"

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

      WORKDIR /zking/java

      6.2.5 一个复制命令,把jdk安装文件复制到镜像中,语法:ADD <src>... <dest>,注意:jdk*.tar.gz使用的是相对路径

      ADD jdk-8u151-linux-x64.tar.gz /zking/java/
      注:如果在宿主机的当前路径下,文件直接使用相对路径即可;

      6.2.6 配置环境变量

      ENV JAVA_HOME=/zking/java/jdk1.8.0_151
      ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
      ENV PATH=$JAVA_HOME/bin:$PATH
      #容器启动时需要执行的命令
      #CMD ["java","-version"]

6.3 执行Dockerfile文件,初次依赖镜像的时候会下载相应镜像
      docker build -t jdk8:v1.0 .
      注1:-t  jdk8:v1.0  给新构建的镜像取名为 jdk8, 并设定版本为v1.0
      注2:注意最后有个点,代表使用当前路径的 Dockerfile 进行构建 

6.4 查看镜像

      docker images

6.5 创建并启动容器

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

6.6 检查是否有问题

      javac

7、dockerfile实践经验

1. 精简镜像用途:尽量让每个镜像的用途都比较集中单一,避免构造大而复杂、多功能的镜像
2. 选用合适的基础镜像:容器的核心是应用,选择过大的父镜像(如CentOS系统镜像)会造成最终生成应用镜像的臃肿,推荐选用瘦身过的应用镜像或者较为小巧的系统镜像(alpine)

附录一:SecureCRT上传文件到Linux服务器上
1. 输入rz命令,看是否已经安装了lrzsz,如果没有安装则执行 apt install lrzsz -y 命令进行安装。
2. 安装成功后,输入rpm命令确认是否正确安装
3. 使用 rz -y命令进行文件上传,此时会弹出上传的窗口
还可以通过sz下载文件

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
### 回答1: Docker Compose Volumes 是 Docker Compose 的一个功能,它允许我们在容器之间共享数据Volumes 可以是本地文件系统上的目录或文件,也可以是 Docker 容器中的目录或文件。使用 Volumes,我们可以在容器之间共享数据,而不必担心数据的丢失或损坏。此外,Volumes 还可以用于在容器之间共享配置文件、日志文件等。在 Docker Compose 中,我们可以使用 volumes 关键字来定义 Volumes。 ### 回答2: Docker-compose是一种用于定义和运行多个Docker容器的工具,它可以通过一个简单的yml文件来描述和管理应用程序的各种组成部分。其中,volumes是docker-compose中重要的一个功能模块,它用于挂载容器内部的数据卷。 具体来说,volumes可以分为两种类型:主机挂载卷和匿名卷。主机挂载卷是将主机上的目录挂载到容器内部,可以实现容器和主机之间的数据共享;而匿名卷是由docker随机生成的一个文件夹设置为卷,主要用于持久化容器中的数据。 在docker-compose中使用volumes时,需要指定容器内部的目录和它对应的主机目录或匿名卷。例如: ``` volumes: - /path/on/host:/path/in/container - /data ``` 上述代码定义了两个卷:第一个是主机挂载卷,将主机上的`/path/on/host`目录挂载到容器内部的`/path/in/container`目录;第二个是匿名卷,将容器内部的`/data`目录持久化。 在使用volumes时,还可以设置一些选项,以控制卷的行为。例如,可以设置`ro`(只读)或`rw`(读写)来控制卷的访问权限;可以设置`nocopy`来禁止容器复制主机挂载卷的内容。 总之,docker-compose volumes功能非常强大,可以方便地管理容器中的数据卷,实现容器和主机之间的数据共享和持久化。正确使用volumes可以大大提高应用程序的可移植性和可靠性。 ### 回答3: Docker-compose是Docker公司推出的多容器应用管理工具,可以通过一个易于编写的YAML文件定义应用程序的服务、网络和存储卷等信息,然后使用docker-compose命令一键启动、停止、重启、构建和删除整个应用程序。 在Docker-compose中,volumes用于将容器内的数据持久化到主机上的某个目录中,或者实现容器之间的共享数据volumes可以在Docker-compose中的service中指定,也可以通过终端命令进行挂载,其挂载方式决定了数据存储的类型:临时存储/持久化存储。 在Docker-compose中使用volumes,通常有以下几种情况: 1.容器内的数据需要持久化存储,例如数据库服务中的数据文件和日志文件。 - 创建一个挂载目录:volumes:- /data/db - 将其挂载到mongo服务中: ``` version: '3' services: mongo: image: mongo volumes: - /data/db:/data/db ``` 2.容器之间需要共享数据,例如本地网络集群服务中的nginx和php服务。 - 创建共享目录:volumes:- /var/www/html - 将其挂载为nginx和php服务的共享目录: ``` version: '3' services: php: image: php volumes: - /var/www/html:/var/www/html nginx: image: nginx volumes: - /var/www/html:/var/www/html ``` 3.部分容器需要使用主机上的某些目录或文件,例如本地测试服务需要访问主机上的代码文件。 - 在终端命令中指定挂载目录:-v /data/code:/var/www/html - 在docker-compose中指定: ``` version: '3' services: php: image: php volumes: - /var/www/html:/var/www/html - /data/code:/data/code ``` 总之,在Docker-compose中正确使用volumes是不可或缺的。需要根据实际业务需求,选择正确的挂载方式和目录来保证容器内数据的可靠性和分享性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天蝎座的程序媛

你的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值