• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

Docker数据持久化容器数据卷,利用容器卷安装Mysql,Docker的具名和匿名挂载

互联网 diligentman 2周前 (04-07) 12次浏览

容器数据卷

什么是容器卷

docker的理念回顾:

将应用和运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对于数据的要求,是希望能够持久化的!

就好比,你安装一个MySQL,结果你把容器删了,就相当于删库跑路了,这TM也太扯了吧!所以我们希望容器之间有可能可以共享数据,Docker容器产生的数据,如果不通过docker commit 生成 新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了!这样是行不通的!

为了能保存数据在Docker中我们就可以使用卷!让数据挂载到我们本地!这样数据就不会因为容器删除而丢失了!

作用:

卷就是目录或者文件,存在一个或者多个容器中,由docker挂载到容器,但不属于联合文件系统,因此、能够绕过 Union File System ,

提供一些用于持续存储或共享数据的特性: 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

特点:

  • 1、数据卷可在容器之间共享或重用数据
  • 2、卷中的更改可以直接生效
  • 3、数据卷中的更改不会包含在镜像的更新中
  • 4、数据卷的生命周期一直持续到没有容器使用它为止
  • 所以:总结一句话: 就是容器的持久化,以及容器间的继承和数据共享!

使用数据容器卷

容器中直接使用命令来添加

# 命令
docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
# 测试
[root@kuangshen ~]# docker run -it -v /home/ceshi:/home centos /bin/bash

# 查看数据卷是否挂载成功  
docker inspect 容器id

Docker数据持久化容器数据卷,利用容器卷安装Mysql,Docker的具名和匿名挂载

测试容器和宿主机之间数据共享:可以发现,在容器中,创建的会在宿主机中看到!

测试容器停止退出后,主机修改数据是否会同步!

  1. 停止容器
  2. 在宿主机上修改文件,增加些内容
  3. 启动刚才停止的容器
  4. 然后查看对应的文件,发现数据依旧同步!ok

使用docker安装mysql

# 1、搜索镜像
docker search mysql

/2、 拉取镜像
docker pull mysql:5.7

# 3、启动容器 -e 环境变量!
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名称
# 注意: mysql的数据应该不丢失!先体验下 -v 挂载卷! 参考官方文档
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7

# 4、使用本地的navicat连接测试一下 3306
连接成功,新建一个数据库,发现已经映射到本地目录了

Docker数据持久化容器数据卷,利用容器卷安装Mysql,Docker的具名和匿名挂载

# 强迫症来了,尝试删除mysql,重新下载,看是否数据可以正常看到
 docker rm -f mysql01 # 删除容器
 docker rmi -f a70d36bc331a # 删除镜像
 # 重新使用docker安装mysql
 docker pull mysql:5.7
 # docker 运行挂在mysql(这一次更改mysql容器名称)
 docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 mysql:5.7
 
 #使用本地navicat在次连接
 
 发现,如下图:我们挂在到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能!

Docker数据持久化容器数据卷,利用容器卷安装Mysql,Docker的具名和匿名挂载

Docker的具名和匿名挂载

# 匿名挂载
# -v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx

[root@localhost ~]# docker run -d -P --name nginx01 -v /etc/nginx nginx


# 匿名挂载的缺点,就是不好维护,通常使用命令 docker volume 维护
docker volume ls

[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     4ae3a756b1fdd8e4c9de81edc88b8c2e8b36b46788a9bf5cc47e3b0300a7ecf9
local     68e1b068d937464acb9d0bfb435a1d464e8b845c931a63f7b48aad326ac51136
local     452f1aae51648f77f60f26ef0f78808e086827e291a9f8fbb7ea7481b53cb2b9
local     605780dd9b43ed7444f6aecb47dc4b4296906f08dffd434baf229d2b9f4d5946
local     c1fd12a5cc4685505b8f7044a911e143340a9143aefee667a83153c36dab67a2


# 这里我们发现,这种就是匿名挂载,我们在-v 只写了容器内的路径,没有写容器外的路径

#具名挂载
# -v 卷名:/容器内路径
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx

[root@localhost ~]# docker volume ls
DRIVER    VOLUME NAME
local     juming-nginx   # 可以看到具名挂载可以看到名称了


# 查看具名挂载的路径
docker volume inspect juming-nginx


[root@localhost ~]# docker volume inspect juming-nginx
[
    {
        "CreatedAt": "2021-04-07T19:54:02+08:00",
        "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== 这个目录

进入这个目录可以查看一下

[root@localhost ~]# cd /var/lib/docker/volumes/juming-nginx/
[root@localhost juming-nginx]# cd _data/
[root@localhost _data]# ls -l
总用量 36
drwxr-xr-x. 2 root root   26 4月   7 19:54 conf.d
-rw-r--r--. 1 root root 1007 12月 15 21:59 fastcgi_params
-rw-r--r--. 1 root root 2837 12月 15 21:59 koi-utf
-rw-r--r--. 1 root root 2223 12月 15 21:59 koi-win
-rw-r--r--. 1 root root 5231 12月 15 21:59 mime.types
lrwxrwxrwx. 1 root root   22 12月 15 21:59 modules -> /usr/lib/nginx/modules
-rw-r--r--. 1 root root  643 12月 15 21:59 nginx.conf   # nginx的配置文件
-rw-r--r--. 1 root root  636 12月 15 21:59 scgi_params
-rw-r--r--. 1 root root  664 12月 15 21:59 uwsgi_params
-rw-r--r--. 1 root root 3610 12月 15 21:59 win-utf

结果清楚可以看到具名挂载一个卷成功

我们通过具名挂载可以方便的找到我们的一个卷;大多数情况在使用的具名挂载

# 怎么判断挂载的是卷名而不是本机目录名?
不是/开始就是卷名,是/开始就是目录名
-v 容器内路径  # 匿名挂载
-v 卷名:容器内路径  # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径
# 改变文件的读写权限
# ro: readonly
# rw: readwrite
# 指定容器对我们挂载出来的内容的读写权限
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v nginxconfig:/etc/nginx:rw nginx

展开阅读全文

nginx

© 著作权归作者所有

举报

打赏

0


0 收藏

微信
QQ
微博

分享

作者的其它热门文章

SpringBoot整合Redis,2021最新版
树莓派 raspi-config 设置详解
树莓派搭建java web服务器(一)—树莓派入门系统安装
树莓派 安装mysql


喜欢 (0)