如果数据都在容器中,那么容器一旦删除,数据就会丢失!docker容器需要将产生的数据同步到本地。容器与容器之间也需要有一个数据共享的技术 将某些文件共享。这就是卷技术,目录挂载
docker run -it -v 主机目录:容器内目录 镜像id
docker run -it -v /home/test:/home ubuntu:latest
===================================================================================
beginner@beginner-virtual-machine:~$ docker run -it -v /home/test:/home ubuntu:latest
root@66c649c58ad7:/# cd /home
root@66c649c58ad7:/home# ls
root@66c649c58ad7:/home# touch test
root@66c649c58ad7:/home# ls
test
root@66c649c58ad7:/home# exit
exit
beginner@beginner-virtual-machine:~$ cd /home/test
beginner@beginner-virtual-machine:/home/test$ ls
test
===================================================================================
容器内创建的test文件已经成功同步到了/home/test 即使容器停止了在主机上仍然可以看到test文件
使用docker container inspect 容器id可以发现有mount这一字段
"Mounts": [
{
"Type": "bind",
"Source": "/home/test",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
主机目录与容器目录都不为空时 初始化全都等于主机目录 docker run -it -v /home/test2:/etc ubuntu:latest
root@c70fa193cb9d:~# cd /etc
root@c70fa193cb9d:/etc# ls
adduser.conf debconf.conf fstab init.d legal mtab passwd rc4.d selinux sysctl.d
alternatives debian_version gai.conf issue libaudit.conf networks profile rc5.d shadow systemd
apt default group issue.net login.defs nsswitch.conf profile.d rc6.d shells terminfo
bash.bashrc deluser.conf gshadow kernel logrotate.d opt rc0.d rcS.d skel update-motd.d
bindresvport.blacklist dpkg host.conf ld.so.cache lsb-release os-release rc1.d resolv.conf subgid xattr.conf
cron.d e2scrub.conf hostname ld.so.conf machine-id pam.conf rc2.d rmt subuid
cron.daily environment hosts ld.so.conf.d mke2fs.conf pam.d rc3.d security sysctl.conf
root@c70fa193cb9d:/etc# exit
exit
beginner@beginner-virtual-machine:/home/test$ docker run -it -v /home/test2:/etc ubuntu:latest
bash-5.0# ls
bin boot dev etc home lib lib32 lib64 libx32 media mnt opt proc root run sbin srv sys tmp usr var
bash-5.0# cd /etc
bash-5.0# ls
hostname hosts resolv.conf
docker run -d -P -v v_test_name:/etc/nginx nginx:latest
# -d 后台启动
# -P 随机端口映射
# -v 卷的名字:/etc/nginx 后面是容器内的路径 注意卷的名字不能有/不然会认为是主机目录
# 没加v_test_name 那就是匿名挂载,加了 那就是具名挂载
docker volume ls # 查看本地的所有卷
beginner@beginner-virtual-machine:~$ docker volume ls
DRIVER VOLUME NAME
local 3b3896413c3ab757a68192855c5f8d3ccd4864f80b148e708d4af6d04d16118a
......
local v_test_name
beginner@beginner-virtual-machine:~$ docker volume inspect v_test_name # 查看卷的详细信息
[
{
"CreatedAt": "2022-01-11T09:06:53+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/v_test_name/_data",
"Name": "v_test_name",
"Options": null,
"Scope": "local"
}
]
docker run -d -P -v v_test_name:/etc/nginx:ro nginx:latest
# 加上ro就是readonly 如果是rw就是可读可写 这是容器的权限如果只是ro 那只能从外部改变容器只能读
#v_test_name:ro:/etc/nginx 如果是这种那只能从容器内改变 不能从主机改变
dockerfile文件内容
FROM ubuntu:latest
VOLUME ["volume1","volume2"] # 匿名挂载
......
这样会在启动容器时根目录下生成volume1与volume2两个目录
具名挂载与匿名挂载几乎一样,所以这里只谈具名挂载,具名挂载不会影响容器的目录,因为具名挂载是将容器内的目录的内容同步到 /var/lib/docker/volumes/卷名/_data 下 。
但是指定路径挂载可能会影响容器的目录
指定路径挂载需要谨慎 推荐使用具名挂载
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v mysql_conf:/etc/mysql/conf.d --name mysqltest mysql:5.7
# -e 是因为mysql连接需要密码 -e后面的参数是如何得知的? https://hub.docker.com/ 在这里面搜索mysql 找到对应的镜像官方会有对应的启动方法
# 可以同时挂载多个 这里分别挂载了mysql配置文件夹与mysql数据文件夹
# -p 本机端口:容器端口 端口进行映射
# -d 后台启动
#当将容器删除时 本地的文件仍然没有消失 这就实现了数据持久化
#使用 --volumes-from 同步容器间的目录
docker run -d -p 3307:3306 -e MYSQL_ROOT_PASSWORD=123456 --volumes-from mysqltest --name mysqltest2 mysql:5.7
# 通过inspect 可以发现两个容器共用的一个卷!!!
beginner@beginner-virtual-machine:~$ docker volume inspect mysqltest2
[
{
"CreatedAt": "2022-01-11T09:10:06+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/mysql_conf/_data",
"Name": "python_test",
"Options": null,
"Scope": "local"
}
]
手机扫一扫
移动阅读更方便
你可能感兴趣的文章