Docker 使用原理流程

news/2025/2/19 8:40:03/

# docker 是如何来的?
a. linux 内核本身支持容器技术,LXC (市面上有很多基于 LXC 开发的容器管理软件,如创建容器,查看容器,管理容器, docker 作为管理容器的一款代表工具软件)
b. 容器的作用,
1. 创建独立的 namespace,一个隔离的环境。
2.以及对资源进行限制,
3.以及容器是直接使用宿主机的硬件配置 (没有像虚拟化这种资源损耗)

# docker 和容器的关系
1.docker 就是一个对容器增删改查的一个工具
2.docker 就是基于 golang 语音开发的一款软件
3.学习使用 docker 时要安装 golang 环境


# linux 宿主机  centos
宿主机本身有没有自己的 namespace?

进程
网络
文件系统

举例:nginx     ---pid  14578
               ---port 80
               network 10.0.0.22
               
进程pid->去读取文件系统
/opt/nginx/sbin/cgifx.17
基于文件跑出来的进程
宿主机有这些的 namespace 资源是有数量,路径限制的
因此才会有容器,虚拟机等可以实现隔离环境的作用 说白了就是创建独立的三个 namespace

docker run centos 调用 linux 内核 LXC 容器技术  实现了创建 centos 容器
docker run nginx -> 调用 linux 内核 LXC 容器技术  -> 实现创建容器


资源隔离   作用1
容器 宿主机 网桥 docker0 默认的网段  172.16.17.0/16
所有容器都用 /opt/nginx-1.17/sbin/nginx 这个文件路径,他们的文件路径是不会冲突的

容器1
进程
网络        172.16.17.2
文件系统    /opt/nginx-1.17/sbin/nginx

容器2
进程
网络        172.16.17.3
文件系统    /opt/nginx-1.17/sbin/nginx

容器3
进程
网络        172.16.17.4
文件系统    /opt/nginx-1.17/sbin/nginx

容器4
进程
网络        172.16.17.5
文件系统    /opt/nginx-1.17/sbin/nginx

#
1.linux 本身支持 LXC 技术 对 linux 内核资源隔离 (提供了两个技术:namespace 和 cgroup 技术)
2.docker 基于 golang 开发出来了,docker 的作用就是调用 LXC 技术去管理这些容器 如增删改查
3. 运维,开发基于这些容器去部署这些应用

docker 和 LXC linux容器技术的本质关系,以及我们是如何用的 docker ,以及 docker 资源隔离本质

docker 是管理 LXC linux 容器技术的工具,docker 是用 golang 语言写的
学习 docker 就需要安装 golang 环境
用 docker 命令去实现 容器的增删改查

# docker 工具
容器技术是 linux 系统支持的 名字叫 LXC 容器技术的作用是在操作系统的角度实现资源的隔离与限制,
说白了就是用 LXC 技术去创建独立的 namespace 命名空间,去区分开进程,网络,文件系统这样的一个环境
我们要基于 LXC 技术去创建容器,是很费劲的,有很多其他的容器技术也是去管理 LXC 容器技术 发现他们不好,后来
Docker 公司位于旧金山,原名 dotCloud, 底层利用了 linux 容器技术 (LXC) (在操作系统中实现资源隔离与限制)。为了方便创建和管理这些容器,dotCloud 开发了一些内部工具,之后被命名为"docker".    
Docker 就是这样诞生的

Docker 对容器的管理,命令非常简单,主要围绕 增删改查 四个角度 的命令去使用
增    创建一个容器
删    干掉删除容器记录(删除了某一个名称空间)
改    修改容器内的应用信息以及修改容器的网络模式等,以及修改容器的名字
查    查询当前有多少容器进程

# 创建虚机需要你的 cpu 支持这个  Hypervisor 工具
Hypervisor , 一种运行基础物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享硬件,常见的 vmware的 workstation,ESXi,微软的 Hyper-v或者思杰的 XenServer.

#  linux 内核 支持 LXC 容器技术
Container Runtime ,通过 linux 内核虚拟化能力管理多个容器。多个容器共享一套操作系统内核。因此摘掉了内核占用的空间及运行所需要的耗时,使得容器极其轻量与快速。
centos 宿主机 (发行版 + linux 内核(支持 LXC 技术)) 即通过 LXC 技术去增删改查容器

#
LXC > Libcontainer (创建一个隔离的,独立的 namespace,也就是容器实例)

docker 的强大在于通过操作系统层面的虚拟化实现进程隔离,因此 docker 容器进程运行后,不需要像虚拟机一样的一个完整的操作系统。。。

红帽官网的虚拟化文章
https://www.redhat.com/zh/topics/virtualization
https://www.redhat.com/zh/containers/whats-a-linux-container

维基百科,什么是操作系统虚拟化
https://zh.wikipedia.org/zh-cn/topics/

