首页 > 其他分享 >Docker实现原理学习

Docker实现原理学习

时间:2023-12-28 14:33:59浏览次数:32  
标签:容器 CLONE 学习 网桥 Linux 进程 原理 Docker

Docker实现原理学习

Namespaces

命名空间 (namespaces) 是 Linux 为我们提供的用于分离进程树、网络接口、挂载点以及进程间通信等资源的方法。

在日常使用 Linux 或者 macOS 时,我们并没有运行多个完全分离的服务器的需要,但是如果我们在服务器上启动了多个服务,这些服务其实会相互影响的,每一个服务都能看到其他服务的进程,也可以访问宿主机器上的任意文件。

我们更希望运行在同一台机器上的不同服务能做到完全隔离,就像运行在多台不同的机器上一样。

Docker 其实就通过 Linux 的 Namespaces 对不同的容器实现了隔离。

Linux 的命名空间机制提供了以下七种不同的命名空间,包括 CLONE_NEWCGROUPCLONE_NEWIPCCLONE_NEWNETCLONE_NEWNSCLONE_NEWPIDCLONE_NEWUSERCLONE_NEWUTS,通过这七个选项我们能在创建新的进程时设置新进程应该在哪些资源上与宿主机器进行隔离。

进程隔离

在每一个 *nix 的操作系统上,我们都能够通过 ps 命令打印出当前操作系统中正在执行的进程,比如在 Ubuntu 上,使用该命令就能得到以下的结果:

image

当前机器上有很多的进程正在执行,在上述进程中有两个非常特殊,一个是 pid 为 1 的 /sbin/init 进程,另一个是 pid 为 2 的 kthreadd 进程,这两个进程都是被 Linux 中的上帝进程 idle 创建出来的,其中前者负责执行内核的一部分初始化工作和系统配置,而后者负责管理和调度其他的内核进程。

image

如果我们在当前的 Linux 操作系统下运行一个新的 Docker 容器,在当前的宿主机器上,可能就存在由上述的不同进程构成的进程树

image

这就是在使用 clone(2) 创建新进程时传入 CLONE_NEWPID 实现的,也就是使用 Linux 的命名空间实现进程的隔离,Docker 容器内部的任意进程都对宿主机器的进程一无所知。

网络

如果 Docker 的容器通过 Linux 的命名空间完成了与宿主机进程的网络隔离,但是却又没有办法通过宿主机的网络与整个互联网相连,就会产生很多限制,所以 Docker 虽然可以通过命名空间创建一个隔离的网络环境,但是 Docker 中的服务仍然需要与外界相连才能发挥作用。

每一个使用 docker run 启动的容器其实都具有单独的网络命名空间,Docker 为我们提供了四种不同的网络模式,Host、Container、None 和 Bridge 模式。

在网桥模式下,除了分配隔离的网络命名空间之外,Docker 还会为所有的容器设置 IP 地址。当 Docker 服务器在主机上启动之后会创建新的虚拟网桥 docker0,随后在该主机上启动的全部服务在默认情况下都与该网桥相连。

image

在默认情况下,每一个容器在创建时都会创建一对虚拟网卡,两个虚拟网卡组成了数据的通道,其中一个会放在创建的容器中,会加入到名为 docker0 网桥中。

docker0 会为每一个容器分配一个新的 IP 地址并将 docker0 的 IP 地址设置为默认的网关。网桥 docker0 通过 iptables 中的配置与宿主机器上的网卡相连,所有符合条件的请求都会通过 iptables 转发到 docker0 并由网桥分发给对应的机器。

当有 Docker 的容器需要将服务暴露给宿主机器,就会为容器分配一个 IP 地址,同时向 iptables 中追加一条新的规则。

image

标签:容器,CLONE,学习,网桥,Linux,进程,原理,Docker
From: https://www.cnblogs.com/panxianhao/p/17932648.html

