Docker操作 (八)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Docker操作 (八)

容器数据卷
什么是容器数据卷
docker的理念回顾

将应用和环境打包成一个镜像。

如果数据都在容器中,那么容器删除,数据就会丢失!需求:数据可以长久化,MySQL,容器删了,删库跑路。=需求:MySQL数据可以存储在本地=

容器之间可以有一个数据共享技术!Docker容器中产生的数据,同步到本地。这就是卷技术,目前的挂载,将我们容器内的目录,挂载到Linux上面。

总结:容器的持久化和同步操作,容器间也可以数据共享。

使用数据卷

# 方式一:直接使用命令挂载 -v
docker run -it -v 主机目录:容器内目录
# 测试
root@liuxiaoweideAir ~ # docker run -it -v /Users/liuxiaowei/ceshi:/home centos /bin/bash  #主机目录:/Users/liuxiaowei/ceshi 容器目录:/home 
# 启动之后,通过docker inspect 容器id 检验卷如何挂载
root@liuxiaoweideAir liuxiaowei # docker inspect 3af3cfc435c3
        "Mounts": [
            {
   
                "Type": "bind",
                "Source": "/Users/liuxiaowei/ceshi",   # 主机内地址
                "Destination": "/home",                # docker 容器内的地址
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ]

测试文件的同步效果如图:
逆向测试
1、退出容器

2、然后在宿主机目录下进行操作

3、再启动容器

4、查看容器内目录文件同步变化
image.png

优点:以后修改只需在本地修改即可,容器内会自动同步。

实战:安装MySQL
思考:MySQL的数据持久化的问题

# 获取镜像
root@liuxiaoweideAir ~ # docker pull mysql:5.7
# 运行容器,需要做数据挂载, 安装启动mysql,需要配置密码的,这需要注意。去https://hub.docker.com/搜索mysql
# Start a mysql server instance
# Starting a MySQL instance is simple:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
# 启动容器
-d 后台运行
-p 端口映射
-v 卷挂载 (两个-v 挂载两个目录)
-e 环境配置
--name 容器名字
root@liuxiaoweideAir ~ # docker run -d -p 3310:3306 -v /Users/liuxiaowei/mysql/conf:/etc/mysql/conf.d -v /Users/liuxiaowei/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456  --name mysql01 mysql:5.7
42053d1fb7043624bb199b7f5d876ccd2299d5047230cee847a4dcabb5657ddf

# 启动成功之后,利用Navicat或者SQL PRO连接测试,连接到服务器的3310 --- 3310和容器内的3306映射。如下图

image.png
image.png

# 在本地测试创建一个数据库,查看一下我们映射的路径是否同步。
本例:root@liuxiaoweideAir data # ls
auto.cnf        ib_logfile1        server-cert.pem
ca-key.pem        ibdata1            server-key.pem
ca.pem            ibtmp1            sys
client-cert.pem        mysql            test # 在mysql容器里建立的数据库
client-key.pem        performance_schema    test1 # 在mysql容器里建立的数据库
ib_buffer_pool        private_key.pem
ib_logfile0        public_key.pem
root@liuxiaoweideAir data # pwd
/Users/liuxiaowei/mysql/data

image.png

假设我们将容器删除

root@liuxiaoweideAir data # docker rm -f mysql01
mysql01
root@liuxiaoweideAir data # docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

root@liuxiaoweideAir data # ls
auto.cnf        ib_logfile0        public_key.pem
ca-key.pem        ib_logfile1        server-cert.pem
ca.pem            ibdata1            server-key.pem
client-cert.pem        mysql            sys
client-key.pem        performance_schema    test
ib_buffer_pool        private_key.pem        test1

发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!

具名和匿名挂载

匿名挂载

- v 容器内路径
- P 随机映射端口
docker run -d -P --name nginx01 -v /etc/nginx nginx   

# 查看所有的卷的信息
root@liuxiaoweideAir liuxiaowei # docker volume ls    
DRIVER    VOLUME NAME
local     3e8ab2696b7005a359de2bdaf5fc70a01881652fc0a789b3dcbac3d12b42a841   # 匿名

# 具名挂载nginx "juming-nginx"
root@liuxiaoweideAir liuxiaowei # docker run -d -P --name nginx02 -v juming-nginx:/ect/nginx nginx
df397dd0401dc1f2904671efaeca9749c7813fca846ba097f890666785094327
root@liuxiaoweideAir liuxiaowei # docker volume ls
DRIVER    VOLUME NAME
local     f40d828c9c069666740ff54f90c35e6061071cf684198ca5c2e9caab7871fdf0
local     juming-nginx   # 具名
local     vsCodeServerVolume-liuxiaowei-recursing_leakey

# 查看一下这个具名卷
root@liuxiaoweideAir liuxiaowei # docker volume inspect juming-nginx
[
    {
   
        "CreatedAt": "2022-01-08T14:24:41Z",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",  # 挂载点
        "Name": "juming-nginx",
        "Options": null,
        "Scope": "local"
    }
]

所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用具名挂载

# 如何确定是具名挂载或者匿名挂载,还是指定路径挂载
-v 容器内路径        # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径    # 指定路径挂载

拓展:

# 通过 -v 容器内路径:ro rw 改变读写权限
ro  --- readonly    # 只读
rw  --- readwrite   # 可读可写
# 一旦设置了容器权限,容器对我们挂载出来的内容就有限定
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -p --name nginx02 -v juming-nginx:/etc/nginx:rw nginx

# ro 说明这个路径只能通过宿主机来操作,容器内部无法操作
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2天前
|
Linux Docker 容器
Docker操作 (二)
Docker操作 (二)
117 69
|
2天前
|
Docker 容器
Docker操作 (三)
Docker操作 (三)
125 69
|
2天前
|
Docker 容器
Docker操作 (五)
Docker操作 (五)
130 68
|
2天前
|
Linux Docker 容器
Docker操作 (四)
Docker操作 (四)
125 56
|
1天前
|
应用服务中间件 nginx Docker
Docker操作 (六)
Docker操作 (六)
10 1
|
1天前
|
数据可视化 Ubuntu Linux
Docker操作 (七)
Docker操作 (七)
|
1天前
|
运维 Docker 容器
Docker操作 (十)
Docker操作 (十)
|
2天前
|
Docker 容器 Java
Docker操作 (一)
Docker操作 (一)
20 0
|
1天前
|
关系型数据库 MySQL Linux
Docker操作 (九)
Docker操作 (九)
12 0
|
5月前
|
NoSQL 应用服务中间件 nginx
【Docker】2、Docker 基本操作【镜像操作】
【Docker】2、Docker 基本操作【镜像操作】
61 0