# 容器技术

-  Docker 最初是 DotCloud 公司在法国期间发起的一个公司内部项目,后来以 Apache 2.0 授权协议开源,代码在 github 上维护

-  Docker 是基于 Google 公司推出的 Golang 语言开发而来的,基于 Linux 内核的 Cgroups,NameSpace,以及 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。

-  由于隔离的进程独立于宿主机和其他隔离的进程,也被称之为容器。

-  最初的 Docker 是基于 LXC ( Linux Containers  是一种 linux 端 操作系统 级的虚拟化技术,可以实现轻量级容器,每个容器看起来像一个独立的操作系统,他们共享同一个物理服务器,但是互相隔离。LXC容器比传统虚拟机更加轻便,高效,且启动速度快) 的,后来去除 LXC 转而使用自行开发的 Libcontainer。

-  Docker 被定义为开源的容器引擎,可以方便的对容器进行管理,例如对镜像打包封装,引入 Docker Registry 对镜像统一管理。

-  利用 Docker 可以实现开发,测试,生产环境的部署一致性,极大的减少运维成本。

举例分析
宿主机环境
网络
进程
文件系统等信息
基于 centos7 下载安装 docker 工具    yum install docker


docker run nginx 命令
# 容器1
基础镜像,发行版提供 当执行 docker run nginx 这条命令后,会自动下载 debian 系统(默认下载这个系统)
nginx 程序   然后nginx有自己独立的文件系统
独立名称空间
文件系统    /usr/bin/nginx
端口        80
进程        12334


docker 做了什么事情
1.下载镜像
2.运行程序
3.创建整个容器去跑一个 nginx


容器本质上还是跑在 centos7 上的,因此 容器是 centos7 宿主机上的一个进程而与
在宿主机上可以用 ps ef | grep nginx 看到Nginx这个容器 id 记录
容器的本质:就是跑在宿主机上的一个进程而与。
容器就是对 xxx 程序的封装,提供了一个独立运行的环境 是隔离的环境
比如跑一个 nginx 容器 其实就是对 nginx 程序的封装

最初是 linux 基于 LXC 去管理容器 后来 docker 这家公司基于 golang 语言对底层容器技术 LXC 创建技术进行二次开发,
基于 golang 写了一个底层容器驱动,叫 libcontainer  能够在宿主机上看到 containeed 进程


# docker 为什么能够实现多环境的一致性以及快速发布

1.没有容器的部署环境(centos + ubuntu)
- 开发一般不懂 centos(ubuntu)环境  2年以内开发的基本不懂 linux 环境
- windows + java 写源代码   源代码   是基于 windows 环境运行的
- 功能开发 调用的一些驱动都是 windows 环境的
- 你这套源码,他运行后,要下载很多依赖,都是windods

2.测试环境   用 centos 或者 ubuntu
- 源码写完了上传到 gitlab github 测试仓库下载到测试环境
- 基于 源代码 运行环境,去安装一些依赖
- 安装数据库等
-保证跑起来之后,调试功能是否有BUG

发现代码有错,
求运维    jdk 用什么命令
求开发指导环境参数如何,功能是干嘛的

3.生产环境  运维 可以手工部署应用 jenkins
- 源码写完了上传到 gitlab github 线上仓库下载到生产环境
- 单机,
- 单点
- 数据库 测试数据库的假数据


# 如今的企业级虚拟机环境  阿里云 还是私有云,说白了都是虚拟机
环境: 物理机 -> 虚拟化 -> 私有云(阿里云,ESC,机器)->yum install docker->docker run nginx 或者 docker run jenkins 从而实现    nginx容器  jenkins容器

基于虚拟机,源码,jenkins , 多环境发布    问题: 慢 , 容易出错
传统的发布模式只提供源码    所有环境都是临时 安装 的
环境的部署是一个大问题
测试环境 与生产环境又不一样


# 如何实现环境一致性
开发提供好一个部署物料 不仅有源码,运行环境直接发给测试,直接发给运维。(运行环境+源码)

# 没有容器的发布时代,(基于虚拟机的模板发布)
基于vmware 模板机实现,有一个机器是专门跑 tomcat 这套台机器提供了稳定的模板基础,基于这台机器,克隆出你需要的运行的测试环境,生产环境  这样尽量减少环境不一致的问题
虚拟机模板克隆技术是很重量级的 都是 linux 内核一套 + 发行版一套,你安装的镜像4-10GB左右 安装完成之后最少20GB

# 有容器的发布时代    Docker 镜像 只有软件运行的依赖环境,只有发行版,你的代码是基于 centos,ubuntu,macos  发行版+xxx依赖 所以体积很小

 

# 基于容器实现的环境一致性发布
# 容器化部署架构

LXC开源仓库 GitHub - lxc/lxc: LXC - Linux Containers

