欢迎各位兄弟 发布技术文章
这里的技术是共享的
了解一下 Docker 的 Data Volumes 。
封面摄影:Jack Jablonski
来自 https://ninghao.net/course/3808#info
1)存储
Docker 的镜像是用一层一层的文件组成的 .. Docker 有一些存储引擎会去处理怎么样存储这些文件。 使用 docker inspect 命令可以查看镜像或者容器 .. 比如我想查看一下 centos 这个镜像 ..
# docker inspect centos
这里的 Layers 就是 centos 这个镜像的几层文件 .. 这些东西都是只读的,是不能修改的 .. 我们基于这个镜像创建的自己的镜像也会共享这些文件层 ..
基于这个镜像去创建的容器也会共享这些文件层 ..
然后 Docker 会在这些层的上面为容器添加一个新的可以读写的文件层 .. 如果需要修改共享的文件层里的东西,Docker 会复制一份到这个可读写的文件层里面 ..
当我们删除掉这个容器的时候,同时也会删除掉在它的可读写的容器层上的文件 ... 下面我们去做几个测试 .. 先去创建一个带交互的容器 .. 名字是 test1 .. 用的镜像是 centos ..
# docker run -i -t --name test1 centos bash
# echo 'hello ninghao.net' > hello. txt
# cat hello. txt
# exit
在它的根目录的下面创建一个新的文件 .. echo 'hello ninghao.net' > hello.txt .. 再查看一下 cat hello.txt .. 会输出文件的内容 .. 再退出这个容器 ..
然后再用 centos 这个镜像创建一个容器 .. 名字是 test2 .. 我们可以试着输出根目录下的 hello.txt .. 提示没有找到这个文件 ..
# docker run -i -t --name test2 centos bash
# cat hello. txt
虽然 test1 还有 test2 都是基于 centos 这个镜像创建的 .. 不过它们都会拥有各自的可读写的一个文件层 .. 新创建的文件或者被修改的已有的文件都会在这个文件层上面 .. 不会影响到镜像本身,或者其它的使用这个镜像创建的容器 ..
# docker rm test1 test2
删除容器的时候,这些在容器层上面的文件也会被删除掉 .. 如果有些数据你想一直保存,比如 Web 服务器的日志,数据库管理系统里的数据 .. 我们可以为容器创建一个数据盘,然后把这些要长期保存的数据放到这些数据盘上 ..
来自 https://ninghao.net/video/3809#info
2)数据卷:Data Volumes
如果在容器里,你有一些想要长久保存的数据,我们可以把它们放在一个 Data volumes 里面,可以翻译成数据卷 .. 或者数据盘 .. 在它们上面的数据,即使把容器删除掉也会被保留 ...
在创建容器的时候我们可以给它指定一下数据盘,其实就是去指定一个特定的目录,剩下的事儿 Docker 都为你做了 .. 下面我们去创建一个容器 .. docker run .. 加上一个 --volume .. 或者使用它的简写形式 .. 就是一个 -v ... 后面是一个目录的绝对路径 .. 这个目录就会作为一个数据盘 .. 这里我们设置成 /mnt
我们可以创建一个带交互的容器 .. 然后在容器里去创建一个文件,再删除掉这个容器,看看数据是否还会保留 .. 用一个 -i -t .. 给这个容器起个名字 .. 叫它 db .. 用的镜像是 centos .. 终端使用 bash ..
# docker run --volume /mnt -i -t --name=db centos bash # --volume 可以简写为 -v,,, -i是 --interactive的缩写,表示交互 ,,, -t 是 --tty 的缩写,表示终端 ,,,bash是终端
# cd /mnt
# touch data1
# ls
#exit
进入到容器的 /mnt .. 在它下面创建一个文件 .. touch data1 ... 再退出这个容器 .. exit ..
然后检查一下刚才我们创建的 db 这个容器 ..
# docker inspect db
找到 Mounts ..
这里,Source 的值就是我们给容器指定的数据盘在主机上的位置 .. Destination 的值是这个数据盘在容器上的位置 .. 复制一下 Source 的值 .. 在这个地方我们可以找到 db 这个容器的数据盘里面的数据 ..
再去把 db 这个容器删除掉 ..
# docker rm db
然后可以登录到 Docker 默认的这个机器上 .. 其实这个机器才是真正运行 docker 的地方 .. .
# docker-machine ssh default
查看一下这个目录 ..
# sudo ls /mnt/sda1 /var/lib/docker/volumes/724ca4ee86ad216277632a087e4ba042e3b550bde431353b02b226dca3b36d32/_data
在这里,你会看到我们刚才在 db 这个容器里的数据盘上创建的这个 data1 这个文件 ... 虽然我们已经把这个容器删除掉了,但是它的数据盘里的数据仍然会保留在这里 ..
来自 https://ninghao.net/video/3810#info
3)指定主机目录作为数据盘
我们可以手工的指定用主机上的一个目录作为容器上的一个数据盘。先进入到某个目录的下面 .. 比如我的桌面上 .. 新建一个目录 .. 名字可以是 data .. 我们可以把它作为容器的一个数据盘 .. 查看一下当前目录的位置 .. pwd ..
再去创建一个容器 .. docker run 加上一个 -v , 然后先是主机上的目录的绝对位置 .. 我这里就是 /Users/wanghao/desktop/data .. Windows 上应该加上盘符 .. 比如 /c/Users ...
冒号的右边儿是数据盘在容器上的位置 .. 把它设置成 /mnt .. 这里我们还是创建一个带交互的容器 .. -i -t .. 给它起个名字 .. 叫 db .. 使用一下 centos 这个镜像 .. 终端用一下 bash ..
进入到容器的 /mnt 的下面 .. 这个目录就是这个容器的数据盘 .. 在这里新建一个文件 touch data1 .. 然后退出这个容器 ..
再把这个容器删除掉 .. docker rm db ..
查看一下我的桌面上的 data 这个目录 .. 这里会有我们在 db 这个容器的数据盘里面创建的一个文件 .. 就是这个 data1 ...
# cd ~/desktop
# mkdir data
# pwd
# docker run -V /Users/wanghao/desktop/data: /mnt -i -t --name=db centos bash
[root@6c798662b322 / ]# cd /mnt
[root@6c798662b322 mnt]# touch data1
[root@6c798662b322 mnt]# exit
# docker rm db
db
# ls data
来自 https://ninghao.net/video/3811#info
4)数据容器
我们可以去创建一个数据容器,也就是在创建这个容器的时候去给它指定一个数据盘,然后让其它的容器可以使用这个数据容器作为它们的数据盘 .. 有点像是去继承在这个数据容器里面指定的数据盘 ..
创建这样的容器可以使用 docker create .. 意思就是只去创建这个容器,不去运行它 .. 加上一个 -v 指定一下数据盘的位置 .. 比如把它设置成 /mnt .. 用一个 --name 给它起个名字 .. dbcenter .. 使用的镜像是 centos ..
docker create -v /mnt --name dbcenter centos
然后我们可以再去创建一些容器,让它们使用这个数据容器 .. docker run .. 加上一个 --volumes-from .. 后面加上数据容器的名字 .. dbcenter 就是刚才我们创建的那个数据容器 ..
给这个容器也起个名字 .. 比如 db1 .. 再加上一个 -i -t 的选项 .. 用的镜像是 centos .. 执行一下 bash .. 进入到这个容器以后, 再进入到它的 /mnt .. 这个目录就是这个容器用的数据盘 .. 这个数据盘是 dbcenter 这个数据容器指定的位置 ..
在它下面创建一个文件 .. touch data1 .. 查看一下当前目录下面的文件 .. 这里会有一个 data1 ..
然后再退出来 .. 下面我们可以再去创建一个容器 .. 叫它 db2 .. 它也使用了 dbcenter 作为它的数据容器 ..
进入到 /mnt .. 查看一下 .. 你会发现,在这里有我们在 db1 容器里创建的 data1 这个文件 .. 同样我们在这个容器下面保存到这个位置的数据,在其它使用了 dbcenter 这个数据容器的容器里面,也可以看到。
# docker create -v /mnt --name dbcenter centos # 创建这个容器,不去运行它,,,,,,,,, -v 是 --Volume 的缩写
# docker run --volumes-from dbcenter --name db1 -i -t centos bash # --volumes-from .. 后面加上数据容器的名字 .. dbcenter 就是刚才我们创建的那个数据容器,,我们使用这个数据容器
# cd /mnt
# touch data1
# ls
#exit
# docker run --volumes-from dbcenter --name db2 -i -t centos bash # --volumes-from .. 后面加上数据容器的名字 .. dbcenter 就是刚才我们创建的那个数据容器 ,,我们使用这个数据容器
# cd /mnt
# ls #看到了 data1
来自 https://ninghao.net/video/3812#info
5)管理数据盘
查看在主机上创建的数据盘,可以执行一下
# docker volume ls
.. 这里有两个数据盘 .. 在删除容器的时候,默认 Docker 不会把它的数据盘删除掉 ..
我们可以查看一下已经没有容器使用的数据盘 ..
# docker volume ls -f dangling=true #这里显示的就是一个已经没人使用的数据盘 .. dangling 是悬空,悬吊的意思
想把它删除掉可以执行一下
# docker volume rm 262eb92492ae1d744d9fe7ea019d0038761d81121262505890052def7a321b35 # 262eb92492ae1d744d9fe7ea019d0038761d81121262505890052def7a321b35是要删除掉的数据盘的名字
后面加上要删除掉的数据盘的名字 ...
再查看一下 ...
# docker volume ls
现在这里就剩下一个数据盘了 .. 查看一下所有的容器 ...
# docker ps -a #查看一下所有的容器
我们可以先删除掉 db1 .. 还有 db2 这两个容器 ..
# docker rm db1 db2
# docker volume ls
# docker volume inspect 870c44845da3f361d56751587e6ea2190d4a3ee51e70ba701bb66c97a719c93e
# docker rm -v dbcenter #删掉 数据盘的容器 dbcenter,,,,,才会删掉数据盘
# docker volume ls
然后查看一下数据盘 .. 这个数据盘仍然会在这里 .. 再去检查一下这个数据盘 .. docker volume inspect .. 后面再加上它的名字 ..
这里的 Mountpoint .. 就是这个数据盘在主机上的位置 ..
最后我们再把最后一个使用这个数据盘的容器也删除掉 .. 就是这个 dbcenter .. 这里我们在删除的时候,加上一个 -v .. 这样会把它的数据盘也一块儿删除掉 ..
查看一下数据盘的列表 .. 现在我们已经把所有的数据盘都删除掉了 ...
来自 https://ninghao.net/video/3813#info