当前位置: 首页 > news >正文

docker数据管理与网络通信

一、管理docker容器中数据

管理Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器( DataVolumes Containers) 。

1、 数据卷

数据卷是一个供容器使用的特殊目录,位于容器中。可将宿主机的目录挂载到数据卷上,对数据卷的修改操作立刻可见,并且更新数据不会影响镜像,从而实现数据在宿主机与容器之间的迁移。数据卷的使用类似于Linux下对目录进行的mount操作。

需求:宿主机目录/var/www挂载到容器中的/data1。

docker pull centos: 7注意:宿主机本地目录的路径必须是使用绝对路径。如果路径不存在,Docker会自动创建相应的路径。
docker run -it --name test2 -v /var/www:/data1 centos:7 bash
#-v选项可以在容器内创建数据卷ls
echo "this is test2" > /data1/test.txt
exit#返回宿主机进行查看
cd /var/www/
cat test.txt

2、数据卷容器

如果需要在容器之间共享一些数据,最简单的方法就是使用数据卷容器。数据卷容器是一个普通的容器,专门提供数据卷给其他容器挂载使用。

#创建一个容器作为数据卷容器
docker run -it --name test1 -v /data1 -v /data2 centos:7 bash                               #创建并进入容器
echo "this is data1" > /data1/test.txt                          #容器内创建测试文件1
echo "THIS IS data2" > /data2/test.txt                          #容器内创建测试文件1#使用--volumes-from来挂载test2容器中的数据卷到新的容器
docker run -it --name test4 --volumes-from test3 centos:7 bash                               #创建并进入容器
cat data1/test.txt                                       #查看测试数据是否同步
cat data2/test.txt

二、容器互联(使用centos镜像)

容器互联是通过容器的名称在容器间建立一条专门的网络通信隧道。简单点说,就是会在源容器和接收容器之间建立一条隧道,接收容器可以看到源容器指定的信息。

#创建并运行源容器取名web1
docker run -itd -P --name web1 centos:7 /bin/bash
#创建并运行接收容器取名web2,使用--link选项指定连接容器以实现容器互联
docker run -itd -P --name web2 --link web1:myweb1 centos:7 /bin/bash          #--link容器名:连接的别名#进web2容器,ping web1
docker exec -it web2 bash
ping web1

三、Docker 镜像创建

创建镜像有三种方法,分别为基于已有镜像创建、基于本地模板创建以及基于Dockerfile创建

1、基于现有镜像创建

(1)首先启动一个镜像,在容器里做修改

docker create -it centos:7 bashdocker ps -adocker start eb5fed04f37f
yum install net-tools -y            # 可以在容器里面安装net-tools工具
exit

  

(2)然后将修改后的容器提交为新的镜像,需要使用该容器的ID号创建新镜像

docker commit -m "new" -a "centos" 000550eb36da centos:test
#常用选项:
-m说明信息:
-a作者信息;
-p生成过程中停止容器的运行docker images

2、基于本地模板创建

通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ开源项目下载,下载地址为:
https://wiki.openvz.org/Download/template/precrated

wget http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
#导入为镜像
cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test

注释:docker export import

导出容器export

注意:export导出的是容器,不是镜像。

docker export <CONTAINER ID >  > my_container.tar

导入容器为镜像import

cat my_container.tar |docker import - image_name:tag

3、基于Dockerfile创建

1)联合文件系统(UnionFS)

UnionFS(联合文件系统) : Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。AUFS、OberlayFS及Devicemapper都是一种UnionFS。

Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。

特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。

我们下载的时候看到的一层层的就是联合文件系统。

2)镜像加载原理

Docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统就是UnionFS.

bootfs主要包含bootloader和kernel,bootloader 主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统。

在Docker镜像的最底层是bootfs,这一-层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。

当boot加载完成之 后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs。

rootfs,在bootfs之上,包含的就是典型Linux系统中的/dev, /proc, /bin, /etc等标准目录和文件。rootfs 就是各种不同的操作系统发行版,比如Ubuntu, Centos等等。

我们可以理解成一开始内核里什么 都没有,操作一个命令下载debian,这时就会在内核上面加了一层基础镜像;再安装一个emacs,会在基础镜像上叠加一层image;接着再安装一个apache,又会在images.上面再叠加一层image。

