【学习笔记】Docker(二)

news2024/9/25 11:17:00

Docker镜像加载原理

UnionFS(联合文件系统)

一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像(Docker下载镜像时一层层下载就是这个)

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

Docker镜像加载原理

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

bootfs(boot file system):主要包括bootloads和kernel内核,bootloads主要是引导加载内核,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux系统是一样的,包括boot加载器和内核,当boot加载完成之后整个内核就在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs

rootfs(root file system):在bootfs上,包括的就是典型的Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件,rootfs就是各种不同的操作系统发行版,比如Ubuntu、Centos等

所有的镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层:

例如基于Ubuntu Linux16.04创建一个新的镜像,这就是新镜像的第一层,如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就会创建第三个镜像层

Docker镜像都是只读的,当容器启动时,一个新的可写层被夹在到镜像的顶部!

这一层就是我们通常说的容器层,容器之下的都叫镜像层

然后可以将新的一层和原来的层一起打包成大的镜像进行发布

 

Commit镜像

docker commit 提交容器成为一个副本

docker commit -m=提交的描述信息 -a=作者 容器id 目标镜像名:[TAG]

容器数据卷

为了容器的持久化和同步操作-容器间实现数据共享

MySQL,容器删了数据就没了==需求:数据可以存储在本地

将容器内的目录挂载到虚拟机上

例:docker run -p 3306:3306 --name mysql --privileged=true

-v /mydata/mysql/log:/var/log/mysql

-v /mydata/mysql/data:/var/lib/mysql

-v /mydata/mysql/conf:/etc/mysql/conf.d

-e MYSQL_ROOT_PASSWORD=root  

-d mysql:8.0.26

-v /root/mysql/logs:/logs:将主机目录(/root/mysql)下的 logs 目录挂载到容器中的

/logs 日志目录

-v /root/mysql/data:/var/lib/mysql :将宿主机目录(/root/mysql)下的data目录挂载到容

器的 /var/lib/mysql 数据目录

docker inspect mysql(Mounts)查看挂载信息,数据挂载成功

进入容器内部docker exec -it mysql /bin/bashcd /var/lib/mysql查看容器内部数据

查看宿主数据目录,内容保持一致

Dockerfile

就是用来构建docker镜像的构建文件,命令脚本

--镜像是一层层的,脚本是一个个的命令,通过脚本可构建镜像

在Java8的环境下,将宿主/var/lib/docker/volumes/xxx/_data挂载到容器内部的/temp目录

Docker执行Dockerfile的大致流程如下:

(1)docker从基础镜像运行一个容器

(2)执行一条指令并对容器作出修改

(3)执行类似docker commit的操作提交一个新的镜像层

(4)docker再基于刚提交的镜像运行一个新容器

(5)执行dockerfile中的下一条指令直到所有指令都执行完成

DockerFile常用保留字指令

FROM -基础镜像,当前新镜像是基于哪个镜像的,指定一个已经存在的镜像作为模板,第一条必须是from

MAINTAINER -镜像维护者的姓名和邮箱地址

RUN -容器构建时需要运行的命令,有两种形式,一是后面加shell命令如RUN yum -y install vim,另一种是exec格式,如RUN [“./test.php”, “dev”, “offline”]

EXPOSE -当前容器对外暴露出的端口

WORKDIR -指定在创建容器后,终端默认登陆的进来工作目录,一个落脚点

USER -指定该镜像以什么样的用户去执行,如果都不指定,默认是root

ENV用来在构建镜像过程中设置环境变量,这个环境变量可以在后续的其他指令中使用

ADD -将宿主机目录下的文件拷贝进镜像且会自动处理URL和解压tar压缩包

COPY -类似ADD,拷贝文件和目录到镜像中。 将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置

VOLUME -容器数据卷,用于数据保存和持久化工作

CMD -指定容器启动后的要干的事情,格式跟RUN相似,和前面RUN命令的区别:CMD是在docker run 时运行,RUN是在 docker build时运行

