Docker容器数据卷技术(实现数据同步)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 一、什么是数据卷数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作。数据卷可以提供很多有用的特性,如下所示:

一、什么是数据卷

数据卷是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount操作。

数据卷可以提供很多有用的特性,如下所示:

  1. 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便;
  2. 对数据卷内数据的修改会立马生效,无论是容器内操作还是本地操作;
  3. 对数据卷的更新不会影响镜像,解耦了应用和数据;
  4. 卷会一直存在,直到没有容器使用,可以安全地卸载它。

二、使用数据卷

1、通过命令挂载 -v

docker run -d -v 主机目录:容器内目录
# 检查
docker inspect 容器
# 示例
docker run -p 3307:3306 --name mysql02 -v /data/mysql02/conf.d:/etc/mysql/conf.d -v /data/mysql02/data:/var/lib/mysql -v /data/mysql02/my.cnf:/etc/mysql/my.cnf -e MYSQL_ROOT_PASSWORD=123456 -d  --restart=always --privileged=true mysql
# 参数说明
  --restart=always: 当Docker 重启时,容器会自动启动。
  --privileged=true:容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限
  -v /home/mysql/conf.d/my.cnf:/etc/my.cnf:映射配置文件
  -v /home/mysql/data/:/var/lib/mysql:映射数据目录