最后它们看起来就像一个文件系统即容器的rootfs。在Docker的体系里把这些rootfs叫做Docker的镜像。但是,此时的每一层rootfs都是read-only的,我们此时还不能对其进行操作。

当我们创建一个容器,也就是将Docker镜像进行实例化,系统会在一层或是多层read-only的rootfs之上分配一层空的read-write的rootfs。

3)为什么Docker里的centos的大小才200M?

因为对于精简的OS,rootfs可以很小,只需要包含最基本的命令、工具和程序库就可以了,因为底层直接用宿主机的kernel,自己只需要提供rootfs就可以了。

由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs。

4)Dockerfile

Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数 (如匿名卷、环境变量、用户等)。

镜像不包含任何动态数据,其内容在构建之后也不会被改变。

镜像的定制实际上就是定制每一层所添加的配置、文件。

如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile.

Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

有了Dockerfile,当我们需要定制自己额外的需求时,只需在Dockerfile.上添加或者修改指令,重新生成image即可,省去了敲命令的麻烦。

除了手动生成Docker镜像之外,可以使用Dockerfile自动生成镜像。Dockerfile是由 多条的指令组成的文件,其中每条指令对应Linux中的一条命令,Docker 程序将读取Dockerfile中的指令生成指定镜像。

Dockerfile结构大致分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。Dockerfile每行 支持一条指令,每条指令可携带多个参数,支持使用以“#“号开头的注释。

5)Docker镜像结构的分层

镜像不是一个单一的文件,而是有多层构成。容器其实是在镜像的最上面加了一层读写层,在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,文件改动也就丢失了。

Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

(1) Dockerfile 中的每个指令都会创建一个新的镜像层;

(2)镜像层将被缓存和复用;

(3)当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,对应的镜像层缓存就会失效;

(4) 某一层的镜像缓存失效,它之后的镜像层缓存都会失效;

(5) 镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,则镜像中依然会包含该文件,只是这个文件在Docker容器中不可见了。

四、Dockerfile操作常用的指令:

(1) FROM 镜像

指定新镜像所基于的镜像,第一条 指令必须为FROM指令,每创建一个镜像就需要一条FROM 指令

(2) MAINTAINER 名字

说明新镜像的维护人信息

(3) RUN 命令

在所基于的镜像上执行命令,并提交到新的镜像中

(4) ENTRYPOINT [“要运行的程序”,“参数1”,“参数2”]

设定容器启动时第一个运行的命令及其参数。

可以通过 使用命令docker run --entrypoint 来覆盖镜像中的ENTRYPOINT指令的内容

(5) CMD [“要运行的程序”,“参数1”,“参数2”]

上面 的是exec形式, shell形式: CMD命令 参数1 参数2

启动容器时默认执行的命令或者脚本,Dockerfile只 能有一条CMD命令。如果指定多条命令,只执行最后一条命令。

如果在docker run时指定了命令或者镜像中有ENTRYPOINT,那么cmd就会被覆盖。

CMD可以为ENTRYPOINT指令提供默认参数

(6) EXPOSE 端口号

指定新镜像加载到Docker 时要开启的端口

(7) ENV 环境变量 变量值

设置一个环境变量的值,会被后面的RUN使用

(8) ADD 源文件/目录 目标文件/目录

将源文件复制到镜像中,源文件要与Dockerfile 位于相同目录中,或者是一个URL

有如下注意事项:

1.如果源路径是个文件,且目标路径是以/结尾, 则docker会把目标路径当作一个目录,会把源文件拷贝到该目录下

如果目标路径不存在,则会自动创建目标路径

2.如果源路径是个文件,且目标路径是不是以/结尾,则docker会把目标路径当作一个文件

如果目标路径不存在,会以目标路径为名创建一“个文件,内容同源文件

如果目标文件是个存在的文件,会用源文件覆盖它,当然只是内容覆盖,文件名还是目标文件名

如果目标文件实际是个存在的目录,则会源文件拷贝到该目录下。注意, 这种情况下,最好显示的以/结尾,以避免混淆

3.如果源路径是个目录,且目标路径不存在,则docker会自动以目标路径创建一个月录,把源路径月录下的文件拷贝进来

如果目标路径是个已经存在的目录,则docker 会把源路径目录下的文件拷贝到该目录下

4.如果源文件是个归档文件(压缩文件),则docker会自动帮解压

