Docker使用数据容器的具体示例

 更新时间:2023年07月23日 11:59:14   作者:大熊全栈分享  
本文主要介绍了Docker使用数据容器的具体示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

基本知识

在 Docker 的使用过程中往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,所以这就涉及到 Docker 容器的数据操作。

容器中数据管理主要有两种方式:数据卷和数据卷容器。

  • 数据卷(Data Volumes) 容器内数据直接映射到本地宿主机。
  • 数据卷容器(Data Volume Containers) 使用特定容器维护数据卷。

数据卷

数据卷是一个特殊的目录,它将主机目录直接映射进容器。可供一个或多个容器使用。
数据卷设计的目的就是为了 数据的持久化,它完全独立与容器的生命周期。因此,容器删除时,不会删除其挂载的数据卷,也不会存在类似的垃圾机制对容器存在的数据卷进行处理。

数据卷的特性:

  • 数据卷在容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
  • 数据卷可以在容器之间共享和重用
  • 可以对数据卷里的内容直接修改,修改回马上生效,无论是容器内操作还是本地操作
  • 对数据卷的更新不会影响镜像的更新
  • 数据卷会一直存在,即使挂载数据卷的容器已经被删除

创建数据卷的方法 :docker run -v /lcoaldir:/volumedir -it /image /bin/bash

Notice: Docker 挂载数据卷的默认权限是读写(rw), 通过上面的 "RW": true 可以看到,我们也可以在创建的时候进行设置为只读。
使用 ro 这种是通过-v的形式进行挂在容器的,还可以通过 Dockerfile 的创建镜像的形式 进行挂载,但是这种挂载通过此镜像创建的 Container 是完全独立的。

#Dockerfile
FROM hub.c.163.com/library/ubuntu
VOLUME ["/datavolume1","/dockervolume2"]
CMD /bin/bash

1.执行 docker build -t df_vo . 生成镜像。

2.利用这个镜像创建 Container. docker run --name votest1 -it df_vo
这样的形式生成的 Continer 数据是相互独立的。

数据卷容器

用户需要在多个容器之间共享一些数据,就可以使用数据卷容器。
命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫数据卷容器。

  • 先创建一个容器
  • 然后挂载。

挂载数据卷容器的方法:

用户需要在多个容器之间共享一些数据,就可以使用数据卷容器。

docker run --volumes-from 容器名

命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫数据卷容器。
下面我们进行如下的数据卷容器的实验

先创建一个数据容器镜像

#Dockerfile
FROM alpine
WORKDIR /app
COPY ./datavolume1 .
VOLUME ["/app"]
RUN apk add --no-cache bash

注意 COPY 命令不能使用绝对路径。必须使用相对路径。

命令说明:

VOLUME 命令: 在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。

RUN apk add --no-cache bash to keep docker image size small. 最小化安装 bash。

对镜像进行编译。

docker build -t df_vo .

然后对进行进行创建 Container。

docker run --name votest -itd df_vo

挂载数据卷容器的方法:

docker run --volumes-from 容器名
#启动一个数据盘容器, 数据盘挂载votest容器。
docker run -it --name votest_data1 --volumes-from votest df_vo

--------------数据变化测试--------------
这个可以在 votest_data1 中的 app 目录下看到从 磁盘带进来的数据。
做如下测试:

  • 修改 votest 容器中的数据, votest_data1 中的数据发生变化。
  • 修改 votest_data1 中数据 votest 容器中的数据发生变化。

再次搞个容器 votest_data2 进行测试

docker run -it --name votest_data2 --volumes-from votest df_vo

这个时候在启动一个 votest_data2 同样的做文件变动测试,三者完全是联动的。
其实这些是否联动通过docker inspect命令,找到 Mounts/Name ,表示挂载磁盘的位置。

现在再进行下一步的测试:

启动两个也带有 -v 挂载方式的容器。 启动命令如下:

