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会覆盖容器中的文件。

相关文章
|
8天前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
155 93
|
1月前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
262 77
|
11天前
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
81 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
22天前
|
搜索推荐 安全 数据安全/隐私保护
7 个最能提高生产力的 Docker 容器
7 个最能提高生产力的 Docker 容器
110 35
|
9天前
|
数据库 Docker 容器
docker容器为啥会开机自启动
通过配置适当的重启策略,Docker容器可以在主机系统重启后自动启动。这对于保持关键服务的高可用性和自动恢复能力非常有用。选择适合的重启策略(如 `always`或 `unless-stopped`),可以确保应用程序在各种情况下保持运行。理解并配置这些策略是确保Docker容器化应用可靠性的关键。
40 17
|
21天前
|
Ubuntu Linux 开发工具
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
Docker 是一个开源的容器化平台,允许开发者将应用程序及其依赖项打包成标准化单元(容器),确保在任何支持 Docker 的操作系统上一致运行。容器共享主机内核,提供轻量级、高效的执行环境。本文介绍如何在 Ubuntu 上安装 Docker,并通过简单步骤验证安装成功。后续文章将探讨使用 Docker 部署开源项目。优雅草央千澈 源、安装 Docker 包、验证安装 - 适用场景:开发、测试、生产环境 通过以上步骤,您可以在 Ubuntu 系统上成功安装并运行 Docker,为后续的应用部署打下基础。
docker 是什么?docker初认识之如何部署docker-优雅草后续将会把产品发布部署至docker容器中-因此会出相关系列文章-优雅草央千澈
|
10天前
|
运维 Java 虚拟化
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
《docker基础篇:1.Docker简介》,包括Docker是什么、容器与虚拟机比较、能干嘛、去哪下
71 12
|
11天前
|
Kubernetes Linux 虚拟化
入门级容器技术解析:Docker和K8s的区别与关系
本文介绍了容器技术的发展历程及其重要组成部分Docker和Kubernetes。从传统物理机到虚拟机,再到容器化,每一步都旨在更高效地利用服务器资源并简化应用部署。容器技术通过隔离环境、减少依赖冲突和提高可移植性,解决了传统部署方式中的诸多问题。Docker作为容器化平台,专注于创建和管理容器;而Kubernetes则是一个强大的容器编排系统,用于自动化部署、扩展和管理容器化应用。两者相辅相成,共同推动了现代云原生应用的快速发展。
68 11
|
27天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
130 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
1月前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
54 3
实战~如何组织一个多容器项目docker-compose