URL"下载和解压特性不能一起使用。任何压缩文件通过URL拷贝,都不会自动解压

(9) COPY 源文件/目录 目标文件/目录

只复制本地主机.上的文件/目录复制到目标地点,源文件/目录要与Dockerfile 在相同的目录中

(10) VOLUME [“目 录"]

在容器中创建一个挂载点

(11) USER 用户名/UID

指定运行容器时的用户

(12) WORKDIR 路径

为后续的RUN、 CMD、 ENTRYPOINT指定工作目录

(13) ONBUILD 命令

• 指定所生成的镜像作为一个基础镜像时所要运行的命令

• 当在一个Dockerfile文件中加上ONBUILD指令, 该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响

• 但是当编写一个新的Dockerfile文件来基于A镜像构建一-个镜像( 比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令

(14 ) HEALTHCHECK

健康检查

在编写Dockerfile时,有严格的格式需要遵循:

●第一行必须使用FROM指令指明所基于的镜像名称

●之后使用MAINTAINER 指令说明维护该镜像的用户信息

●然后是镜像操作相关指令,如RUN指令。每运行一条指令,都会给基础镜像添加新的一层

●最后使用CMD指令指定启动容器时要运行的命令操作

相关文章:

docker数据管理与网络通信

一、管理docker容器中数据 管理Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器( DataVolumes Containers) 。 1、 数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机的目录挂载到数据卷上&#xff0c;对数据卷的修改操作立刻…...

怎么查询电脑的登录记录及密码更改情况?

源头是办公室公用的电脑莫名其妙打不开了&#xff0c;问别人也都不知道密码是多少 因为本来就没设密码啊&#xff01;&#xff08;躺倒&#xff09; 甚至已经想好了如果是50万想攻破电脑&#xff0c;被po抓住要怎么花这笔钱了 是我想太多 当然最后也没解决&#xff0c;莫名…...

《三》TypeScript 中函数的类型

TypeScript 允许指定函数的参数和返回值的类型。 函数声明的类型定义&#xff1a;function 函数名(形参: 形参类型, 形参: 形参类型, ...): 返回值类型 {} function sum(x: number, y: number): number {return x y } sum(1, 2) // 正确 sum(1, 2, 3) // 错误。输入多余的或者…...

深入学习 Mysql 引擎 InnoDB、MyISAM

tip&#xff1a;作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 &#x1f495;&#x1f495; 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#…...

【华为OD统一考试B卷 | 100分】阿里巴巴找黄金宝箱(V)(C++ Java JavaScript Python)

题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上面贴有一个数字。 阿里巴巴念出一个咒语数字k(k<N),找出连续k个宝箱数字和的最大值,并输出该最大值。 输入描述 第一行输入一个数字字串,数字之间…...

六步快速搭建个人网站

目录 第一步、选择搭建平台WordPress 第二步、选域名 1&#xff09;域名在哪买&#xff1f; 2&#xff09;域名怎么选&#xff1f; 3&#xff09;以阿里云为例&#xff0c;讲解怎么买域名 第三步、选择服务器 第四步、申请主机、安装WordPress 第五步、选择WordPress模…...

TypeScript 中的 type 关键字有什么用?

创建类型别名 在 TypeScript 中&#xff0c;type 关键字用于创建类型别名&#xff08;Type Alias&#xff09;。类型别名可以给一个类型起一个新的名字&#xff0c;使代码更具可读性和可维护性。 类型别名可以用于定义各种类型&#xff0c;包括基本类型、复合类型和自定义类型…...

27 getcwd 的调试

前言 同样是一个 很常用的 glibc 库函数 不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 获取当前路径 不过 我们这里是从 具体的实现 来看一下 测试用例 就是简单的使用了一下 getcwd rootubuntu:~/Desktop/linux/HelloWorld# cat Test04Getcwd.c #inc…...

使用IDEA使用Git:Git使用指北——实际操作篇

Git使用指北——实际操作 &#x1f916;:使用IDEA Git插件实际工作流程 &#x1f4a1; 本文从实际使用的角度出发&#xff0c;以IDEA Git插件为基座讲述了如果使用IDEA的Git插件来解决实际开发中的协作开发问题。本文从 远程仓库中拉取项目&#xff0c;在本地分支进行开发&…...

java boot将一组yml配置信息装配在一个对象中

其实将一组yml数据封进一个对象中才是以后的主流开发方式 我们创建一个springboot项目 找到项目中的启动类所在目录 在同目录下创建一个类 名字你们可以随便取 我这里直接叫 dataManager 然后 在yml中定义这样一组数据信息 然后 我们在类中定义三个和这个配置信息相同的字段…...

【裸机开发】链接脚本(.lds文件)的基本语法

目录 一、什么是链接脚本&#xff1f; 二、链接脚本的基本语法格式 1、常用命令 2、内置变量 三、链接脚本的简单案例 一、什么是链接脚本&#xff1f; 一段程序的编译需要经历四个阶段&#xff08;预处理—编译—汇编—链接&#xff09;&#xff0c;而链接脚本管理的就是…...

Java 进阶 -- 集合(三)

4、实现 实现是用于存储集合的数据对象&#xff0c;它实现了接口部分中描述的接口。本课描述了以下类型的实现: 通用实现是最常用的实现&#xff0c;是为日常使用而设计的。它们在标题为“通用实现”的表格中进行了总结。特殊目的实现是为在特殊情况下使用而设计的&#xff0…...

【华为OD机试真题 C语言】5、TLV解析 | 机试真题+思路参考+代码解析

文章目录 一、题目&#x1f383;题目描述&#x1f383;输入输出&#x1f383;样例1 二、思路参考三、代码参考&#x1f3c6;C语言 作者&#xff1a;KJ.JK &#x1f342;个人博客首页&#xff1a; KJ.JK &#x1f342;专栏介绍&#xff1a; 华为OD机试真题汇总&#xff0c;定期…...

(七)CSharp-刘铁锰版-事件

一、初步了解事件 定义&#xff1a;单词 Event &#xff0c;译为“事件” 《牛津词典》中的解释是“a thing that happens,especially something important”通顺的解释就是“能够发生的什么事情” 角色&#xff1a; 使对象或类具备通知能力的成员 &#xff08;中译&#x…...

【ROS】郭老二博文之:ROS目录

1、ROS2 【ROS】Ubuntu22.04安装ROS2&#xff08;Humble Hawksbill&#xff09; 【ROS】ROS2命令行工具详解 【ROS】ROS2中的概念和名词解释 【ROS】ROS2编程示例&#xff1a;话题订阅-发布-C版 【ROS】ROS2编程示例&#xff1a;服务和客户端-C版 【ROS】ROS2编程示例&#xf…...

Android应用程序进程的启动过程

Android应用程序进程的启动过程 导语 到这篇文章为止&#xff0c;我们已经简要地了解过了Android系统的启动流程了&#xff0c;其中比较重要的内容有Zygote进程的启动和SystemService以及Launcher的启动&#xff0c;接下来我们将要学习的是Android应用程序的启动过程&#xff…...

【2】Midjourney注册

随着AI技术的问世&#xff0c;2023年可以说是AI爆炸性成长的一年&#xff0c;近期最广为人知的AI服务除了chatgpt外&#xff0c;就是从去年五月就已经问世的AI绘画工具mid journey了。 ▲几个AI工具也代表了人工智能的热门阶段 只要输入一段文字&#xff0c;AI就会根据语意计算…...

第六十八天学习记录:高等数学:导数(宋浩板书)

导数是微积分中的一个概念&#xff0c;描述了函数在某一个点上的变化率。具体地说&#xff0c;函数 f ( x ) f(x) f(x)在 x a xa xa处的导数为 f ′ ( a ) f(a) f′(a)&#xff0c;表示当 x x x在 a a a处发生微小的变化 Δ x \Delta x Δx时&#xff0c; f ( x ) f(x) f(x)对…...

unreal 5 实现角色拾取功能

要实现角色拾取功能&#xff0c;我们需要实现蓝图接口功能&#xff0c;蓝图接口主要提供的是蓝图和蓝图之间可以通信&#xff0c;接下来&#xff0c;跟着教程&#xff0c;实现一下角色的拾取功能。 首先&#xff0c;我们要实现一个就是可视区的物品在朝向它的时候&#xff0c;会…...

chatgpt赋能python:如何使用Python升序排列一个列表?

如何使用Python升序排列一个列表&#xff1f; 在Python编程中&#xff0c;我们经常需要对列表进行排序。列表排序是一种常见的操作&#xff0c;可以帮助我们对数据进行分析和管理。在这篇文章中&#xff0c;我们将学习如何使用Python对一个列表进行升序排列。 什么是升序排列…...

智能汽车纵向行车辅助分层控制【附程序】

✨ 长期致力于交通事故场景分析、智能跟车、自动紧急制动、分层控制、联合仿真测试研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;基于真实事故场景的…...

保姆级图解:用Wireshark抓包分析PCI总线读写的完整时序(附信号解读)

保姆级图解&#xff1a;用Wireshark抓包分析PCI总线读写的完整时序&#xff08;附信号解读&#xff09; 在嵌入式开发和硬件调试领域&#xff0c;能够直观观察总线通信时序是每个工程师梦寐以求的能力。传统上我们只能通过示波器观察波形或查阅芯片手册中的时序图&#xff0c;但…...

3个理由选择Clipy:重新定义你的macOS剪贴板体验

3个理由选择Clipy&#xff1a;重新定义你的macOS剪贴板体验 【免费下载链接】Clipy Clipboard extension app for macOS. 项目地址: https://gitcode.com/gh_mirrors/cl/Clipy Clipy是一款专为macOS用户设计的剪贴板增强应用&#xff0c;它不仅能记录你的剪贴板历史&…...

2025最权威的五大AI科研神器解析与推荐

Ai论文网站排名&#xff08;开题报告、文献综述、降aigc率、降重综合对比&#xff09; TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 降低AI工具的存在有着极其关键的意义&#xff0c;这类工具可以有效地料理AI生成的内容&…...

手把手教你用Cadence仿真12位SAR ADC:从电路图到FFT频谱分析(含Simc 18mmrf工艺)

12位SAR ADC全流程仿真指南&#xff1a;从Cadence搭建到Matlab频谱解析 在模拟集成电路设计中&#xff0c;逐次逼近型模数转换器(SAR ADC)因其优异的能效比和中等精度特性&#xff0c;成为物联网设备、可穿戴设备和传感器接口的首选方案。本文将基于Simc 18mmrf工艺&#xff0…...

PyVisionAI:基于视觉大模型的文档内容智能提取与理解工具

1. 项目概述&#xff1a;PyVisionAI&#xff0c;一个文档内容提取与视觉理解的瑞士军刀如果你经常需要从PDF、PPT、Word文档甚至网页中提取内容&#xff0c;并且希望AI能帮你“看懂”里面的图片和图表&#xff0c;那么PyVisionAI这个工具你应该了解一下。它本质上是一个Python工…...

WinRAR分卷压缩 vs 7-Zip分卷压缩:哪个更适合你?一次讲清区别、选型和实操

WinRAR分卷压缩 vs 7-Zip分卷压缩&#xff1a;深度对比与场景化选型指南 在数字文件传输与存储的日常场景中&#xff0c;大文件处理始终是个绕不开的痛点。无论是设计师需要发送PSD源文件给客户&#xff0c;还是开发人员要共享虚拟机镜像&#xff0c;当文件体积突破邮箱附件限…...

AI自动化部署实战:用hermes-setup-skill解决Hermes Agent部署难题

1. 项目概述&#xff1a;让AI助手成为你的自动化部署专家 如果你和我一样&#xff0c;经常在本地或远程服务器上折腾各种AI Agent项目&#xff0c;那么对Hermes Agent这个名字一定不陌生。作为NousResearch推出的一个功能强大的多平台AI助手框架&#xff0c;它能把你的LLM能力…...

Process Explorer|微软官方免费进程神器|吊打系统任务管理器|揪出隐藏恶意软件

电脑莫名卡顿、风扇狂转、文件删不掉&#xff1f;系统任务管理器查不到元凶&#xff1f;试试 Process Explorer—— 微软官方免费进程管理工具&#xff0c;功能碾压自带任务管理器&#xff0c;轻松揪出后台隐藏恶意软件&#xff0c;普通用户也能上手&#xff01; 备用下载 一…...

微信网页版访问难题如何破解?wechat-need-web浏览器扩展的轻量级替代方案探索

微信网页版访问难题如何破解&#xff1f;wechat-need-web浏览器扩展的轻量级替代方案探索 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 你是否曾在公…...