相关文章

  • Java 系统学习 | Springboot 写 hello world
    经过一段时间基础学习,现在开始使用Springboot框架完成项目,特地记录一下,方便后续查漏补缺。本篇使用Springboot3框架,IDEA2022编辑器,java17版本。新建项目file->new->project弹框中填入自己的信息Name项目名称Location项目存放路径LanguageJavaB......
  • 基于代码一步一步教你深度学习中循环神经网络(RNN)的原理
    当谈到基于RNN(循环神经网络)的机器学习例子时,一个常见的任务是文本生成。RNN是一种能够处理序列数据的神经网络,它具有记忆能力。以下是一个基于RNN的文本生成例子,并给每一行添加了详细注释:1.importtorch2.importtorch.nnasnn3.importtorch.optimasoptim4.5.#定义......
  • HTML学习第七天:JavaScript进阶与事件处理
    在今天的HTML学习中,我进一步深入了JavaScript的学习,特别是事件处理方面。早上,我回顾了昨天学习的JavaScript基础知识,并进行了一些练习,以加深自己的理解。然后,我开始学习事件处理。事件处理是JavaScript中非常重要的一部分,它允许我们响应用户的各种操作,如点击、滑动、键盘输入等。我......
  • 可视化学习:图形系统中的颜色表示
    引言说到颜色,前端的小伙伴们一定都不陌生,比如字体颜色、背景色等等,颜色是构建视觉效果的重要部分,所以也必然是可视化的关键部分,当学习到可视化中有关于颜色表示的这一部分时,我也想起了我曾经玩过的一个游戏,叫做Blendoku,这个名字和数独的Sudoku有些类似,考验的是玩家对颜色的敏锐度......
  • docker ps 语法
    dockerps语法  语法:dockerps[OPTIONS]  参数: 参数名参数描述–all,-a显示所有的容器,包括未运行的–filter,-f根据条件过滤显示的内容–format:指定返回值的模板文件–last,-l显示最近创建的容器–latest,-n列出......
  • 手把手从安装本地虚拟机,基于docker,部署springboot+vue项目(若依框架前后端分离版本演示
    目录1.安装本地虚拟机centos2.安装docker,拉取镜像,创建容器3.打包部署后端4.配置nginx5.打包部署前端6.常见问题汇总1.安装本地虚拟机centos部署环境提供vm16,和centos7,其中把镜像改成.iso文件就可以了阿里云链接:https://www.alipan.com/s/BTnpjuHWtEp为什么用阿里云,不限速啊,秉......
  • 【Spring教程31】SSM框架整合实战:从零开始学习SSM整合配置,如何编写Mybatis SpringMVC
    目录1流程分析2整合配置2.1步骤1:创建Maven的web项目2.2步骤2:添加依赖2.3步骤3:创建项目包结构2.4步骤4:创建SpringConfig配置类2.5步骤5:创建JdbcConfig配置类2.6步骤6:创建MybatisConfig配置类2.7步骤7:创建jdbc.properties2.8步骤8:创建SpringMVC配置类2.9步骤9:创......
  • docker时区设置
    前言一般情况下我们容器的时区已经在启动的时候设置好了,但是如果你没有在启动脚本里面设置时区可能会导致项目过多,删除容器重新构建容器时区带来的成本比较高。第一种:启动脚本配置时区查看当前操作系统的时区命名:timedatectlstatus如下:配置启动脚本sh脚本方式:-eTZ=As......
  • css学习知识
    CSS规则由两个主要的部分构成:选择器,以及一条或多条声明。CSS声明总是以分号;结束,声明总以大括号{}括起来。id选择器可以为标有特定id的HTML元素指定特定的样式。HTML元素以id属性来设置id选择器,CSS中id选择器以"#"来定义。class选择器用于描述一组元素的样式,可......
  • Linux shell编程学习笔记36:read命令
     *更新日志 *2023-12-181.根据[美]威廉·肖特斯(Willian shotts)所著《Linux命令行大全(第2版)》            更新了-e、-i、-r选项的说明           2.更新了2.8的实例,增加了gif动图           3.补充......