【Docker】Docker进阶--容器数据卷

本文详细介绍了Docker容器数据卷的使用,包括数据卷的好处、通过命令行挂载数据卷的方式,以及如何实现MySQL数据的持久化。还探讨了匿名挂载与具名挂载的区别,并讲解了在Dockerfile中定义数据卷的方法,以确保数据的安全与便捷管理。

容器数据卷

(一)什么是容器数据卷

1、容器卷好处

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

(二)挂载方式一:使用命令来挂载 -v

docker run -it -v [宿主机目录]:[容器目录] [镜像名字] /bin/bash

1、启动并进入容器

#启动并进入容器
root@ubuntu-xenial:/home/wqx# docker run -it -v /home/ceshi:/home/ centos /bin/bash

#查看本机home目录,已经存在了ceshi目录,说明挂载成功了

2、查看宿主机home目录,已经有了/ceshi目录,说明挂载成功了

root@ubuntu-xenial:/home# ll
total 28
drwxr-xr-x  7 root    root    4096 Aug 25 02:11 ./
drwxr-xr-x 26 root    root    4096 Aug 24 02:34 ../
drwxr-xr-x  2 root    root    4096 Aug 25 02:11 ceshi/
drwxr-xr-x  3 userftp userftp 4096 Aug 17 07:33 userftp/
drwxr-xr-x  4 vagrant vagrant 4096 Aug 25 02:11 vagrant/
drwxr-xr-x  3 root    root    4096 Aug 24 07:50 wqx/

3、查看容器信息 docker inspect 0380f85ec7bb

root@ubuntu-xenial:/home# docker inspect 0380f85ec7bb
"Mounts": [
            {
                "Type": "bind",
                "Source": "/home/ceshi",      #主机内地址
                "Destination": "/home",             #docker容器内的地址
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

4、测试

在宿主机/home/ceshi目录下增加一个文件

#在宿主机/home/ceshi目录下增加一个文件
root@ubuntu-xenial:/home/ceshi# touch wqx.php
root@ubuntu-xenial:/home/ceshi# ll
total 8
drwxr-xr-x 2 root root 4096 Aug 25 02:19 ./
drwxr-xr-x 7 root root 4096 Aug 25 02:11 ../
-rw-r--r-- 1 root root    0 Aug 25 02:19 wqx.php

然后在容器内/home目录下查看,也已经出现了同样的一个文件。

[root@0380f85ec7bb home]# ls
wqx.php
[root@0380f85ec7bb home]# 

5、Mysql数据持久化

(1)获取镜像

docker pull mysql:5.7

(2)运行容器,并做数据挂载

官方命令:docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

#启动我们自己的mysql
-d                  # 后台运行
-p                  # 端口映射
-v                  # 卷挂载
-e                  # 环境配置
--name              # 容器名字
root@ubuntu-xenial:/home/ceshi# 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 mysql01 mysql:5.7

通过SQLyog连接容器中的mysql,测试成功,添加一个test数据库,在主机的/home/mysql/data目录下,可以看到已经有test信息

即使将容器删除,主机存放的数据还是存在,就可以实现Mysql的数据持久化了。

6、匿名挂载和具名挂载

(1)匿名挂载

docker run -d -v [容器内路径]

(2)具名挂载

docker run -d -v [卷名]:[容器内路径]

(3)查看卷(volume)信息

docker volume inspect [卷名]

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

(4)拓展
  • ro readonly,只读
  • rw readwrite,可读可写
docker run -d -P --name nginx -v wqx-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx -v wqx-nginx:/etc/nginx:rw nginx

一旦设置了容器权限,容器对我们挂载出来的内容就有限定了。如果设置了ro权限,就说明这个路径只能通过宿主机来操作,容器内部是无法操作的。

(三)挂载方式二:Dockerfile

Dockerfile就是用来构建dockr镜像的构建文件。
简单写一个dockerfile脚本。

FROM centos
VOLUME ["volume01","volume02"]
CMD echo "---end---"
CMD /bin/bash

里面每一个命令,就是镜像的一层。
通过dockerfile启动容器 docker build -f /home/docker-test-volume/dockerfile -t wqx/centos:1.0 .

root@ubuntu-xenial:/home/docker-test-volume# docker build -f /home/docker-test-volume/dockerfile -t wqx/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
 ---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
 ---> Running in e8f889920880
Removing intermediate container e8f889920880
 ---> 51b9e3840f47
Step 3/4 : CMD echo "---end---"
 ---> Running in cabe2101c3b5
Removing intermediate container cabe2101c3b5
 ---> e262b693a79a
Step 4/4 : CMD /bin/bash
 ---> Running in c69bc9ca79ae
Removing intermediate container c69bc9ca79ae
 ---> 68a74b5c7007
Successfully built 68a74b5c7007
Successfully tagged wqx/centos:1.0
root@ubuntu-xenial:/home/docker-test-volume# 

执行完成后,查看镜像

root@ubuntu-xenial:/home/docker-test-volume# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
wqx/centos    1.0       68a74b5c7007   2 minutes ago   209MB

启动自己的镜像
docker run -it wqx/centos /bin/bash

好的,关于 Docker 数据卷进阶篇,我可以为你提供以下内容: 1. 数据卷的类型 Docker 数据卷有三种类型:主机挂载、匿名卷、命名卷。其中,主机挂载是将主机上的目录挂载到容器中;匿名卷是在容器内部创建的临时卷;命名卷则是给卷起一个名字,并将其保存在 Docker 数据卷存储区中。 2. 数据卷的备份与恢复 我们可以使用 Docker Compose 中的 `docker-compose.yml` 文件来定义数据卷的备份和恢复。具体方法是,在 `volumes` 字段中定义卷及其备份路径,然后在 `services` 字段中指定容器和对应的卷名称。 例如: ``` version: "3" services: db: image: mysql volumes: - db_data:/var/lib/mysql command: --default-authentication-plugin=mysql_native_password backup: image: backup volumes: - /path/to/backup:/backup - db_data:/data/db command: backup.sh volumes: db_data: ``` 以上代码中,我们定义了一个 `db` 服务和一个 `backup` 服务。其中,`db` 服务使用了名为 `db_data` 的命名卷,并挂载到容器的 `/var/lib/mysql` 目录中;`backup` 服务则使用了两个卷,一个是挂载到宿主机上的 `/path/to/backup` 目录,用于保存备份文件;另一个是使用了 `db_data` 命名卷,并挂载到容器的 `/data/db` 目录中,用于备份数据。最后,我们在 `backup` 服务中执行了备份脚本 `backup.sh`。 3. 数据卷的共享 我们可以将一个数据卷挂载到多个容器中,实现数据的共享。例如,我们可以将一个命名卷挂载到 `web` 和 `db` 两个服务中,这样它们就可以共享数据了。 ``` version: "3" services: web: image: nginx volumes: - web_data:/usr/share/nginx/html db: image: mysql volumes: - db_data:/var/lib/mysql - web_data:/var/www/html volumes: db_data: web_data: ``` 以上代码中,我们定义了一个 `web` 服务和一个 `db` 服务。其中,`web` 服务使用了名为 `web_data` 的命名卷,挂载到容器的 `/usr/share/nginx/html` 目录中;`db` 服务则使用了 `db_data` 和 `web_data` 两个卷,分别挂载到容器的 `/var/lib/mysql` 和 `/var/www/html` 目录中,实现了数据的共享。 希望以上内容能够对你有所帮助!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值