“Docker之道:优雅管理容器数据的艺术“

目录

[1. 容器数据卷](#1. 容器数据卷)

[1.1 容器卷的概念](#1.1 容器卷的概念)

[1.2 容器卷的使用](#1.2 容器卷的使用)

[1.3 个人案例实现容器卷挂载](#1.3 个人案例实现容器卷挂载)

[1.4 MySQL同步数据案例(容器数据卷操作)](#1.4 MySQL同步数据案例(容器数据卷操作))

[1.4.1 获取 MySQL 镜像](#1.4.1 获取 MySQL 镜像)

[1.4.2 运行 MySQL 容器并配置数据持久化](#1.4.2 运行 MySQL 容器并配置数据持久化)

参数说明:

[1.4.3 测试 MySQL 连接](#1.4.3 测试 MySQL 连接)

[1.4.4 数据持久化验证](#1.4.4 数据持久化验证)

[1.4.5 持续管理与使用](#1.4.5 持续管理与使用)

[1.5 具名挂载和匿名挂载](#1.5 具名挂载和匿名挂载)

[2. 数据卷容器](#2. 数据卷容器)

参数说明


1. 容器数据卷

  • 场景:容器之间的共享和持久存在,这里存在挂载操作,本人觉得非常实用;
  • 挂载:挂载到本地的容器卷上。

1.1 容器卷的概念

容器之间可以数据共享,不单单只存在于容器当中,删除了容器就好比"删库跑路"了一样,数据无法持久化;

  • 实现挂载原理:

    但是容器之间可以有一个数据共享的技术,docker容器中产生的数据,同步到本地;

    这个就是卷技术,比如说目录挂载:将容器内的目录,挂载到本地上,实现容器间的数据共享;

1.2 容器卷的使用

挂载作用:我在容器中创建的文件,它会被同步到容器外面,同时我在容器外创建的文件或者是修改的文件也会被同步到容器内;

docker挂载常用命令表格:

序号 命令类型 命令格式
1 挂载本地目录 docker run -it -v 主机目录:容器内目录
2 挂载本地目录(只读) docker run -it -v 主机目录:容器内目录:ro
3 使用--mount选项挂载 docker run -it --mount type=bind,source=主机目录,target=容器内目录
4 使用--mount选项(只读) docker run -it --mount type=bind,source=主机目录,target=容器内目录,readonly
5 挂载Docker数据卷 docker run -it -v 数据卷名:容器内目录
6 使用--mount挂载数据卷 docker run -it --mount source=数据卷名,target=容器内目录
7 查看容器信息 docker inspect 容器ID
序号 说明 示例
1 将主机目录挂载到容器内目录 docker run -it -v /home/ceshi:/home centos /bin/bash
2 以只读方式挂载主机目录到容器内目录 docker run -it -v /home/ceshi:/home:ro centos /bin/bash
3 使用--mount选项挂载主机目录到容器内目录 docker run -it --mount type=bind,source=/home/ceshi,target=/home centos /bin/bash
4 使用--mount选项以只读方式挂载主机目录 docker run -it --mount type=bind,source=/home/ceshi,target=/home,readonly centos /bin/bash
5 将数据卷挂载到容器内目录 docker run -it -v mydata:/home centos /bin/bash
6 使用--mount选项将数据卷挂载到容器内目录 docker run -it --mount source=mydata,target=/home centos /bin/bash
7 查看容器详细信息,包括挂载点信息 docker inspect <container_id>
  • 容器卷的好处:以后要修改容器中的数据,只需要在本地修改即可。
  • 容器被删除后,但是被挂载的数据是不会被删除的。

1.3 个人案例实现容器卷挂载

1.4 MySQL同步数据案例(容器数据卷操作)

1.4.1 获取 MySQL 镜像

从 Docker Hub 拉取 MySQL 5.7 的镜像:

复制代码
[root@kuangshen home]# docker pull mysql:5.7
1.4.2 运行 MySQL 容器并配置数据持久化

启动 MySQL 容器时,需要挂载数据卷来确保数据的持久化。以下命令包括了主要的参数和配置:

复制代码
[root@kuangshen home]# docker run -d \
    -p 3310:3306 \
    -v /home/mysql/conf:/etc/mysql/conf.d \
    -v /home/mysql/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    --name mysq101 \
    mysql:5.7
参数说明:
  • -d:后台运行容器。
  • -p 3310:3306:将宿主机的 3310 端口映射到容器的 3306 端口。
  • -v /home/mysql/conf:/etc/mysql/conf.d:挂载宿主机的配置目录到容器的 MySQL 配置目录。
  • -v /home/mysql/data:/var/lib/mysql:挂载宿主机的数据目录到容器的 MySQL 数据目录。
  • -e MYSQL_ROOT_PASSWORD=123456:设置 MySQL root 用户的密码为 123456
  • --name mysq101:容器命名为 mysq101
  • mysql:5.7:使用 MySQL 5.7 版本镜像。
1.4.3 测试 MySQL 连接

在本地使用 SQLyog 或其他 MySQL 客户端工具连接到 Docker 容器中的 MySQL 服务:

  1. 打开 SQLyog
  2. 在连接设置中,设置主机为 localhost,端口为 3310,用户名为 root,密码为 123456
  3. 测试连接,如果成功,表示 MySQL 已经正确运行。
1.4.4 数据持久化验证

在本地 MySQL 客户端中执行数据库操作(如创建数据库),并检查挂载的目录是否更新:

复制代码
CREATE DATABASE testdb;

然后检查 /home/mysql/data 目录中的内容是否包含 testdb 的相关数据文件,确保数据在容器重启后仍然存在。

1.4.5 持续管理与使用
  • 启动容器

    docker start mysq101

  • 停止容器

    docker stop mysq101

  • 查看容器日志

    docker logs mysq101

  • 进入容器

    docker exec -it mysq101 bash

作用:是MySQL的数据可以持久化,在容器被删除后,MySQL的数据还依旧存在。

这样MySQL就可以持久化了,就算删除了容器中的MySQL,那么本地目录下的MySQL数据还依旧存在。

1.5 具名挂载和匿名挂载

参考教学视频中的笔记:

Docker视频:尚硅谷2022版Docker实战教程(docker教程天花板)_哔哩哔哩_bilibili

Docker视频:【狂神说Java】Docker最新超详细版教程通俗易懂_哔哩哔哩_bilibili

Docker进阶:compose是什么能干嘛_哔哩哔哩_bilibili

2. 数据卷容器

  • 场景:使得容器之间的数据共享更加方便和可控。
  • 总结一下 [ 容器数据卷 , 数据卷容器 ] 两者的区别: - 数据卷是一个特殊的目录,直接在主机的文件系统上进行管理,可以在容器之间共享和持久存在。 - 数据卷容器是用于创建和管理数据卷的容器,本身不运行应用程序,而是提供一个中心化的位置来管理和维护数据卷,使得容器之间的数据共享更加方便和可控。
  • volumes挂载:以下命令是将MySQL02挂载到了MySQL01之下,进行数据同步,当MySQL01被删除时,MySQL02依旧存在,这是一个copy拷贝的概念,每次同步的时候是将MySQL01的配置拷贝到MySQL02中。
  • 下表总结了通过 Docker 实现两个 MySQL 容器的数据共享配置步骤及参数。
操作步骤 命令示例 说明
1. 获取 MySQL 镜像 docker pull mysql:5.7 拉取 MySQL 5.7 镜像。
2. 运行第一个 MySQL 容器 docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysq101 mysql:5.7 - 端口映射:宿主机 3310 -> 容器 3306 - 配置挂载:/home/mysql/conf -> /etc/mysql/conf.d - 数据挂载:/home/mysql/data -> /var/lib/mysql - 设置 root 密码 123456 - 容器命名 mysq101
3. 运行第二个 MySQL 容器 docker run -d -p 3311:3306 -e MYSQL_ROOT_PASSWORD=123456 --volumes-from mysq101 --name mysq102 mysql:5.7 - 端口映射:宿主机 3311 -> 容器 3306 - 数据卷共享:使用 --volumes-frommysq101 容器共享卷 - 设置 root 密码 123456 - 容器命名 mysq102

参数说明

参数 含义
-d 后台运行容器。
-p 宿主机端口:容器端口 端口映射。
-v 宿主机目录:容器目录 卷挂载,将宿主机的目录挂载到容器中。
-e 环境变量=值 设置环境变量,配置容器启动时的参数。
--name 容器名字 容器命名,便于管理。
--volumes-from 其他容器名 共享其他容器的卷,使两个容器的数据目录一致。
  • 小结:

    容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。但是一旦持久化到了本地,这个时候本地的数据是不会删除的。

相关推荐
牛奔9 分钟前
docker compose up 命令,默认配置文件自动查找规则
java·spring cloud·docker·容器·eureka
工具罗某人10 分钟前
docker快速部署jenkins
java·docker·jenkins
BigBigHang10 分钟前
【docker】离线设备安装镜像
运维·docker·容器
学好statistics和DS15 分钟前
Docker文件与本地文件,系统
运维·docker·容器
liuc031718 分钟前
docker下安装SearXNG
运维·docker·容器
oMcLin29 分钟前
如何在CentOS 8上配置并优化Docker与Kubernetes结合的容器集群,提升微服务部署效率?
docker·kubernetes·centos
华如锦32 分钟前
四:从零搭建一个RAG
java·开发语言·人工智能·python·机器学习·spring cloud·计算机视觉
Tony_yitao35 分钟前
22.华为OD机试真题:数组拼接(Java实现,100分通关)
java·算法·华为od·algorithm
JavaGuru_LiuYu36 分钟前
Spring Boot 整合 SSE(Server-Sent Events)
java·spring boot·后端·sse
爬山算法39 分钟前
Hibernate(26)什么是Hibernate的透明持久化?
java·后端·hibernate