Docker 使用原理流程

本文详细介绍了Docker如何利用Linux内核的LXC技术实现容器管理,包括容器的创建、资源隔离、网络配置和命令操作。Docker作为Golang开发的工具,简化了容器操作,提升了部署效率和环境一致性。
摘要由CSDN通过智能技术生成

# 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


 

  • 18
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值