极客时间运维进阶训练营第一周作业----docker数据卷的使用
在使用docker时,如果不挂载数据卷直接运行一个容器,在删除容器时会丢失所有新增或修改的数据,并且经常会遇到多个容器需要访问同一份数据的情况,所以我们在运行一个容器时需要挂载数据卷来达到数据共享和数据持久化的目的。
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume \\创建一个新的数据卷
inspect Display detailed information on one or more volumes \\显示数据卷的详细信息
ls List volumes \\列出所有的数据卷
prune Remove all unused local volumes \\删除所有未使用的数据卷
rm Remove one or more volumes \\删除指定数据卷
Run 'docker volume COMMAND --help' for more information on a command.
root@docker1:/home/z9999# docker volume create test \\创建一个名为test的数据卷
test
root@docker1:/home/z9999# docker volume ls \\打印已有数据卷
DRIVER VOLUME NAME
local test
root@docker1:/home/z9999# docker volume inspect test \\查看test数据卷的信息
[
{
"CreatedAt": "2022-10-20T12:36:26Z", \\创建时间
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/test/_data", \\该数据卷再系统中的位置
"Name": "test",
"Options": {},
"Scope": "local"
}
]
root@docker1:/home/z9999# docker run -it -d -v test:/tmp nginx \\创建一个容器并挂载数据卷
ee4dd210ec4a49f0e4a15ceea93bac354620572a6e435810d4b066d501a7e6ff
root@docker1:/home/z9999# docker exec -it ee bash \\进入容器并写一个文件到挂载数据卷的目录中
root@ee4dd210ec4a:/# echo $HOSTNAME > /tmp/test
root@ee4dd210ec4a:/# cat /tmp/test
ee4dd210ec4a
root@ee4dd210ec4a:/#
exit \\退出容器
root@docker1:/home/z9999# cat /var/lib/docker/volumes/test/_data/test \\在系统中查看数据卷中的内容,发现刚才写的内容已经在里面了
ee4dd210ec4a
root@docker1:/home/z9999# docker rm -f ee \\删除刚才挂载这个卷的容器
ee
root@docker1:/home/z9999# cat /var/lib/docker/volumes/test/_data/test \\删除容器后刚才写入的数据并未丢失
ee4dd210ec4a
root@docker1:/home/z9999# docker run -it -d -v test:/tmp httpd \\重新运行一个容器并挂载test数据卷
f31500655226b1b77b175bad1dfd3f9cf87b517173f1177c1325121090ed768d
root@docker1:/home/z9999# docker exec -it f3 bash
root@f31500655226:/usr/local/apache2# cat /tmp/test \\到挂载点查看刚才写入的文件
ee4dd210ec4a
由此可见删除容器不会对写入到数据卷中的数据有任何影响,并且仍然可以挂载到其他容器
root@docker1:/home/z9999# echo "testapp web page" > /data/testapp/index.html
root@docker1:/home/z9999# cat /data/testapp/index.html
testapp web page
root@docker1:/home/z9999# docker run -d --name web1 -v /data/testapp:/usr/share/nginx/html/testapp -v test:/tmp -p 80:80 nginx \\一个容器可以写多个-v参数挂载
45168a44de5bdd52cd76cf42a5924230feb9189a28599bef6c6e9012816356a0
root@docker1:/home/z9999# docker run -d --name web2 -v /data/testapp:/usr/share/nginx/html/testapp:ro -p 81:80 nginx \\后面的ro表示以只读权限挂载
6e17be9c8e59b428f0f2e06f46c3f3013ebd5c447613664dcba12bf298b6d538
\\把写好的html文件挂载到两个nginx容器存放页面的目录,并将容器的端口分别映射到本地不同的端口
root@docker1:/home/z9999# docker ps -aq | xargs docker rm -f \\强制删除刚才测试用的容器 6e17be9c8e59 45168a44de5b d36a2a7b4f7f f31500655226
root@docker1:/home/z9999# docker volume prune \\删除容器后可以使用“docker volume prune”删除未在使用的额容器(生产环境请谨慎操作!个人认为docker rm DOCKERNAME风险更低)
WARNING! This will remove all local volumes not used by at least one container. Are you sure you want to continue? [y/N] y Deleted Volumes: test Total reclaimed space: 13B