文章目录
默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着:
volumes和 bind mounts。Docker 还支持将文件存储在主机内存中的容器。此类文件不会持久保存。如果您在 Linux 上运行 Docker,则使用tmpfs mount将文件存储在主机的系统内存中。
挂载类型
volumes:由 Docker(/var/lib/docker/volumes/在 Linux 上)管理的主机文件系统的一部分中。非 Docker 进程不应修改文件系统的这一部分。卷是在 Docker 中持久化数据的最佳方式bind mounts:可以存储在主机系统的任何位置。它们甚至可能是重要的系统文件或目录。Docker 主机或 Docker 容器上的非 Docker 进程可以随时修改它们。tmpfs mounts:挂载仅存储在主机系统的内存中,永远不会写入主机系统的文件系统
在 linux 系统上,docker 将images, containers, volumes等相关的数据存储在/var/lib/docker下。

当我们运行docker build命令时,docker 会为 dockerfile 中的每条指令构建一层。这些图像层是只读层。当我们运行docker run命令时,docker 会构建容器层,它们是读写层。

您可以在容器上创建新文件,例如下图中的temp.txt。您还可以修改容器上属于图像层的文件,例如下图中的app.py。执行此操作时,会在容器层上创建该文件的本地副本,并且更改仅存在于容器上——这称为 Copy-on-Write 机制。这很重要,因为多个容器和子图像使用相同的图像层。容器上的文件的生命周期与容器的生命周期一样长。当容器被销毁时,其上的文件/修改也会被销毁。为了持久化数据,我们可以使用我们在上一节中看到的卷映射技术。

您可以使用docker volume create命令创建 docker 卷。此命令将在/var/lib/docker/volumes目录中创建一个卷。
docker volume create data_volume
docker volume ls
docker volume inspect data_volume
docker run命令时,您可以使用-v标志指定要使用的卷。这称为卷挂载。
docker run -v data_volume:/var/lib/postgres postgres
如果该卷不存在,docker 会为您创建一个。现在,即使容器被销毁,数据也会保留在卷中。
如果您想将数据放在 docker 主机上的特定位置或磁盘上已有数据,您也可以将此位置挂载到容器上。这称为绑定安装。
docker run -v /data/postgres:/var/lib/postgres postgres

删除
docker volume rm data_volume
echo "<h1>Hello from Host</h1>" > ./target/index.html
docker run -it --rm --name nginx -p 8080:80 -v "$(pwd)"/target:/usr/share/nginx/html nginx
访问:http://localhost:8080/,您应该会看到“Hello from Host”
#创建demo-earthly卷挂载
docker run -it --rm --name nginx -p 8080:80 -v demo-earthly:/usr/share/nginx/html nginx
docker volume ls
ls /var/lib/docker/volumes/target/_data/demo-earthly
#查看卷内容
docker run -it --rm -v demo-earthly:/opt/demo-earthly ubuntu ls /opt/demo-earthly