docker学习(四):DockerFile微服务实战及docker端口映射_dockerfile指定端口映射_拒绝冗余的博客-CSDN博客

Docker网络

  1. 容器间的互联和通信以及端口映射
  2. 容器IP变动时候可以通过服务名直接网络通信而不受到影响

ens和lo接口:可以理解为宿主机的物理接口

在CentOS7的安装过程中如果有选择虚拟化的服务安装系统后,启动网卡时会发现有一个以太网桥连接的私网地址virbr0网卡(默认:192.168.122.1),作为虚拟机网桥的使用,为虚拟网卡提供NAT访问外网的功能。

启动docker后会产生一个名为docke0的虚拟网桥(桥接模式):

  1. Linux与Docker容器之间通过docker0是可以ping通的
  2. Docker容器与容器之间是可以相互ping通的

 Docker网络模式

  1. bridge:为每个容器分配设置IP,并将容器连接到docker0虚拟网桥,默认该模式
  2. host:容器不会虚拟出自己的网卡配置IP等,而是使用宿主机的IP和端口
  3. none容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair和网桥连接、IP等只有一个lo(即禁用网络功能),需要手动为容器添加网卡配置IP等
  4. container:新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等,使用--network container:NAME或者容器ID指定

 

当docker启动MySQL,MySQL容器的连接到Bridge上的veth接口,形成veth-pair,默认的Bridge网络,网关默认是docker0,docker0的地址市172.17.0.1/24,则接入设备的IP以此类推:172.17.0.2/24

 

Docker网络,网络工程师还不赶紧收藏!_李白你好的博客-CSDN博客 

查看Bridge上接口的信息:bridge link

得到容器ID和veth bridge interface的关系

  1. 新建文件touch docker_eth_pair.sh
  2. vim docker_eth_pair.sh(具体内容见博客快速得到容器ID和veth bridge interface的关系_格洛米爱学习的博客-CSDN博客)
  3. 赋予权限(chmod 777 docker_eth_pair.sh)
  4. 执行脚本./docker_eth_pair.sh
get_network_mode() {
    docker inspect --format='{{.HostConfig.NetworkMode}}' "$1"
}


created_by_kubelet() {
    [[ $(docker inspect --format='{{.Name}}' "$1") =~ ^/k8s_ ]]
}


for container_id in $(docker ps -q); do
    network_mode=$(get_network_mode "${container_id}")
    # skip the containers whose network_mode is 'host' or 'none',
    # but do NOT skip the container created by kubelet.
    if [[ "${network_mode}" == "host" || \
          $(! created_by_kubelet "${container_id}") && "${network_mode}" == "none" ]]; then
        echo "${container_id} => ${network_mode}"
        continue
    fi

    # if one container's network_mode is 'other container',
    # then get its root parent container's network_mode.
    while grep container <<< "${network_mode}" -q; do
        network_mode=$(get_network_mode "${network_mode/container:/}")
        # skip the containers whose network_mode is 'host' or 'none',
        # but do NOT skip the container created by kubelet.
        if [[ "${network_mode}" == "host" || \
              $(! created_by_kubelet "${container_id}") && "${network_mode}" == "none" ]]; then
            echo "${container_id} => ${network_mode}"
            continue 2
        fi
    done

    # get current container's 'container_id'.
    pid=$(docker inspect --format='{{.State.Pid}}' "${container_id}")

    # get the 'id' of veth device in the container.
    veth_id=$(nsenter -t "${pid}" -n ip link show eth0 |grep -oP '(?<=eth0@if)\d+(?=:)')

    # get the 'name' of veth device in the 'docker0' bridge (or other name),
    # which is the peer of veth device in the container.
    veth_name=$(ip link show |sed -nr "s/^${veth_id}: *([^ ]*)@if.*/\1/p")

    echo "${container_id} => ${veth_name}"
done

使用docker network inspect bridge查看特定网络的信息

 docker network create xx 创建网络(默认Bridge)

docker network rm xx删除指定网络

Docker容器内部的IP是会发生变化的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/399857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音视频开发之IOMX调用端—OMXCodec源码分析

