前言
前面已经写了两篇关于 docker 的博文了, 在工作中有关 docker 的基本操作已经基本讲解完了. 相信现在大家已经能够熟练配置 docker 以及使用 docker 来创建镜像以及容器了. 本篇博客将会讲解如何让容器中的一个目录与宿主机的一个目录进行绑定. 这样就可以实现容器与宿主机之间的文件共享.
例如: 我们只要把网站数据放到宿主机的共享文件中, 无需再频繁登录容器, 就可以实现网站的部署, 这样是不是很酷?
接下来本篇博客将会使用几个简单的命令带你完整演示上面的例子怎么玩.
另外, 在《Docker 端口映射及创建镜像演示 (二)-- 技术流 ken》我的这篇博文中虽然可以创建镜像, 但是还是严重依赖于一个别人做好的一个镜像, 无法定制自己的镜像, 其实更适合于备份或者容错使用.
下一篇博客将会再讲解一个创建镜像更高级的操作, 让你可以真正定制属于自己的镜像.
但鉴于篇幅大小, 本篇博客先详细讲解数据卷 volume, 具体如何创建更高级的镜像, 将会在下一篇博客中具体演示, 敬请期待.
数据卷 volume 功能特性
数据卷 是一个可供一个或多个容器使用的特殊目录, 实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定. 数据卷 是被设计用来持久化数据的
对于数据卷你可以理解为 NFS 中的哪个分享出来的挂载点, 指宿主机共享的目录.
主要有如下的功能和特性
容器中数据的持久存储
容器间的资源共享
容器的迁移 (分布式)
对数据卷的修改会立马生效
对数据卷的更新, 不会影响镜像
数据卷默认会一直存在, 即使容器被删除 (注意 docker 自主管理的会被删除, 容器删除前一定要对数据卷进行备份)
数据卷 volume 共享方式
实现数据卷有如下三种方法
Bind mount volume: 用户需要明确指定容器中的目录和宿主机中的哪个目录进行绑定
Docker Management Volume:docker daemon 自行管理将容器中的目录和宿主机中的哪个目录进行绑定
基于一个现有容器实现多个容器之间文件共享
数据卷 volume 文件共享之 Bind Mount Volume
1. Bind mount volume
第一步: 在宿主机创建目录并准备测试文件
- [root@ken ~]# mkdir /ken
- [root@ken ~]# echo "test for volumes by ken">/ken/index.html
第二步: 启动容器
-it: 互动模式登录容器, 并分配一个终端
--name: 指定容器名称
-p: 小 p 指定容器的 80 端口映射为宿主机的 7879 端口. 忘记的童鞋可以温习我上一篇博客《Docker 端口映射及创建镜像演示 (二)-- 技术流 ken》
--rm: 表示退出容器时, 容器一起删除
-v: 指定 volumes, 格式为: 宿主机共享目录: 容器目录 , 这样宿主机的 / ken 目录就被挂载到了容器的 / data / 目录下了
- [root@ken ~]# docker container run -it --name ken1 -p 7879:80 --rm -v /ken:/data/ busybox
- / #
第三步: 查看挂载点
可以发现容器内有了 / data 目录而且还有了我们创建测试文件
注意: 如果容器内没有我们指定的挂载点, 会自动创建
- [root@ken ~]# docker container run -it --name ken -v /ken:/data/ busybox
- / # ls /data
index.HTML
- / # cat /data/index.HTML
- test for volumes by ken
第四步: 启动容器的 apache
/ # httpd -h /data
第五步: 查看端口
可以发现现在宿主机已经有了 7879 端口了
- [root@ken ~]# ss -tnl
- State Recv-Q Send-Q Local Address:Port Peer Address:Port
- LISTEN 0 128 *:111 *:*
- LISTEN 0 1024 127.0.0.1:8080 *:*
- LISTEN 0 511 *:80 *:*
- LISTEN 0 128 *:22 *:*
- LISTEN 0 1024 :::7879 :::*
- LISTEN 0 70 :::3306 :::*
- LISTEN 0 128 :::111 :::*
- LISTEN 0 128 :::22 :::*
第六步: 浏览器进行访问
现在我们就可以使用宿主机的 IP 地址加上我们映射的端口就可以访问容器中的网站数据内容了
第七步: 修改网站数据进行测试
现在我们修改宿主机分享出去的目录下的内容, 检查看容器内的内容是否会发生改变
[root@ken ~]# echo "this is the append line for ken">> /ken/index.HTML
第八步: 浏览器刷新
可以发现我们追加的内容已经可以看到了, 说明容器中网站数据内容已经被成功修改了
数据卷 volume 文件共享之 Docker Management Volume
Docker Management Volume 与 Bind Mount Volume 区别就是它会自己管理将会把容器中的目录与宿主机哪个目录进行绑定
第一步: 启动容器
这个时候的 - v 后面只需要跟上容器内的一个目录即可
[root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox
第二步: 查看容器的目录
可以发现目录不存在也是自动创建
现在目录下没有任何文件
- [root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox
- / # ls /data/
- / #
第三步: 查看挂载点
我们检查看下容器内的这个目录被挂载到了那个宿主机的那个位置
可以发现容器中的 data 目录被挂载到了宿主机的如下目录下
- [root@ken ~]# docker container inspect ken1 | grep Source
- "Source": "/var/lib/docker/volumes/61535b617c3d6a41d2a8dd965622bb44e27029c1fffbb166bc940fcffd069560/_data",
第四步: 宿主机创建文件进行测试
我们可以在宿主机的共享目录中创建文件查看容器内是否有相同文件即可验证
- [root@ken ~]# cd /var/lib/docker/volumes/61535b617c3d6a41d2a8dd965622bb44e27029c1fffbb166bc940fcffd069560/_data
- [root@ken _data]# touch ken{
- 1..5
- }
- [root@ken _data]# ls
- ken1 ken2 ken3 ken4 ken5
第五步: 容器内查看
第二次查看 / data 目录下即可发现我们刚才在宿主机内创建的文件了
- [root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox
- / # ls /data/
- / # ls /data/
- ken1 ken2 ken3 ken4 ken5
- / #
数据卷 volume 文件共享之基于一个现有容器
第一步: 再次启动一个容器
--volumes-from: 后面指定容器名, 上一个实验我已经启动了一个容器 ken1
[root@ken ~]# docker run --name ken2 -it --volumes-from ken1 --rm busybox
第二步: 查看新容器的文件
可以在新创建的容器有了我们之前创建容器的文件了
- / # ls /data/
- ken1 ken2 ken3 ken4 ken5
第三步: 在新容器内创建新的文件
如下我创建了一个 kenken 的文件
- / # cd /data
- /data # touch kenken
- /data # ls ./
- ken1 ken2 ken3 ken4 ken5 kenken
第四步: 查看 ken1 容器
在 ken1 容器内查看是否已经有了我们创建的文件
可以发现在 ken1 容器内也有了我们在新容器内创建的文件了
- [root@ken ~]# docker container run -it --name ken1 --rm -v /data/ busybox
- / # ls /data/
- / # ls /data/
- ken1 ken2 ken3 ken4 ken5
- / # ls /data
- ken1 ken2 ken3 ken4 ken5 kenken
第五步: 查看宿主机
其实这个时候宿主机也应该有我们刚才创建的文件
这样就实现了多台容器之间以及和多台容器和宿主机之间的文件共享
- [root@ken ~]# ls /var/lib/docker/volumes/61535b617c3d6a41d2a8dd965622bb44e27029c1fffbb166bc940fcffd069560/_data
- ken1 ken2 ken3 ken4 ken5 kenken
数据卷 volume 之实现数据迁移备份
相信大家在读懂上面的实验之后对于如何实现数据的迁移备份已经有了大概的认识, 其实我们只要备份宿主机共享目录下的数据即可.
下面进行详细演示, 我还是以我上面的实验为基础, 实现删除容器 ken1,ken2, 再次创建一个容器 ken3, 实现数据的迁移.
第一步: 删除容器
下面我将所有的容器都删除掉了
- [root@ken ~]# docker container rm $(docker ps -a -q)
- a8b4931d0482
- b0a31b4fabe5
- 636651b79907
- 1b47e65fbb56
- e958c6ea706b
- c8b820f356ec
- [root@ken ~]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
第二步: 查看宿主机文件
数据卷有一个特性就是即使容器被删除了, 数据卷也会一直存在
但是需要注意 docker 自主管理的数据卷会被删除, 容器删除前一定要做备份.
现在我们自己创建的数据卷还在
- [root@ken ~]# cat /ken/index.HTML
- test for volumes by ken
- this is the append line for ken
第三步: 启动一个容器
[root@ken ~]# docker run --name ken3 -it -p 6767:80 -v /ken:/data/ --rm busybox
第四步: 启动容器的 apache
/ # httpd -h /data
第五步: 浏览器访问
访问浏览器可以看到如下的界面
这样就实现了数据的迁移.
来源: https://www.cnblogs.com/kenken2018/p/10040310.html