docker基础_数据卷
阅读原文时间:2023年07月11日阅读:3

docker数据卷

如果数据都在容器中,那么容器一旦删除,数据就会丢失!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中使用数据卷

dockerfile文件内容

FROM ubuntu:latest
VOLUME ["volume1","volume2"] # 匿名挂载
......

这样会在启动容器时根目录下生成volume1与volume2两个目录

具名挂载(匿名挂载)与指定路径挂载的注意点

具名挂载与匿名挂载几乎一样,所以这里只谈具名挂载,具名挂载不会影响容器的目录,因为具名挂载是将容器内的目录的内容同步到 /var/lib/docker/volumes/卷名/_data 下 。

但是指定路径挂载可能会影响容器的目录

  • 情况一 主机目录为空 容器目录为空 两者统一初始化都为空
  • 情况二 主机目录(可空可不空) 容器目录有内容 两者统一内容初始化为主机目录 但是容器可能是特殊目录比如/etc 容器后续会自动产生一些内容
  • 情况三 主机目录有内容 容器目录为空 统一初始化为主机目录内容

指定路径挂载需要谨慎 推荐使用具名挂载

容器与容器之间数据同步

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"
    }
]