概述 OMX Codec是stagefrightplayer中负责解码的模块。由于遵循openmax接口规范&#xff0c;因此结构稍微有点负责&#xff0c;这里就依照awesomeplayer中的调用顺序来介绍。 主要分如下几步&#xff1a; 1 mClient->connect2 InitAudioDecoder & InitVideoDecoder3 …

C++回顾(十三)—— 运算符重载提高

13.1 为什么不要重载 && 和 || 运算符 1&#xff09;&&和||是C中非常特殊的操作符2&#xff09;&&和||内置实现了短路规则3&#xff09;操作符重载是靠函数重载来完成的4&#xff09;操作数作为函数参数传递5&#xff09;C的函数参数都会被求值&#…

xxl-job分布式任务调度平台

分布式任务调度平台XXL-JOB (xuxueli.com) 1 xxl-job概述 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。 1.1 xxl-job架构 我把上面的图精简了一下&#xff0c;xxl-job 的调度器和业务执行是独立的。调度器决定任务的调…

【数据分析师求职面试指南】必备基础知识整理

数据分析师基础知识统计 数据分析知识基础概念随机变量常用特征正态分布与大数定律、中心极限定律假设检验模型、数据挖掘知识常用概念数据集划分欠拟合过拟合模型分类方法常见模型介绍线性回归模型&#xff1a;逻辑回归模型决策树模型随机森林模型Boosting模型XGBoost模型模型…

前后端分离项目学习-vue+springboot 博客

前后端分离项目 文章总体分为2大部分&#xff0c;Java后端接口和vue前端页面 项目演示&#xff1a;www.markerhub.com:8084/blogs Java后端接口开发 1、前言 从零开始搭建一个项目骨架&#xff0c;最好选择合适&#xff0c;熟悉的技术&#xff0c;并且在未来易拓展&#xf…

精简:设计模式

1.设计模式概述 1.什么是设计模式 设计模式(Design Pattern)是前辈们对代码开发经验的总结&#xff0c;是解决特定问题的一系列套路。 它不是语法规定&#xff0c;而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案。 1995年&#xff0c;GoF (Ga…

flutter工程创建过程中遇到一些问题。

安装环境版本&#xff1a;JDK7.-JDK 8 Andriod SDK 10 flutter 版本 3.0 1.当创建完后flutter工程后会遇到 run gradle task assemlble Debug 的问题&#xff0c;需要设置远程仓库&#xff0c;共需要修改三个地方build.gradle两处以及flutter 下面的D:\FVM\versions\3.0.0\pac…

Excel常用可视化图表

目录柱状图与条形图折线图饼图漏斗图雷达图瀑布图及甘特图旭日图组合图excel图表&#xff1a;柱状数据条、excel热力图、mini图可视化工具的表现形式&#xff1a;看板、可视化大屏、驾驶舱 柱状图与条形图 条形图是柱状图的转置 类别&#xff1a; 单一柱状图&#xff1a;反映…

Linux内核移植

内核移植半导体厂商会从linux内核官网下载某个版本&#xff0c;将其移植到自己的CPU上&#xff0c;测试成功后就会将其开放给该半导体的厂商的CPU开发者&#xff0c;开发者下载其提供的linux内核&#xff0c;然后将其移植到自己的 产品上。1、NXP官方开发板Linux内核编译测试编…

VR会议不断升级,为商务会谈打造云端洽谈服务!

VR会议不断升级&#xff0c;为商务会谈打造云端洽谈服务。在商务合作中&#xff0c;对客户需求的理解以及与客户讲解方案都需要建立在一个有效的沟通上&#xff0c;因此VR会议的用武之地就有了&#xff0c;以VR全景技术为核心&#xff0c;通过同屏互动和全景通信技术&#xff0…

wiki(维基)是什么?企业为什么需要搭建wiki?

维基百科是wiki的一个著名例子。维基百科上的内容可以由任何人创建和编辑&#xff0c;只要他们能够访问网络浏览器&#xff0c;并且可以使用简化的加价语言进行写作。对于 wiki&#xff0c;没有集中的作者或团队负责内容生成。从某种意义上说&#xff0c;维基是非常民主的。维基…