LXC容器:概念介绍及简单上手操作指导
1、介绍LXC(Linux Containers)是一种Linux端操作系统级的虚拟化技术,可以实现轻量级容器,每个容器看起来像一个独立的操作系统,它们共享同一台物理服务器,但是互相隔离。LXC容器比传统虚拟机更加轻便、高效,且启动速度快。LXC中创建的为非特权容器,相较于特权容器,其有更高的安全性,更小的攻击面,同时便于管理和升级。下面介绍一下LXC的架构和基本上手操作指导。开源仓库:https://github.com/lxc/lxc官网:https://linuxcontainers.org/lxc/
2、LXC架构宿主机(Host OS):运行LXC命令和LXC用户空间的操作系统。LXC用户空间(Userspace):包括LXC库、配置文件和容器元数据等组件。LXC模板(Templates):用于创建容器的基础镜像。LXC命令(Commands):用于管理和操作LXC容器的命令工具。LXC库(Library):提供容器相关的API和函数库。LXC配置(Configs):用于配置和定制容器的参数和选项。LXC网络脚本(Net Scripts):用于管理容器的网络连接和配置。LXC工具(Tools):提供各种辅助工具和脚本,用于管理和维护LXC容器。LXC 容器(LXC Container):相互独立运行的轻量容器。LXC的核心功能是利用Linux内核提供的Namespace和Cgroups等机制来实现容器的隔离和虚拟化,从而使得容器可以独立运行和管理。同时,LXC还支持各种网络选项和安全特性,可以根据不同的应用场景进行定制和配置。
3、检查Linux Kernel容器的要求如下内核版本要求:Linux kernel >= 3.12依赖包要求:# to allow for capability drops
libcap
# to set a different apparmor profile for the container
libapparmor
# to set a different selinux context for the container
libselinux
# to set a seccomp policy for the container
libseccomp
# for various checksumming
libgnutls
# for the LUA binding
liblua
# for the python3 binding
python3-dev

 


http://www.ppmy.cn/news/1368626.html

相关文章

《TCP/IP详解 卷一》第9章 广播和组播

目录 9.1 引言 9.2 广播 9.2.1 使用广播地址 9.2.2 发送广播数据报 9.3 组播 9.3.1 将组播IP地址转换为组播MAC地址 9.3.2 例子 9.3.3 发送组播数据报 9.3.4 接收组播数据报 9.3.5 主机地址过滤 9.4 IGMP协议和MLD协议 9.4.1 组成员的IGMP和MLD处理 9.4.2 组播路由…

[计算机网络]--五种IO模型和select

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、五种IO…

web开发:如何用Echarts来自动给网页设计各种统计图

很多时候web开发也会需要用到统计图,如果单纯靠我们自己那点拙劣的css和js水平设计的话,又耗时间又做得跟史一样,这时候就需要引入别人设计师为我们设计好的动态统计图——echarts Echarts的官网是:Apache ECharts 1、第一步&…

Doris实战——拈花云科的数据中台实践

目录 前言 一、业务背景 二、数据中台1.0—Lambda 三、新架构的设计目标 四、数据中台2.0—Apache Doris 4.1 新架构数据流转 4.2 新架构收益 五、新架构的落地实践 5.1 模型选择 5.1.1 Unique模型 5.1.2 Aggregate模型 5.2 资源管理 5.3 批量建表 5.4 计算实现…

项目准备March

Nginx主要用来作为Http服务器,要实现Tomcat的负载均衡,就可以通过Nginx来实现。 正向代理代理的是客户端,反向代理代理的是服务端。SpringBoot采用约定优于配置的思想,简化Spring项目的配置开发。 前端请求其实并未直接发送到后…

鉴源论坛 · 观辙丨TLS协议基本原理与Wireshark分析

作者 | 苏少博 上海控安可信软件创新研究院汽车网络安全组 来源 | 鉴源实验室 社群 | 添加微信号“TICPShanghai”加入“上海控安51fusa安全社区” 01 背 景 随着车联网的迅猛发展,汽车已经不再是传统的机械交通工具,而是智能化、互联化的移动终端。然…

递归回溯剪枝-括号生成

LCR 085. 括号生成 - 力扣(LeetCode) 一. 根据题意,分析出符合要求的括号组合需要满足以下两个条件: 1. 左括号数或者右括号数都不能超过 n; 2. 从最左侧开始的每一个子集,不可以出现右括号数大于左括号数&…

【Hudi】核心概念

https://www.bilibili.com/video/BV1ue4y1i7na?p17&vd_sourcefa36a95b3c3fa4f32dd400f8cabddeaf 大数据新风口:Hudi数据湖(尚硅谷&Apache Hudi联合出品) 1 基础概念 1.1 时间轴(TimeLine) 1.2 文件布局(File Layout) 1.3 索引(In…