Docker容器数据持久化之Bind Mouting(2)

简介: Docker容器数据持久化之Bind Mouting(2)

为什么要做数据持久化?


 当容器运行期间产生的数据是不会在写镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写层来保存数据。如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据。


Docker数据持久化方案:


  • 基于本机文件系统的Volume。可以执行Docker createDocker run时,通过-v参数将主机的目录作为容器的数据卷。这部分功能便是基于本地文件系统的volume管理。

  • 基于plugin的Volume,支持第三方的存储方案,比如NAS,AWS。

基于本机文件系统的Volume:


  • Data Volume:挂载数据卷

  • Bind Mouting: 挂载本地目录

数据持久化之Bind Mouting:


 Bind Mounting 持久化的方式,则本地的目录文件和容器中的文件是同步的,如果本地的文件做了修改,那么容器中的文件也会修改。


1.创建本地目录新增数据并挂载到容器

[root@localhost ~]# docker images
REPOSITORY                      TAG                      IMAGE ID            CREATED             SIZE
webdata                         v1                       b25ea02c5f1f        23 hours ago        127MB
[root@localhost ~]# mkdir web
[root@localhost ~]# touch web/test.txt
[root@localhost ~]# docker run -itd --name webtest -v /root/web:/opt/ webdata:v1
1f5965ef6bea6604c7692012e3ac1419d869ad51b4e31ca16c915b17d4045e80

2.查看容器webtest中同步的数据

[root@localhost ~]# docker exec -it webtest ls /opt/
test.txt

3.修改容器/opt目录数据,查看本地是否同步修改

[root@localhost ~]# docker exec -it webtest touch /opt/1.txt
[root@localhost ~]# docker exec -it webtest ls /opt/
1.txt  test.txt
[root@localhost ~]# ls /root/web     //查看本地目录数据是否同步
1.txt  test.txt

持久化在生产中的应用---Nginx


1.在本机创建网页文件test.html

[root@localhost ~]# cat /usr/local/nginx/html/test.html
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>hello</title>
</head>
<body>
  <h1>Hello Docker! </h1>
</body>
</html>
[root@localhost ~]# mv /usr/local/nginx/html/test.html /root/web
[root@localhost ~]# ls /root/web
test.html

2.书写Dockerfile来创建一个nginx测试镜像

[root@localhost ~]# docker images
REPOSITORY                      TAG                      IMAGE ID            CREATED             SIZE
nginx                           latest                   ed21b7a8aee9        6 weeks ago         127MB
[root@localhost ~]# cd /root/web      
[root@localhost web]# cat >Dockerfile <<EOF       //书写Dockerfile文件
> FROM nginx:latest
> WORKDIR /usr/share/nginx/html
> COPY test.html test.html         //不写绝对路径默认拷贝当前目录文件
> EOF
[root@localhost web]# ls
Dockerfile  test.html
[root@localhost web]# docker build -t myweb:v1 .      //构建myweb:v1容器
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM nginx:latest
 ---> ed21b7a8aee9
Step 2/3 : WORKDIR /usr/share/nginx/html
 ---> Running in 0fc41b6e742e
Removing intermediate container 0fc41b6e742e
 ---> 58162f0ab157
Step 3/3 : COPY test.html index.html
 ---> 2bda7f3e4192
Successfully built 2bda7f3e4192
Successfully tagged myweb:v1
[root@localhost web]# docker images
REPOSITORY                      TAG                      IMAGE ID            CREATED             SIZE
myweb                           v1                       2bda7f3e4192        21 seconds ago      127MB

3.使用构建的myweb镜像启动一个容器


使用myweb:v1镜像启动容器mynginx,-v指定将本机/root/web目录挂载到容器/usr/share/nginx/html目录,-p指定将本机80端口映射到容器80端口。

[root@localhost web]# docker run -itd --name mynginx -v /root/web:/usr/share/nginx/html -p 80:80 myweb:v1
a9cfc24af49c08540614b7a79c24ba0723b0e3a1d2e05c7eaa21ef54b69ca76b

4.访问

2.png

5.本机修改挂载到容器的/root/web目录下test.html文件,查看容器内变化并访问


[root@localhost web]# sed -i "s/Hello Docker/Hello Nginx Page/g" test.html        
    //修改本机挂载到容器的/root/web目录下的test.html文件内容
[root@localhost web]# docker exec -it mynginx cat /usr/share/nginx/html/test.html    
            //查看容器中/usr/share/nginx/html/test.html文件的变化
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>hello</title>
</head>
<body>
  <h1>Hello Nginx Page! </h1>  --》可以看到本机修改后已经同步容器也修改了