【SCL】移位和循环指令的应用(音乐喷泉改进)

移位指令&#xff1a;右移&#xff08;SHR&#xff09;左移&#xff08;SHL&#xff09;和循环左移/右移&#xff08;ROR/ROL&#xff09;指令的应用 文章目录 目录 一、移位和循环移位指令 1.左移右移 2.使用左移和脉冲实现音乐喷泉 3.循环移位指令 二、优化的其它方法 1.使用…

计算机SCI期刊的分值是什么意思? - 易智编译EaseEditing

影响因子&#xff08;Impact Factor,IF)是美国ISI&#xff08;科学信息研究所)的JCR(期刊引证报告)中的一项数据。 即某期刊前两年发表的论文在统计当年的被引用总次数除以该期刊在前两年内发表的论文总数。这是一个国际上通行的期刊评价指标。 例如&#xff0c;某期刊2005年影…

2023年主流的固定资产管理方式

2023年主流的固定资产管理方式可能有以下三种&#xff1a; 基于PaaS平台的固定资产管理系统&#xff0c;支持低代码平台&#xff0c;可以通过拖拉拽的方式进行表单搭建、流程搭建、自定义仪表盘等&#xff0c;满足不同行业和企业的个性化需求。基于RFID和二维码相结合的固定资…

卷麻了,00后Jmeter用的比我还熟练,简直没脸见人......

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对测试工具的使用感到困扰&#xff1f;前言性能测试是一个全栈工程师/架构师必会的技能之一&#xff0c;只有学会性能测试&#xff0c;才能根据得到的测试报告进行分析&#xff0c;找到系统性…

Allegro如何快速查看差分对是否等长的方法

在用Allegro进行PCB设计时&#xff0c;用快速查看差分对是否等长的方法&#xff0c;可以提高效率。那如何操作呢&#xff1f;具体操作方法如下&#xff1a;&#xff08;1&#xff09;选择菜单栏Route选择Timing Vision&#xff08;时序视图&#xff09; 然后在Options选项卡Tim…

陀螺和加计有关参数部分说明

部分参数计算一、零偏二、随机游走三、Allan方差分析使用要点一、零偏 如果只用一个指标来代表一款IMU的精度的话&#xff0c;那毫无疑问是陀螺零偏。这是因为&#xff1a;1) 惯导系统的精度主要取决于IMU中的陀螺器件精度&#xff0c;而不是加速度计精度&#xff1b;2) 陀螺的…

黑客入门教程【非常详细】从零基础入门到精通,看这一篇就够了!

首先要明白啊&#xff0c;我们现在说的黑客不是那种窃取别人信息、攻击别人系统的黑客&#xff0c;说的是调试和分析计算机安全系统的网络安全工程师。 黑客技术的核心就是渗透攻防技术&#xff0c;是为了证明网络防御按照预期计划正常运行而提供的一种机制。就是通过模拟恶意…

C#:Krypton控件使用方法详解(第十三讲) ——kryptonDomainUpDown

今天介绍的Krypton控件中的kryptonDomainUpDown。下面介绍控件的外观属性和Item属性&#xff1a;Cursor属性&#xff1a;表示鼠标移动过该控件的时候&#xff0c;鼠标显示的形状。属性值如下图所示&#xff1a;Text属性&#xff1a;表示控件的显示文本内容&#xff0c;属性值为…

Apache HTTP Server <2.4.56 mod_proxy_uwsgi 模块存在请求走私漏洞(CVE-2023-27522)

漏洞描述 Apache HTTP Server 是一个Web服务器软件。 该项目受影响版本存在请求走私漏洞。由于mod_proxy_uwsgi.c 中uwsgi_response方法对于源响应头缺少检查&#xff0c;当apache启用mod_proxy_uwsgi后&#xff0c;攻击者可利用过长的源响应头等迫使应转发到客户端的响应被截…