一、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
属性介绍:
属性 | 说明 |
---|---|
run | create+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