</body>
</html>

3.png

6.进入容器内修改/usr/share/nginx/html/test.html文件,查看本机变化并访问


[root@localhost web]# docker exec -it mynginx /bin/bash
root@a9cfc24af49c:/usr/share/nginx/html# sed -i "s/Hello Nginx Page/Docker Page/" test.html
     //修改容器内test.html文件内容,查看是否同步到本机目录
root@a9cfc24af49c:/usr/share/nginx/html# cat test.html
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>hello</title>
</head>
<body>
  <h1>Docker Page! </h1>
</body>
</html>
[root@localhost web]# cat test.html    //查看本机test.html文件是否已同步修改
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>hello</title>
</head>
<body>
  <h1>Docker Page! </h1>      --》可以看到已经同步修改
</body>
</html>

4.png

7.查看本机test.html与容器内test.html文件的MD5值


[root@localhost web]# md5sum test.html       //本机test.html文件
d87a8dfe0abc2eca57ae35421dabf951  test.html
[root@localhost web]# docker exec -it mynginx md5sum /usr/share/nginx/html/test.html        //容器内test.html文件
d87a8dfe0abc2eca57ae35421dabf951  /usr/share/nginx/html/test.html

最后:


使用Bind Mounting 持久化的方式,则本地的目录文件和容器中的文件是同步的,如果本地的文件做了修改,那么容器中的文件也会修改,即Bind mount会覆盖容器中的文件。

相关文章
|
2天前
|
Kubernetes Cloud Native 持续交付
云原生之旅:Docker容器化与Kubernetes集群管理
【9月更文挑战第33天】在数字化转型的浪潮中,云原生技术如同一艘航船,带领企业乘风破浪。本篇文章将作为你的航海指南,从Docker容器化的基础讲起,直至Kubernetes集群的高级管理,我们将一起探索云原生的奥秘。你将学习到如何封装应用、实现环境隔离,以及如何在Kubernetes集群中部署、监控和扩展你的服务。让我们启航,驶向灵活、可伸缩的云原生未来。
|
5天前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker与Kubernetes入门
【9月更文挑战第30天】在云计算的浪潮中,云原生技术正以前所未有的速度重塑着软件开发和运维领域。本文将通过深入浅出的方式,带你了解云原生的核心组件——Docker容器和Kubernetes集群,并探索它们如何助力现代应用的构建、部署和管理。从Docker的基本命令到Kubernetes的资源调度,我们将一起开启云原生技术的奇妙之旅。
|
6天前
|
存储 索引 Python
python中的数据容器
python中的数据容器
|
8天前
|
Kubernetes Linux 开发者
深入探索Docker容器化技术的奥秘
深入探索Docker容器化技术的奥秘
16 1
|
6天前
|
网络协议 安全 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基础知识,包括网络驱动、端口映射和命名等核心概念,并深入探讨了 Bridge、Host、Overlay 和 Macvlan 四种网络类型的特点及应用场景。此外,还提供了创建、连接、查看和删除自定义网络的命令示例,以及高级网络配置方法,如网络命名空间、DNS 解析和安全通信配置,帮助开发者构建更健壮的容器化应用。
|
7天前
|
Cloud Native 持续交付 Docker
深入解析Docker容器化技术及其在生产环境中的应用
深入解析Docker容器化技术及其在生产环境中的应用
10 0
|
8天前
|
存储 Kubernetes Docker
深入探索容器化技术:Docker 实战与 Kubernetes 管理
深入探索容器化技术:Docker 实战与 Kubernetes 管理
23 0
|
17天前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
14天前
|
Linux iOS开发 Docker
Docker:容器化技术的领航者 —— 从基础到实践的全面解析
在云计算与微服务架构日益盛行的今天,Docker作为容器化技术的佼佼者,正引领着一场软件开发与部署的革命。它不仅极大地提升了应用部署的灵活性与效率,还为持续集成/持续部署(CI/CD)提供了强有力的支撑。
192 69
|
15天前
|
运维 Cloud Native Docker
云原生技术入门:Docker容器化实战
【9月更文挑战第20天】本文将引导你走进云原生技术的世界,通过Docker容器化技术的实战演练,深入理解其背后的原理和应用。我们将一起探索如何在云平台上利用Docker简化部署、扩展和管理应用程序的过程,并揭示这一技术如何改变现代软件的开发和运维模式。
下一篇
无影云桌面