docker run -it --name votest_data3 -v /home/homework/Cobra/docker/datavolume/log:/app/log --volumes-from votest df_vo
docker run -it --name votest_data4 -v /home/homework/Cobra/docker/datavolume/log:/app/log --volumes-from votest df_vo

做如下测试:【3 应用容器,4 应用容器 ,0 代表数据卷容器, L 代表主机本地,log 目录为从硬盘来源目录】
其中 log 在 应用容器 和 本地是完全相通的。
其中 0,3,4 数据之间的数据是完全相通的。
通过-v 挂进去的数据磁盘,不会影响到数据卷。 他们各自在各自的区域内形成的数据相互影响。

下面我们做下停机的相关测试

将 3 数据容器给停止掉。docker stop votest_data3
在 4 中修改各自范围内文件,0 变,本地也变,他们不会收到 3 的影响。
将 3 数据容器启动,docker start votest_data3
首先看到 3 中的文件已经改变了。已经和 4,5 同步。

现在将 0 停掉 docker stop votest
在 3 中修改 数据卷挂载进来的数据。这个时候也会影响到 4。 也就是 3 和 4 是相互通的。
(尽管现在已经将数据盘给停掉了!!!!!!)
这个特性太牛逼了,这样可以将数据盘进行 Hot--Update,不会影响业务使用。

现在将数据盘重新进行启动,查看 3 和 4 中的数据是否会更新?

docker run votest

这个时候启动发现数据盘容器的数据也恢复到了 和 3、4 号容器同步了。 这个。。。。

现在我们重新对 votest container 删除掉,然后重新创建,我看看下 3、4 号 container 的反应。

docker stop votest
docker rm votest
docker run --name votest -itd df_vo

这个时候发现 数据 votest container 已经完全和 3、4 号容器隔离了。修改 votest 不会引起其他的变化。

Now!!!我们继续测试。docker restart votest_data3 对 3 号容器进行重启,看看其数据变化情况。

  • 重启发现 3 号和 4 号依然是旧的数据容器并且是相通的。
  • 同时关闭 3 和 4 然后同时重启,不管怎么操作 3 和 4 都是相通的。。

说明 docker start/stop 不能打断他们想通性。

Now!!! 那我们怎么让应用程序 更新 最新到最新的 votest 的数据容器呢?

docker stop dvtest_data3
docker rm dvtest_data3
#再次重建生成容器
docker run -it --name votest_data3 -v /home/homework/Cobra/docker/datavolume/log:/app/log --volumes-from votest df_vo

这个时候发现 votest_data3 和 votest 的数据进行了同步。 这样就是实现了数据的同步。
结论:如果要实现数据的热更新,应该对 votest 然后对 votest_data 依次进行重新生成 Container。

数据卷的备份和还原

数据卷备份使用的命令:

docker run --volumes-from 存在的容器名 -v $(pwd):/backup --name 新建的容器名 镜像名 tar cvf /backup/backup.tar 数据卷
$(pwd)当前路径

docker run --volumes-from votest-data5 -v /root/backup:/backup hub.c.163.com/library/ubuntu tar cvf /backup/vof1.tar /app

这个时候会出来一个包。在/root/backup 的目录下,有个 vof1.tar 的包。
这个原理很简单,新建一个 Container,然后挂盘本地的磁盘,然后执行 tar 命令备份指定的文件夹。

数据卷的还原

使用命令类似:

docker run --volumes-from 存在的容器名 -v $(pwd):/backup --name 新建的容器名 镜像名 tar xvf /backup/backup.tar

示例:

创建一个容器 votest8 还原数据卷,这样数据就又重新回来了。

docker run --volumes-from votest_data6 -v /root/backup:/backup --name votest8 hub.c.163.com/library/ubuntu tar xvf /backup/vof.tar

通过 docker ps -a 可以看到创建的数据容器。

最后创建一个容器挂在 votest_data6,就可以看到恢复的数据了。

docker run -it --volumes-from votest_data6 hub.c.163.com/library/ubuntu /bin/bash

