1、 docker 数据卷管理简介
2 、bind mount 挂载方式
[root@server1 ~]# docker rm -f 'docker ps -aq' 删除所有容器
[root@server1 ~]# docker network prune 删除所有没有使用的网络
Are you sure you want to continue? [y/N] y
Deleted Networks:
mynet3
mynet1
mynet2
[root@server1 ~]# mkdir /webdata 创建目录
[root@server1 ~]# docker run -d --name demo -v /webdata:/usr/share/nginx/html nginx
/usr/share/nginx/html 此路经是nginx容器的默认程序发布目录,-V 表示指定挂载路经, /webdata:/usr/share/nginx/html 冒号前面是宿主机路经, 冒号后面是容器路经
[root@server1 webdata]# vim index.html 创建发布页面
www.westos.org
[root@server1 webdata]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8ddf1f3fb99f nginx "/docker-entrypoint.…" 30 minutes ago Up 30 minutes 80/tcp demo 容器以运行
[root@server1 webdata]#
[root@server1 webdata]# docker inspect 8ddf1f3fb99f 查看容器详细信息
[root@server1 webdata]# curl 172.17.0.2 访问容器
www.westos.org 可以看到nginx默认发布页面内容
[root@server1 webdata]# docker exec -it demo bash docker exec 表示在容器中执行命令
root@8ddf1f3fb99f:/#
root@8ddf1f3fb99f:/# cd /usr/share/nginx/html/ 进入nginx默认发布目录里
root@8ddf1f3fb99f:/usr/share/nginx/html# ls
index.html
root@8ddf1f3fb99f:/usr/share/nginx/html# cat index.html
www.westos.org 可以发现这里面的内容就是刚才在宿主机写的内容
也可以将容器的配置文件挂载到容器里,从而进行修改配置文件
[root@server1 webdata]# docker rm -f demo 删除之前容器
demo
[root@server1 ~]# cd /webdata/
[root@server1 webdata]# mkdir conf
[root@server1 webdata]# mkdir html
[root@server1 webdata]# ls
conf html index.html
[root@server1 webdata]# mv index.html html/
[root@server1 webdata]# cd conf/ 进入conf目录
[root@server1 conf]# vim www.conf 创建nginx虚拟主机
server {
listen 80;
server_name www.westos.org;
location / {
root /html; 虚拟主机默认发布目录
index index.html;
}
}
[root@server1 ~]# docker run -d --name demo -v /webdata/html:/html -v /webdata/conf/www.conf:/etc/nginx/conf.d/www.conf:ro -p 80:80 nginx
-v /webdata/html:/html 冒号后面/html是我们设置的虚拟主机默认发布目录
www.conf:ro ro是权限,只读
[root@server1 ~]# docker ps 查看
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c22949c67c4a nginx "/docker-entrypoint.…" 2 minutes ago Up 2 minutes 80/tcp demo 容器已经运行
[root@server1 ~]# vim /etc/hosts 在宿主机上添加解析
172.25.50.1 server1 reg.westos.org www.westos.org
[root@server1 ~]# curl www.westos.org 访问宿主机的80,通过端口映射定向到容器的80
www.westos.org
[root@server1 ~]# cd /webdata/html/ 进入宿主机html目录
[root@server1 html]# vim index.html 修改文件
www.westos.org
www.westos.org
www.westos.org
www.westos.org
[root@server1 html]# curl www.westos.org 访问,容器内的默认发布页面也发生的变化,因为宿主机和容器是相同的
www.westos.org
www.westos.org
www.westos.org
www.westos.org
3、docker 管理卷
docker managed 管理卷有固定位置,必须是此数据卷目录( /var/lib/docker/volumes) 挂接到容器内
[root@server1 volumes]# docker history registry
[root@server1 volumes]# docker volume create vol1 创建vol1卷
vol1
[root@server1 volumes]# docker run -d --name registry -v vol1:/var/lib/registry registry 此处也可以不用-V 去指定docker会自动创建数据源目录,
var/lib/registry 此路经是registry默认挂载路经
[root@server1 ~]# docker rm -f registry 删除registry容器
registry
[root@server1 ~]# docker run -d --name nginx -v vol1:/usr/share/nginx/html nginx 再次运行一个nginx容器,不用指定路经,直接写管理卷名字vol1
[root@server1 ~]# cd /var/lib/docker/volumes/
[root@server1 volumes]# ls
metadata.db vol1
[root@server1 volumes]# cd vol1/
[root@server1 vol1]# ls
_data
[root@server1 vol1]# cd _data/
[root@server1 _data]# ls
50x.html index.html 有数据,是因为宿主机挂接容器的目录里面有数据,他会拷贝到宿主机数据卷目录里
[root@server1 _data]# docker run -d --name nginx2 -v /web:/usr/share/nginx/html nginx 再次运行一个容器,用mount方式挂载
[root@server1 ~]# cd /web
[root@server1 web]# ls 数据为空, 此方式是以宿主机创建的数据卷目录里内容为主,覆盖此数据卷目录
4、卷插件简介
官方提供可选卷插件 卷插件作用:卷插件是用来跨主机存储的 本次实验选用Convoy plugin卷插件
4、1 Convoy 卷插件
[root@server1 ~]# mkdir /mnt/nfs
[root@server1 ~]# vim /etc/exports
[root@server1 ~]# mkdir /mnt/nfs 创建nfs目录
[root@server1 ~]# vim /etc/exports
/mnt/nfs *(rw,no_root_squash) 共享/mnt/nfs目录 ,所有主机具有读写权限 ,no_root_squash表示超级用户挂载不要变更权限
[root@server1 ~]# chmod 777 /mnt/nfs/ 给nfs目录所有权限
[root@server1 ~]# yum install nfs-utils -y 安装nfs安装包
[root@server1 ~]# systemctl start nfs 启动nfs网络文件系统
[root@server1 ~]# showmount -e 显示共享目录列表
Export list for server1:
/mnt/nfs *
在server2上
[root@server2 ~]# mkdir /mnt/nfs
[root@server2 ~]# yum install nfs-utils -y 安装nfs
[root@server2 ~]# mount 172.25.50.1:/mnt/nfs/ /mnt/nfs 将server1上的nfs目录挂载到server2的nfs目录上
[root@server2 ~]# cd /mnt/nfs/ 进入nfs共享目录
[root@server2 nfs]# touch file 在nfs目录里创建文件
[root@server1 ~]# cd /mnt/nfs/
[root@server1 nfs]# ls 可以发现server1 上nfs目录也有file文件,是互通的
file
[root@server1 nfs]# rm -fr file 删除,server2nfs目录也没有了
[root@foundation50 isos]# cd /mnt/pub/docker/
[root@foundation50 docker]# scp convoy.tar.gz server1: 将下在好的convoy压缩包拷贝到server1上
[root@server1 ~]# tar zxf convoy.tar.gz 解压
[root@server2 ~]# cd convoy/
[root@server1 convoy]# ls
convoy convoy-pdata_tools SHA1SUMS
[root@server1 convoy]# mv convoy* /usr/local/bin/ 将两个二进制程序放到/usr/local/bin/目录里,进行全局调用
[root@server1 ~]# mkdir -p /etc/docker/plugins 此路经为缺省的socket文件扫描路经,docker引擎自动会在此路经扫描插件
[root@server1 ~]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs & 启动服务
--drivers vfs 表示驱动 -driver-opts 驱动参数 vfs.path 表示指定共享目录
[root@server1 run]# cd convoy/
[root@server1 convoy]# ls
convoy.sock
[root@server1 convoy]# pwd
/var/run/convoy 此路经就是自己的sockt文件路经
[root@server1 convoy]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec 将sockt路经写入到刚才建立的/etc/docker/plugins/目录里convoy.spec文件中
在server2上进行同样操作
[root@foundation50 docker]# scp convoy.tar.gz server2:
[root@server2 ~]# tar zxf convoy.tar.gz
[root@server2 ~]# tar zxf convoy.tar.gz 解压
[root@server2 ~]# cd convoy/
[root@server2 convoy]# mv convoy* /usr/local/bin/
[root@server2 ~]# mkdir -p /etc/docker/plugins
[root@server2 convoy]# convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs &
[root@server2 convoy]# echo "unix:///var/run/convoy/convoy.sock" > /etc/docker/plugins/convoy.spec
测试:
[root@server1 convoy]# convoy --help 相关指令可以--help
[root@server1 convoy]# convoy create vol1 创建卷
[root@server1 convoy]# convoy list 列出卷
{
"vol1": {
"Name": "vol1",
"Driver": "vfs",
"MountPoint": "",
"CreatedTime": "Sat Feb 26 22:39:01 +0800 2022",
"DriverInfo": {
"Driver": "vfs",
[root@server2 convoy]# convoy list 在server2上也可以列出刚才在server1上建立的卷
{
"vol1": {
"Name": "vol1",
"Driver": "vfs",
"MountPoint": "",
"CreatedTime": "Sat Feb 26 22:39:01 +0800 2022",
"DriverInfo": {
"Driver": "vfs"
[root@server2 convoy]# convoy create vol2 也可以在server2上创建卷
[root@server1 convoy]# docker volume ls 查看卷信息
[root@server1 convoy]# docker volume rm vol1 删除
[root@server1 convoy]# docker volume rm -f 'docker ps -aq' 删除所有卷
[root@server1 convoy]# docker volume ls 查看卷信息
[root@server1 convoy]# docker run -d --name demo -v vol1:/usr/share/nginx/html nginx
运行容器,使用管理卷挂载(管理卷不需要写路经,直接写卷名称vol1)
[root@server1 convoy]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cb45a25c749f nginx "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp demo 容器已经运行
[root@server1 ~]# cd /mnt/nfs/
[root@server1 nfs]# ls
config vol1 vol2
[root@server1 nfs]# cd vol1
[root@server1 vol1]# ls
50x.html index.html 将容器里内容拷贝到创建的vol1卷里
[root@server1 vol1]# vim test.html 重新创建一个文件
[root@server1 vol1]# curl 172.17.0.2/test.html 访问,可以访问
demo
手动将server1上的demo容器迁移到server2上
[root@server1 vol1]# docker rm -f demo 删除server1上demo
[root@server2 convoy]# docker run -d --name demo -v vol1:/usr/share/nginx/html nginx 在sever2上运行与server1相同的指令创建demo,相当于迁移了
[root@server2 convoy]# curl 172.17.0.2/test.html 可以发现容器迁移到server2上,数据没有变,还在
demo
如何清除convoy?
[root@server2 convoy]# docker rm -f demo 删除容器
[root@server2 convoy]# docker volume rm vol1 删除卷
[root@server2 convoy]# convoy list 已经删除了
{}
[root@server1 vol1]# convoy list 已经删除了
{}
[root@server2 vol1]# fg ,将此后台进程退出(ctrl+c)
convoy daemon --drivers vfs --driver-opts vfs.path=/mnt/nfs (wd: ~)
^CCaught signal interrupt: shutting down.
DEBU[42977] Cleaning up environment... pkg=daemon
ERRO[42977] http server erroraccept unix /var/run/convoy/convoy.sock: use of closed network connection pkg=daemon
[root@server2 vol1]# cd /etc/docker/
[root@server2 docker]# ls
certs.d daemon.json key.json plugins
[root@server2 docker]# cd plugins/
[root@server2 plugins]# ls
convoy.spec
[root@server2 plugins]# rm -fr convoy.spec 删除此文件,不然会加载
[root@server2 plugins]# systemctl stop docker
[root@server2 plugins]# systemctl daemon-reload
[root@server2 plugins]# systemctl start docker
注意:如果不正常删除,会导致缓存信
|