docker inspect mysql02
# 结果
"Mounts": [
            {
                "Type": "bind",
                "Source": "/data/mysql02/log",
                "Destination": "/var/log/mysql",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/data/mysql02/data",
                "Destination": "/var/lib/mysql",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/data/mysql02/conf",
                "Destination": "/etc/mysql",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ]

启动mysql可能会出现以下问题,这是因为MYSQL新特性secure_file_priv对读写文件的影响

docker logs -ft mysql02
mysqld: Error on realpath() on '/var/lib/mysql-files' (Error 2 - No such file or directory)
2019-09-14T09:52:51.015937Z 0 [ERROR] [MY-010095] [Server] Failed to access directory for --secure-file-priv. Please make sure that directory exists and is accessible by MySQL Server. Supplied value : /var/lib/mysql-files
2019-09-14T09:52:51.018328Z 0 [ERROR] [MY-010119] [Server] Aborting

解决方法:


windows下:修改my.ini 在[mysqld]内加入secure_file_priv=/var/lib/mysql

linux下:修改my.cnf 在[mysqld]内加入secure_file_priv=/var/lib/mysql

我们可以通过挂载的方式修改该文件,即现在宿主机创建并修改好my.cnf文件,随后挂载到容器中

[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

2、具名挂载和匿名挂载

匿名挂载

-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的volume的情况
docker volume ls
[root@VM-12-14-centos ~]# docker volume ls
DRIVER    VOLUME NAME
local     4040579b72a0b726cbe6448b6f22d315743d8b3f47158ca50b6e6c72c747252a
# 以上便是匿名挂载,-v只写了容器内的路径,没有写容器外的路径或卷的名称
# 于是会生成一串随机的卷名
[root@VM-12-14-centos ~]# docker volume inspect 4040579b72a0b726cbe6448b6f22d315743d8b3f47158ca50b6e6c72c747252a
[
    {
        "CreatedAt": "2022-10-30T17:34:26+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/4040579b72a0b726cbe6448b6f22d315743d8b3f47158ca50b6e6c72c747252a/_data",
        "Name": "4040579b72a0b726cbe6448b6f22d315743d8b3f47158ca50b6e6c72c747252a",
        "Options": null,
        "Scope": "local"
    }
]
# 查看这个卷,可以看到挂载的地址位于
# "/var/lib/docker/volumes/4040579b72a0b726cbe6448b6f22d315743d8b3f47158ca50b6e6c72c747252a/_data"

具名挂载

docker run -d -P --name nginx01 -v juming:/etc/nginx nginx
[root@VM-12-14-centos ~]# docker volume ls
DRIVER    VOLUME NAME
local     juming
[root@VM-12-14-centos ~]# docker volume inspect juming
[
    {
        "CreatedAt": "2022-11-01T16:24:47+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming/_data",
        "Name": "juming",
        "Options": null,
        "Scope": "local"
    }
]

观察发现如果没有设置宿主机的路径,docker内的卷都会默认在/var/lib/docker/volumes/xxxx(volume_name)/_data目录下

我们通过具名挂载可以方便地找到一个卷,大多数都会采用这样的方式

3、区分几种命令挂载方式

-v 容器内路径:匿名挂载

-v 卷名:容器内路径:具名挂载

-v /宿主机路径:容器内路径:指定路径挂载

扩展


通过 -v 容器内路径:ro(readonly)、rw(readwrite)改变读写权限


默认是rw,一旦设置了ro就只能在宿主机进行写操作,在容器里只能读

4、通过Dockerfile挂载

dockerfile就是用来构建docker镜像的构建文件

cd /data/volume
touch dockerfile1
vim dockerfile1
FROM centos
VOLUME ["volume01", "volume02"]
CMD echo "----end----"
CMD /bin/bash
docker build -f /data/volume/dockerfile1 -t ken/centos:1.0 .
[root@VM-12-14-centos volume]# docker run -it ken/centos:1.0 /bin/bash
[root@5fd3c2f7e99e /]# ls
bin  etc   lib    lost+found  mnt  proc  run   srv  tmp  var       volume02
dev  home  lib64  media       opt  root  sbin  sys  usr  volume01
# 可以看到出现了volume01和volume02两个目录
# 另起一个终端使用inspect查看容器也能看到
"Mounts": [
            {
                "Type": "volume",
                "Name": "c3326f0d2058d43d33597b8877b134d0b9d3ee649d4a27121306c5b4233ed0c6",
                "Source": "/var/lib/docker/volumes/c3326f0d2058d43d33597b8877b134d0b9d3ee649d4a27121306c5b4233ed0c6/_data",
                "Destination": "volume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "8160d334c70dd048bcc3176e6b0b72e68b2bda81dfe724e9a6c561e4e7324fa1",
                "Source": "/var/lib/docker/volumes/8160d334c70dd048bcc3176e6b0b72e68b2bda81dfe724e9a6c561e4e7324fa1/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]

三、数据卷容器

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

# 通过--volumes-from来挂载mysql02容器中的数据卷
docker run -d --volumes-from mysql02 --name mysql03 -e MYSQL_ROOT_PASSWORD=123456 -d --restart=always --privileged=true -p 3308:3306 mysql
# 通过inspect查看mysql03,可以看到挂载了和mysql02一样的数据卷
"Mounts": [
            {
                "Type": "bind",
                "Source": "/data/mysql02/conf.d",
                "Destination": "/etc/mysql/conf.d",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/data/mysql02/data",
                "Destination": "/var/lib/mysql",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/data/mysql02/my.cnf",
                "Destination": "/etc/mysql/my.cnf",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ]

可以多次使用–volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷。


使用–volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。


如果删除了挂载的容器(mysql02),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
16 6
|
1天前
|
存储 Prometheus 监控
Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行
本文深入探讨了在Docker容器内进行应用调试与故障排除的方法与技巧,包括使用日志、进入容器检查、利用监控工具及检查配置等,旨在帮助用户有效应对应用部署中的挑战,确保应用稳定运行。
13 5
|
1天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
13 3
|
1天前
|
开发框架 安全 开发者
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。
Docker 是一种容器化技术,支持开发者将应用及其依赖打包成容器,在不同平台运行而无需修改。本文探讨了 Docker 在多平台应用构建与部署中的作用,包括环境一致性、依赖管理、快速构建等优势,以及部署流程和注意事项,展示了 Docker 如何简化开发与部署过程,提高效率和可移植性。
16 3
|
1天前
|
存储 安全 数据安全/隐私保护
Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。
在数字化时代,Docker 容器化应用管理更加高效,但数据安全和业务连续性成为关键。本文探讨了 Docker 应用的备份与恢复策略,涵盖备份的重要性、内容、方法及常见工具,制定备份策略,恢复流程及注意事项,并通过案例分析和未来趋势展望,强调备份与恢复在保障应用安全中的重要性。
12 2
|
6天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
29 5
|
5天前
|
持续交付 开发者 Docker
探索容器化技术Docker及其在现代软件开发中的应用
探索容器化技术Docker及其在现代软件开发中的应用
|
8天前
|
关系型数据库 MySQL Java
【Docker最新版教程】一文带你快速入门Docker常见用法,实现容器编排和自动化部署上线项目
Docker快速入门到项目部署,MySQL部署+Nginx部署+docker自定义镜像+docker网络+DockerCompose项目实战一文搞定!
|
7天前
|
开发者 Docker Python
从零开始:使用Docker容器化你的Python Web应用
从零开始:使用Docker容器化你的Python Web应用
22 1
|
4天前
|
存储 Cloud Native 开发者
深入探索容器化技术——Docker的实战应用
深入探索容器化技术——Docker的实战应用
12 0

热门文章

最新文章