深圳营销型网站建设价格,深圳优定软件网站建设,搞一个网站多少钱,做照片的网站有哪些默认情况下#xff0c;在运行中的容器里创建的文件#xff0c;被保存在一个可写的容器层里#xff0c;如果容器被删除了#xff0c;则对应的数据也随之删除了。
这个可写的容器层是和特定的容器绑定的#xff0c;也就是这些数据无法方便的和其它容器共享。
Docker主要提…默认情况下在运行中的容器里创建的文件被保存在一个可写的容器层里如果容器被删除了则对应的数据也随之删除了。
这个可写的容器层是和特定的容器绑定的也就是这些数据无法方便的和其它容器共享。
Docker主要提供了两种方式做数据的持久化
Data Volume由Docker管理(数据目录/var/lib/docker/volumes/), 持久化数据的最好方式Bind Mount由用户指定存储的数据具体mount在系统什么位置 Data Volume
准备一个脚本
date.sh
#!/bin/bashwhile true
doecho dateecho date /home/morris/dockerfile/volumn/logs/date.logsleep 1
done准备一个镜像
Dockerfile
from alpine:latestlabel authormorrisenv work_dir /usr/appworkdir $work_dircopy date.sh .volume [/home/morris/dockerfile/volume/logs/]entrypoint [sh, date.sh]构建镜像
$ docker build -t date:1.0 .
Sending build context to Docker daemon 4.608kB
Step 1/7 : from alpine:latest--- c059bfaa849c
Step 2/7 : label authormorris--- Using cache--- 4a7f368ccac1
Step 3/7 : env work_dir /usr/app--- Using cache--- 2413cf06006b
Step 4/7 : workdir $work_dir--- Using cache--- 1230bcd7bf40
Step 5/7 : copy date.sh .--- Using cache--- 6ad3761a0592
Step 6/7 : volume [/home/morris/dockerfile/volume/logs/]--- Using cache--- 82ad0fd1b949
Step 7/7 : entrypoint [sh, date.sh]--- Using cache--- ca25386d02f3
Successfully built ca25386d02f3
Successfully tagged date:1.0创建容器(不指定-v参数)
启动容器
$ docker container run --rm date:1.0
Fri Sep 22 02:01:56 UTC 2023
Fri Sep 22 02:01:57 UTC 2023另外启动一个shell进入容器中查看日志
$ docker container exec -it e4 sh
/usr/app # tail -f /home/morris/dockerfile/volume/logs/date.log
Fri Sep 22 02:03:32 UTC 2023
Fri Sep 22 02:03:33 UTC 2023
Fri Sep 22 02:03:34 UTC 2023此时Docker会自动创建一个随机名字的volume去存储我们在Dockerfile定义的volume。
可以使用docker container inspect命令查看随机生成的volume名称
... ...Mounts: [{Type: volume,Name: b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87,Source: /var/lib/docker/volumes/b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87/_data,Destination: /home/morris/dockerfile/volume/logs,Driver: local,Mode: ,RW: true,Propagation: }],
... ...可以使用docker volume ls查看所有的volume列表
$ docker volume ls
DRIVER VOLUME NAME
local 3dc166ddf9968412b6d9f8050a0b9d84f74a0fae4d8f5d1c55222222ec142c82
local b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87
local bc5e8a682761ee129bf98206758d4e6a76df9755f825c61c030330ce78190376
local d62c8edbe60a80ba8c5d57c678e0badb542ec7ceb6120ce3d0e442c3e6d2f7b7
local f3bbbca769c38f706f286b08824f6bcee0dfb362931c7bf5d97102f12e11fe4f
local fc6e4e62f182938fa48954252ecbee4485194dcd1c11d995f25678744ce0300d可以使用docker volume inspect查看volume的详细信息
$ docker volume inspect b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87
[{CreatedAt: 2023-09-22T10:01:5608:00,Driver: local,Labels: null,Mountpoint: /var/lib/docker/volumes/b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87/_data,Name: b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87,Options: null,Scope: local}
]可以看到volume对应宿主机器上存储的物理地址为/var/lib/docker/volumes/b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87/_data我们到这个目录查看下
# cd /var/lib/docker/volumes/b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87/_data# ll
total 36
drwxr-xr-x 2 root root 4096 Sep 22 10:01 ./
drwx-----x 3 root root 4096 Sep 22 10:01 ../
-rw-r--r-- 1 root root 23867 Sep 22 10:15 date.log# tail -f date.log
Fri Sep 22 02:15:36 UTC 2023
Fri Sep 22 02:15:37 UTC 2023
Fri Sep 22 02:15:38 UTC 2023
... ...当容器删除后这个volume也随之删除了
$ docker volume inspect b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87
[]
Error: No such volume: b4248ae16a86cb38ebab00105adf3084513578168fca142597c154cc6e5b8e87创建容器(指定-v参数)
在创建容器的时候通过-v参数我们可以手动的指定需要创建Volume的名字以及对应于容器内的路径这个路径是可以任意的不必需要在Dockerfile里通过VOLUME定义。
比如在创建容器时指定volume的名字为mydate对应容器的路径为/home/morris/dockerfile/volume/logs
$ docker container run -v mydate:/home/morris/dockerfile/volume/logs --rm date:1.0
Fri Sep 22 02:32:31 UTC 2023
Fri Sep 22 02:32:32 UTC 2023查看volume列表
$ docker volume ls
DRIVER VOLUME NAME
local mydate删除容器后volume还存在不会跟着容器一起删除这样我们在下次运行新的容器时可以volume的名称继续使用volume中的数据。
Bind Mount
Docker Bind Mounts是一种用于将主机文件或目录挂载到Docker容器中的方法可以实现容器与主机之间的文件共享。
Data Volume模式只能将/var/lib/docker/volumes/中的目录与Docker容器共享而Docker Bind Mounts能实现主机中任意文件与容器之间的共享。
由于我这里使用的是WSL中运行的Docker所以我们可以将Windows中的D盘的docker_data目录映射到一个具体GCC环境的Docker容器中这样可以在Windows下使用编辑器编辑c语言的源文件然后使用Docker容器中的GCC环境进行编译
$ docker run --rm -it -v /mnt/d/docker_data:/usr/app gcc:9.4 bash
rootaedaf7a3e462:/# cd /usr/app/
rootaedaf7a3e462:/usr/app# ls
hello.c多个机器之间的容器共享数据
官方参考链接 https://docs.docker.com/storage/volumes/#share-data-among-machines
Docker的volume支持多种driver。默认创建的volume driver都是local
$ docker volume inspect mydate
[{CreatedAt: 2023-09-22T10:32:3108:00,Driver: local,Labels: null,Mountpoint: /var/lib/docker/volumes/mydate/_data,Name: mydate,Options: null,Scope: local}
]下面我们来看看一个叫sshfs的driver如何让docker使用不在同一台机器上的文件系统做为volume
主机规划
准备两天Linux机器之间可以通过SSH相互通信。
192.168.200.10名称为host1安装Docker192.168.200.11名称为host2作为数据存储
账号密码都是 root/root
安装插件
在host1192.168.200.10上安装Docker插件vieux/sshfs。
$ docker plugin install --grant-all-permissions vieux/sshfs
latest: Pulling from vieux/sshfs
Digest: sha256:1d3c3e42c12138da5ef7873b97f7f32cf99fb6edde75fa4f0bcf9ed277855811
52d435ada6a4: Complete
Installed plugin vieux/sshfs创建volume
使用类型为vieux/sshfs的driver创建一个名为sshvolume的volume。
$ docker volume create --driver vieux/sshfs -o sshcmdroot192.168.200.11:/home/logs -o passwordroot sshvolume查看volume
$ docker volume ls
DRIVER VOLUME NAME
local mydate
vieux/sshfs:latest sshvolume$ docker volume inspect sshvolume
[{CreatedAt: 0001-01-01T00:00:00Z,Driver: vieux/sshfs:latest,Labels: {},Mountpoint: /mnt/volumes/24ef5f7f94863e87f7802e20f5662e68,Name: sshvolume,Options: {password: root,sshcmd: root192.168.200.11:/home/logs},Scope: local}
]创建容器挂载Volume
创建容器挂载sshvolume
$ docker container run -v sshvolume:/home/morris/dockerfile/volume/logs --rm date:1.0
Thu Sep 28 07:39:49 UTC 2023
Thu Sep 28 07:39:50 UTC 2023
Thu Sep 28 07:39:51 UTC 2023
Thu Sep 28 07:39:52 UTC 2023这个文件我们可以在host2上看到
$ tail -f /home/logs/date.log
Thu Sep 28 07:39:49 UTC 2023
Thu Sep 28 07:39:50 UTC 2023
Thu Sep 28 07:39:51 UTC 2023
Thu Sep 28 07:39:52 UTC 2023