注意这个容器里面会多出来一个 backup 的文件夹,正式备份的文件,其他的文件也已经加载进来。 这种查看的方法是通过创建一个 container 进去进入查看。

Docker 启动容器后位置越来越大处理方法

默认情况下 Docker 的存放位置为:/var/lib/docker

我们可以通过下面的命令查看

sudo docker info | grep "Docker Root Dir"

解决这个问题,最直接的方法当然是挂载分区到这个目录,但是我的数据盘还有其他东西,这肯定不好管理,所以采用修改镜像和容器的存放路径的方式达到目的。

这个方法里将通过软连接来实现。

首先停掉 Docker 服务:

sudo systemctl stop docker

然后移动整个/var/lib/docker 目录到目的路径:

mv `/var/lib/docker` /data/docker
ln -s /data/docker `/var/lib/docker`

这时候启动 Docker 时发现存储目录依旧是/var/lib/docker,但是实际上是存储在数据盘的,你可以在数据盘上看到容量变化。

Docker 将普通用户加入到 docker 组中

可以使用普通用户对 docker 进行管理

sudo usermod -aG docker cobra

到此这篇关于Docker使用数据容器的具体示例的文章就介绍到这了,更多相关Docker 数据容器内容请搜索程序员之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持程序员之家!

相关文章

  • Dockerfile构建Redis镜像的方法实现(yum方式)

    Dockerfile构建Redis镜像的方法实现(yum方式)

    本文主要介绍了Dockerfile构建Redis镜像的方法实现(yum方式),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-08-08
  • Docker?配置容器固定IP的方法

    Docker?配置容器固定IP的方法

    这篇文章主要介绍了Docker?配置容器固定IP,下面使用docker自带的network实现固定ip分配,并且重启不会消失,通过绑定步骤给大家介绍的非常详细,需要的朋友参考下吧
    2022-04-04
  • Docker和镜像的操作方法

    Docker和镜像的操作方法

    这篇文章主要介绍了Docker和镜像的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Docker使用Git实现Jenkins发布、测试项目的详细流程

    Docker使用Git实现Jenkins发布、测试项目的详细流程

    这篇文章主要介绍了Docker使用Git实现Jenkins发布、测试项目的详细流程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 一台虚拟机基于docker搭建大数据HDP集群的思路详解

    一台虚拟机基于docker搭建大数据HDP集群的思路详解

    这篇文章主要介绍了一台虚拟机基于docker搭建大数据HDP集群?,本篇文章主要讲了大数据集群搭建的架构设计和实现思路部分,后面文章会探讨上层应用的构建,需要的朋友可以参考下
    2022-11-11
  • zabbix监控docker容器状态【推荐】

    zabbix监控docker容器状态【推荐】

    这篇文章主要介绍了zabbix监控docker容器状态的相关资料,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • 详解Docker退出容器不关闭容器的方法

    详解Docker退出容器不关闭容器的方法

    进入docker容器后如果退出容器,容器就会变成Exited的状态,那么如何退出容器让容器不关闭呢?现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • dockerfile中ENTRYPOINT与CMD的结合使用及区别

    dockerfile中ENTRYPOINT与CMD的结合使用及区别

    这篇文章主要介绍了dockerfile中ENTRYPOINT与CMD的结合使用,大家都知道CMD 与 ENTRYPOINT都是用于指定启动容器执行的命令,那么他们俩有什么区别呢,本文给大家详细介绍,需要的朋友可以参考下
    2021-08-08
  • Docker 创建容器后再修改 hostname的详细过程

    Docker 创建容器后再修改 hostname的详细过程

    这篇文章主要介绍了Docker 创建容器后再修改 hostname的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10
  • 如何快速通过Docker安装SQL?Server

    如何快速通过Docker安装SQL?Server

    要用到sqlserver环境测试,用docker部署比较快,下面这篇文章主要给大家介绍了关于如何快速通过Docker安装SQL?Server的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-05-05

最新评论

?


http://www.vxiaotou.com