docker volume create --name demo-earthly
可以使用语句在 Dockerfile 中声明卷VOLUME
Dockerfile:
FROM nginx:latest
RUN echo "<h1>Hello from Volume</h1>" > /usr/share/nginx/html/index.html
VOLUME /usr/share/nginx/html
利用Dockerfile构建镜像
$ docker build -t demo-earthly .
$ docker run -p 8080:80 demo-earthly
$ docker volume ls
DRIVER VOLUME NAME
local 20879e3f0bfaf0eed63cb7f37c4b9545084a703f888a230b8aedc2082c836281
$ docker volume inspect 20879e3f0bfaf0eed63cb7f37c4b9545084a703f888a230b8aedc2082c836281
[
{
"CreatedAt": "2022-07-28T11:02:14+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/20879e3f0bfaf0eed63cb7f37c4b9545084a703f888a230b8aedc2082c836281/_data",
"Name": "20879e3f0bfaf0eed63cb7f37c4b9545084a703f888a230b8aedc2082c836281",
"Options": null,
"Scope": "local"
}
]
$ docker inspect -f '{{ .Mounts }}' amazing_carson
[{volume 20879e3f0bfaf0eed63cb7f37c4b9545084a703f888a230b8aedc2082c836281 /var/lib/docker/volumes/20879e3f0bfaf0eed63cb7f37c4b9545084a703f888a230b8aedc2082c836281/_data /usr/share/nginx/html local true }]
每次启动一个新容器时,都会创建另一个卷,内容为/usr/share/nginx/html.
-v并且–volume是使用以下语法将卷安装到容器的最常见方法:
-v <name>:<destination>:<options>
该卷将以只读方式安装:
docker run -it -v demo-volume:/data:ro ubuntu
另一种方法-v是--mount选项添加到docker run命令中。–mount是 的更详细的对应物-v。
语法:
docker run --mount source=[volume_name],destination=[path_in_container] [docker_image]
示例
docker run -it --name=example --mount source=demo-volume,destination=/data ubuntu
使用docker-compose命令在多个容器之间轻松共享数据更方便。
docker-compose.yml 目录挂载
version: "3.2"
services:
web:
image: nginx:latest
ports:
- 8080:80
volumes:
- ./target:/usr/share/nginx/html
docker-compose.yml 创建卷
version: "3.2"
services:
web:
image: nginx:latest
ports:
- 8080:80
volumes:
- html_files:/usr/share/nginx/html
web1:
image: nginx:latest
ports:
- 8081:80
volumes:
- html_files:/usr/share/nginx/html
volumes:
html_files:
声明了一个名为并html_files在服务中使用它的卷。多个容器(web、web1)可以挂载同一个卷。
运行docker-compose up将创建一个名为<project_name>_html_filesif 它不存在的卷。然后运行docker volume ls以列出创建的两个卷,从项目名称开始。
您还可以在 docker-compose 文件之外管理容器,但您仍然需要在下面声明它们volumes并设置属性external: true。
version: "3.2"
services:
web:
image: nginx:latest
ports:
- 8080:80
volumes:
- html_files:/usr/share/nginx/html
volumes:
html_files:
external: true
如果你没有html_files,你可以使用docker volume create html_files来创建它。当你添加 时external,Docker 会找出卷是否存在;但如果没有,就会报错。
创建容器并创建挂载卷
docker create volume demo-earthly
docker run -it --name=another-example --mount source=demo-volume,destination=/data ubuntu
root@ded392c589ea:/# touch /data/demo.txt
导航到数据卷目录并使用命令创建一个文件touch demo.txt。退出容器,然后启动一个another-example-two具有相同数据量的新容器:
docker run -it --name=another-example-two --mount source=demo-volume,destination=/data ubuntu
root@feef37293ea5:/# ls /data
参考:
【保姆级】Python最新版开发环境搭建,看这一篇就够了(适用于Python3.11.2安装)文章目录【保姆级】Python最新版开发环境搭建,看这一篇就够了(适用于Python3.11.2安装)一、Python解释器安装Windows安装步骤环境变量配置(非必要)MacOS安装步骤Linux安装步骤二、PyCharm安装三、创建Python工程工欲善其事必先利其器,在使用Python开发程序之前,在计算机上搭建Python开发环境是必不可少的环节,目前Python最新稳定版本是3.11.1,且支持到2027年,如下图所示本文手把手带你从0到1搭建Python最新版3.11.1开发环境,堪称保
1、接口的概念系统与系统之间,组件与组件之间,数据传递交互的通道2、接口的类型按协议划分:http、tcp、IP按语言划分:C++、java、PHP……按范围划分:系统之间多个内部系统之间内部系统与外部系统之间程序之间方法与方法之间、函数与函数之间、模块与模块之间3、接口测试的概念对系统或组件之间的接口进行测试,校验传递的数据正确性和逻辑依赖关系的正确行。4、接口测试的原理主要针对服务器,模拟客户端向服务器发送请求,通过工具或者代码来测试服务器针对客户端请求回发的响应数据是否与预期结果一致。5、接口测试的特点符合质量控制前移的理念可以发现一些页面操作发现不了的问题接口测试低成本高效益接口测试是
作为一个10年老运维,在开始这篇文章之前,先送给大家一句话:干啥不好,非要做运维,听人劝,吃饱饭,趁年轻,换行吧!好了,不开玩笑了,回到正文中来。当谈到运维职业发展情况时,很多人都会说运维做不长久,然后劝人做两年就赶快转研发吧!总之是全面唱衰运维!但作为一个老运维,我想说的是:运维转开发确实是一个不错的选择,但运维做不长久则完全是对运维的偏见了!很多人有运维做不长久的偏见的原因其实和运维职业的特性有关,运维有三个老生常谈的特点:打杂,背锅,睡的少!说运维打杂,是说运维工作比较宽泛,运维职业门槛不高,什么都得会一点。公司里但凡跟计算机有关的事,可能都会找到运维,这就导致了运维工作比较杂!至于背黑
趁着寒假期间稍微尝试跑了一下yolov5和yolov7的代码,由于自己用的笔记本没有独显,台式机虽有独显但用起来并不顺利,所以选择了租云服务器的方式,选择的平台是矩池云(价格合理,操作便捷)需要特别指出的是,如果需要用pycharm链接云服务器训练,必须要使用pycharm的专业版而不是社区版,专业版可以使用SSH服务连接云服务器。关于专业版的获取,据我所知一是可以买,二是如果你是在校大学生,可以用学生证向JetBrain申请专业版使用权,我就是通过这种方式激活专业版账户的,我记得当时两三天官方就发激活邮件了,还是很人性化的,使用期一年。下面开始正题本教程只涉及将yolov5及yolov7跑通
注意:我只是一个编码新手,所以这个问题的核心可能存在明显的错误或误解。本质上,我需要在JavaScript中“按值”深度复制多维数组到未知深度。我原以为这需要一些复杂的递归,但似乎在JavaScript中您只需要深复制一个级别就可以按值复制整个数组。举个例子,这是我的测试代码,使用了一个故意复杂的数组。functiontest(){vararr=[['ok1'],[],[[],[],[[],[[['ok2'],[]]]]]];varcloned=cloneArray(arr);arr='';//Deletetheoriginalalert(cloned);}functioncloneA
curl是一个很有名的处理网络请求的类Unix工具。出于某种原因,我们进行网络请求,需要设置代理。本文讲全面介绍如何为curl设置代理设置代理参数基本用法-x,--proxy[protocol://]host[:port]设置HTTP代理下面两种设置代理的方式是可以的curl-x"http://user:pwd@127.0.0.1:1234""http://httpbin.org/ip"curl--proxy"http://user:pwd@127.0.0.1:1234""http://httpbin.org/ip"由于代理地址的默认协议为 HTTP,所以可以省略,按照下面的形式也是可以的cu
笔记首发于:lengyueling.cnPDF版本附在 lengyueling.cn 对应文章结尾,欢迎下载访问交流绪论数据结构在学什么如何用程序代码把现实世界的问题信息化如何用计算机高效地处理这些信息从而创造价值数据结构的基本概念什么是数据:数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序识别和处理的符号的集合。数据是计算机程序加工的原料。现代计算机处理的数据:现代计算机——经常处理非数值型问题对于非数值型的问题:我们关心每个个体的具体信息我们还关心个体之间的关系数据元素:数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。数据项:一个数据元素可由若干
假设我有一个名为incomingValue的变量,并且我从API获取一个数字作为它的值。这些值介于0到1之间,我正在根据此值使用一堆if语句设置另外两个变量,如下所示。varincomingValue;//SetbyanAPIvarsetValueName;varsetValueIcon;if(incomingValue0.09&&incomingValue在实际实现中,我有大约10个if语句检查特定时间间隔,直到1。例如如果它大于0.10但小于0.16等,则执行此操作。作为一个JavaScript初学者,我觉得这不是正确的做事方式,尽管它可以完成工作。我将如何重构这段代码?更新:根据
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:JavaScript===vs==:Doesitmatterwhich“equal”operatorIuse?我能理解为什么===在比较数字、bool值、空字符串等时由于意外的类型转换是必需的,例如varfoo=1;varbar=true;//bar==foo=>true//bar===foo=>false但是,在将变量与非空字符串文字进行比较时,==是否会引入错误?在这种情况下,使用==是否比===更有效?
【序】双11民间戏称光棍节购物狂欢节,迄今猫狗13岁也是中国空军72岁生日也是腾讯23岁生日她还是“元宇宙日”11月11日,中国移动通信联合会元宇宙产业委员会(下称“元宇宙产业委”)揭牌仪式举办。中国移动通信联合会元宇宙产业委员会创始发起人、《元宇宙》作者于佳宁被任命为元宇宙产业委执行主任委员。为促进元宇宙产业和产业元宇宙健康快速发展,物链芯工程技术研究院、元宇宙实验室联合多家企业、科研院校、行业专家,共同组建“元宇宙共识圈”并发起成立中国移动通信联合会元宇宙产业委员会。元宇宙产业委宣布将11月11日设立为“元宇宙日”并发布《元宇宙产业宣言》(下称《宣言》)。《宣言》提出,元宇宙是第三代互联网