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

[Docker#3] LXC | 详解安装docker | docker的架构与生态

目录

1.LXC容器操作

安装LXC

LXC容器操作步骤

2.理论

LXC 是什么?

Docker 是什么

Docker 和虚拟机的区别

Docker 和 JVM 虚拟化的区别

Docker 版本

⭕Docker 官方网站(建议收藏)

Docker 架构

生活案例

Docker 生态

Docker 解决方案

3. Docker 安装

centos 安装

ubuntu 安装


1.LXC容器操作

实战目的

  • 通过LXC学习容器的创建与管理,体会容器化技术的基本原理。
  • 了解Docker不是唯一的容器实现方式,Docker在0.9版本起引入了自家的libcontainer,而如今大部分Docker使用的都是libcontainer而非LXC。

基础知识

LXC的常用命令说明:

  • 检查系统支持性
lxc-checkconfig

用于检查系统是否支持LXC容器。

  • 创建容器
lxc-create -n NAME -t TEMPLATE_NAME [--template-options]

创建指定模板的容器。

  • 启动容器
lxc-start -n NAME -d

启动指定容器。

  • 列出容器
lxc-ls -f

列出所有容器,-f参数显示容器的详细信息。

  • 查看容器信息
lxc-info -n NAME

查询某个容器的运行状态及相关信息。

  • 进入容器
lxc-attach --name=NAME [--COMMAND]

在容器内执行命令。

  • 停止容器
lxc-stop -n NAME

停止容器运行。

  • 删除容器
lxc-destroy -n NAME

删除停止状态的容器。


安装LXC

Ubuntu安装LXC

  1. 检查及卸载(如需)
systemctl status lxc
lxc-stop -n xxx # 停止所有运行的容器
lxc-destroy -n xxx # 删除所有容器
apt-get purge --auto-remove lxc lxc-templates
systemctl status lxc # 确保服务已卸载
  1. 安装LXC
apt install lxc lxc-templates bridge-utils -y
systemctl status lxc # 检查服务是否正常

CentOS安装LXC

  1. 检查及卸载(如需)
systemctl status lxc
lxc-stop -n xxx
lxc-destroy -n xxx
yum remove lxc lxc-templates lxc-libs lxc-extra libvirt debootstrap
systemctl status lxc # 确保服务已卸载
  1. 配置源并安装LXC
yum -y install epel-release
yum -y install lxc lxc-templates bridge-utils lxc-libs libcgrouplib libvirt lxc-extra debootstrap
  1. 启动服务并检查
systemctl start lxc
systemctl start libvirtd
systemctl status lxc
systemctl status libvirtd

LXC容器操作步骤

1. 检查LXC服务运行状态

systemctl status lxc

2. 检查系统对容器支持情况

lxc-checkconfig

3. 查看可用的容器模板

ls /usr/share/lxc/templates/

4. 创建LXC容器

Ubuntu上创建Ubuntu容器

lxc-create -n lxchost1 -t ubuntu -- -r xenial -a amd64

Ubuntu上创建CentOS容器

lxc-create -n centos7 --template=download -- --dist=centos --release=7 --arch=amd64

5. 查看容器创建结果

ls /var/lib/lxc/<容器名>/
ls /var/cache/lxc/

6. 列出容器信息

lxc-ls -f

7. 启动容器

lxc-start -n lxchost1 -d
lxc-ls -f

8. 查看容器详细信息

lxc-info -n lxchost1

9. 使用SSH进入容器

ssh ubuntu@10.0.3.248

10. 在容器中执行常用命令

ip addr # 查看网络信息
df -h # 查看磁盘挂载情况
ps -ef # 查看进程信息

11. 从宿主机向容器中发送命令

lxc-attach -n lxchost1 --clear-env -- echo "Hello LXC"

12. 停止容器

lxc-stop -n lxchost1

13. 删除容器

lxc-destroy -n lxchost1

了解从安装到创建、启动、管理和删除LXC容器的全过程,为进一步理解Docker等容器技术打下坚实基础。

补充:

nano 操作快速参考

保存并退出:Ctrl + O,然后按 Enter,接着按 Ctrl + X


2.理论

LXC 是什么?
  • LXC(LinuX Containers)是一种操作系统层虚拟化技术,为 Linux 内核容器功能的一个用户空间接口。
  • 它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。
  • 透过统一的名字空间和共享 API 来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得 Linux 用户可以容易地创建和管理系统或应用容器。

尽管 LXC 极大地简化了容器技术的使用,但比起直接通过内核调用来使用容器技术,其复杂程度其实并没有多大降低,因为我们必须要学会 LXC 的一组命令工具,且由于内核的创建都是通过命令来实现的,通过批量命令实现数据迁移并不容易。

其隔离性也没有虚拟机那么强大。后来就出现了 Docker,所以从一定程度上来说,Docker 就是 LXC 的增强版。

Docker 是什么
  • Docker 本质其实是 LXC 之类的增强版,它本身不是容器,而是容器的易用工具。
  • 容器是 Linux 内核中的技术,Docker 只是把这种技术在使用上简易普及了。Docker 在早期的版本其核心就是 LXC 的二次封装发行版。
  • Docker 作为容器技术的一个实现,或者说让容器技术普及开来的最成功的实现。
  • Docker 是基于 Go 语言实现的一个开源项目,它的主要目标是“Build,Ship and Run Any APP,Anywhere”,即通过对组件的封装、分发、部署、运行等生命周期的管理,使得用户的应用及其运行环境能够做到一次封装,到处运行”。
  • 早期 Docker 利用 LXC 做容器管理引擎,但在创建容器时,不再使用模板去安装生成,而是通过镜像技术(把一个操作系统用户空间所需要使用到的组件事先编排好,并整体打包成一个文件,image 文件),镜像文件集中放在一个仓库中
  • 当需要创建容器时,Docker 调用 LXC 的工具 lxc-create,但不再通过 lxc 的模板去安装,而是连接到镜像服务器上下载匹配的镜像文件,而后基于镜像启动容器。
  • 所以,Docker 极大地简化了容器的使用难度。以后我们创建启动容器,只需要一个命令,docker-run,docker-stop 就可以启动停止一个容器了。

Docker 的引擎迭代

  • Docker 早期是基于 LXC 容器管理引擎实现。
  • 当后来成熟之后,Docker 自建了一个容器引擎叫 libcontainer。
  • 后来 CNCF 的介入,Docker 又研发了一个工业化标准的容器引擎 runC。
  • 目前所使用的新版 Docker,所使用的容器引擎就是 RunC。
Docker 和虚拟机的区别

特性

传统虚拟机

Docker 容器

磁盘占用

几个 GB 到几十个 GB 左右

几十 MB 到几百 MB 左右

CPU 内存占用

虚拟操作系统非常占用 CPU 和内存,需要通过虚拟层调用占用率高

Docker 引擎占用资源极低,直接作用于硬件资源占用少

启动速度

(从开机到运行项目)几分钟

(从开启容器到运行项目)几秒

安装管理

需要专门的运维技术

安装、管理方便

应用部署

手动部署,速度慢

体系化部署,可以自动化,速度快

隔离性

系统级别

进程级别

封装程度

打包整个操作系统

打包项目代码和依赖信息

Docker 为什么比虚拟机资源 利用率高,启动快,耦合低

  • Docker 有比虚拟机更少的抽象层。Docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 Docker 容器上的程序直接使用的是实际物理机的硬件资源。因此在 CPU、内存利用率上 Docker 将会在效率上有明显的优势。Docker 利用的是宿主机的内核,而不需要 Guest OS,节省了 Guest OS 占用的资源。
  • Docker 不需要 Guest OS,创建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程,当新建一个虚拟机时,虚拟机软件需要加载 Guest OS,返回新建过程是分钟级别的。而新建一个 Docker 容器只需要几秒钟。
Docker 和 JVM 虚拟化的区别

特性

JVM

Docker 容器

性能

Jvm 需要占用一定的 CPU 和内存

基本没有损失

虚拟层面

基于 JVM 虚拟机,更加上层

基于操作系统,更加通用

代码无关性

一个特定代码的执行平台,它是运行时才存在的,只能支撑特定代码的执行,并且必须是在 jvm 进程内

模拟了一整个操作系统,它是静态存在的,可以支撑任何代码,相同平台的应用程序

主机隔离性

jvm 不隔离主机

通过命名空间实现隔离

Docker 版本

Docker 发展过程中衍生了以下版本,目前我们学习和使用提到的版本是 docker-ce。

  • lxc:上文中提到,lxc 是最早的 linux 容器技术,早期版本的 docker 直接使用 lxc 来实现容器的底层功能。虽然使用者相对较少,但 lxc 项目仍在持续开发演进中。
  • libcontainer:docker 从 0.9 版本开始自行开发了 libcontainer 模块来作为 lxc 的替代品实现容器底层特性,并在 1.10 版本彻底去除了 lxc。在 1.11 版本拆分出 runc 后,libcontainer 也随之成为了 runc 的核心功能模块,runc 后续变成了容器标准。
  • moby:moby 是 docker 公司发起的开源项目,其中最主要的部分就是同名组件 moby,事实上这个 moby 就是 dockerd 目前使用的开源项目名称,docker 项目中的 engine(dockerd)仓库现在就是从 moby 仓库 fork 而来的,使用 containerd 作为运行时标准。Moby
  • docker-ce:docker 的开源版本,CE 指 Community Edition。docker-ce 中的组件来自于 moby、containerd 等其他项目。Pricing | Docker
  • docker-ee:docker 的收费版本,EE 指 Enterprise Edition。其基础组件来源和 docker-ce 是一样的,但附加了一些其他的组件和功能。Pricing | Docker
⭕Docker 官方网站(建议收藏)
  • Docker 官网:Docker: Accelerated Container Application Development
  • 我们可以查看官方文档来进行学习
  • 后续我们会学到 客户端的 20 多条 常见的命令

Docker 架构

Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。Docker 容器通过 Docker 镜像来创建。

下面是对官网上的一张图的理解

  • Docker 仓库(Registry):Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub 供了庞大的镜像集合供使用。
  • Docker daemon:Docker daemon 是服务器组件,是 Docker 最核心的后台进程,我们也把它称为守护进程。
  • Docker 客户端(Client):Docker 客户端通过命令行或者其他工具使用 Docker API 与 Docker 的守护进程通信。
  • Docker 主机(Host):一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。
  • Docker 镜像(Images):Docker 镜像是用于创建 Docker 容器的模板。
  • Docker 容器(Container):容器是独立运行的一个或一组应用。
生活案例

上面概念比较难以理解,我们列举个生活中的案例,以一家人去旅游入住酒店为例。

  • 我们一家人和朋友一块旅游去酒店,我们就是 Docker Client。
  • 到酒店办理入住,办理退房,缴费需要酒店前台提供各种服务,酒店前台就是我们的 Docker Daemon,Docker 的核心服务端。
  • 酒店是建在美丽的海边,酒店的宅基地和大楼就是我们实际的物理服务器或者虚拟服务器,也就是 Docker Host。
  • 酒店就 1000 多个房间,每个房间里面不一样,有标间、大床房、家庭房等,这就是 Docker 镜像仓库。
  • 酒店的标准的房间豪华大床房和双人标间,这个就是 Docker 镜像,我们客户是没有办法修改的。
  • 我们办理完入住了一个豪华大床房,然后把行李,个人物品带到了一个具体的房间号,比如 9527,那么这个房间我们可以使用了,朋友也开了一间豪华大床房,虽然豪华大床房一样,但是我们携带的物品都不一样,这个就是容器 Docker Container。
  • 容器的销毁,也就是我们一周后旅游结束了,搬出了酒店,酒店把我们的房间恢复了镜像原来的样子。
Docker 生态

新时代软件诉求

我们来考虑 2 个问题,Docker 为什么要设计镜像,然后又搭建个 Docker Hub,搞个镜像仓库呢?我们来看下现在的时代发生了什么。

1. 数据量疯狂增长

  • 随着物联网、边缘计算等智能终端设备不断普及,受到来自物联网设备信号、元数据、娱乐相关数据、云计算和边缘计算的数据增长的驱动,全球数据量呈现加速增长。根据 IDC 分布的《数据时代 2025》预测,全球数据量将从 2018 年的 33ZB 增至 2025 年的 175ZB,增长超过 5 倍;中国平均增速快于全球 3%,预计到 2025 年将增至 48.6ZB,占全球数据圈的比例由 23.4%提升至 27.8%。其中,中国企业级数据量将从 2015 年占中国数据量的 49%增长到 2025 年的 69%。

2. 处理能力快速增加

  • 腾讯云全球服务器数量 100w+,数据量 EB+;2020 年阿里云:在全国已建成 5 大超级数据中心,阿里云在全球 22 个地域部署了上百个数据中心,服务器的总规模数已经接近 200 万台。
  • 某省疾控中心疫苗预约系统、全员核酸检测系统、健康码系统共 300 余台服务器,并为核酸检测系统快速扩容计算和存储资源。

(重申 云 的概念:就像水和电一样的一种资源,但是不用了又可以归还)

3. 软件需求爆发式增长

软件发布频繁

  • 研发模式从瀑布开发演变为敏捷开发,原来 3 个月上一次新功能,现在两周一次,而开发过程中我们也经常遇到需要修改需求,然后变更再发布的情况。
  • 软件上线有问题需要快速回滚,对软件有着极强的版本管理和回滚诉求

软件需要共享

  • 软件的研发人员、研发公司在设计、研发好一款软件的时候,如何方便地共享给他人,而又能快速地使用起来

环境搭建复杂,技术种类繁多

  • 每个项目组使用的语言不一样,需要不同的环境,每个都得搞一套。每次都要从 yum 开始一个个完成部署安装,每次都有各种奇怪的问题,运维成本很高。

Docker 解决方案

云时代需要我们针对这些诉求有一套针对性的解决方案。

我们要处理海量的数据,如何处理呢?

  • 购买大量的服务器,并研发对应软件。

开发的需求需要频繁的变更上线,如何才能将修改的代码快速地分发到几百或者几千台服务器呢?如何共享软件呢?

  • 搞一个中心仓库,让各个服务器去下载软件包,安装,所以 CentOS 搞了 yum 仓库,docker 设计了镜像仓库,docker hub 是公共的托管仓库。

软件设计好以后,怎么快速安装启动,有问题回滚呢?

  • 将 docker 需要的所有信息设计一套软件格式,把所有的依赖搞进去,并打上版本标签,这样不会换一个服务器各种问题,所以 Docker 设计了镜像,根据版本标签就可以实现回滚了

不同的开发环境怎么搭建呢,一会 java,一会 c++?

  • docker 设计了镜像来应对,镜像里面存放了需要运行的环境,就像我们的 iPhone 内置 ios,我们的华为 mate 50 内置鸿蒙一样,一条命令就可以完成某个环境的搭建。

前置了解:

  • X86 高并发:基于 x86 架构的处理器,在高负载下处理大量并发请求的能力。
  • ARM :使用 ARM 架构处理器的移动设备,具有低功耗和高性能的特点。

操作系统:

  • CentOS:基于 Red Hat Enterprise Linux 的免费开源操作系统,适合企业级应用和服务器。
  • Ubuntu:基于 Debian 的免费开源操作系统,用户友好,广泛应用于个人电脑、服务器和云计算平台。

3. Docker 安装

下面我们来快速安装一下 Docker,对 Docker 有个初步的认识和了解。

各版本平台支持情况

•Server 版本

•桌面版本

centos 安装

安装依赖

支持的操作系统

  • CentOS 7
    CentOS 8 (stream)
    CentOS 9 (stream)

支持的 CPU

  • ARM/X86_64

安装 Docker

1. 确认操作系统

2.确认 CPU 架构

3.卸载旧版本

4.安装 docker

查看

借助工具包

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

配置使用国内源

sed -i 's@//download.docker.com@//mirrors.ustc.edu.cn/docker-ce@g' /etc/yum.repos.d/docker-ce.repo

  • 安装

因为centos的yum源,很多都用不了了,是在不行,就更换ubuntu系统了

最后的尝试:

curl -sLf https://gitee.com/lpsdz-ybhdsg-jk/yum-source-update/raw/master/install.sh -o ./install.sh && bash ./install.sh

ubuntu 安装

检测:

1.确定 CPU,可以看到我们的是 X86_64,是支持的,如果是 arm 一般会显示 aarch64

2.确定操作系统版本

3.卸载旧版本,如果是新购买的云服务器是没有的,比如输入 docker 并没有这个命 令,就不需要卸载

4.卸载历史版本

安装指南:

1. 更新软件包索引

首先,确保您的系统软件包索引是最新的:

sudo apt update

2. 安装必要的依赖包

安装一些必要的依赖包,以便能够通过HTTPS使用APT:

sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release

3. 添加Docker的官方GPG密钥

下载并添加Docker的官方GPG密钥:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

4. 设置Docker的稳定版仓库

设置Docker的稳定版仓库:

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

5. 更新软件包索引

再次更新软件包索引以包含Docker仓库的信息:

sudo apt update

6. 安装Docker Engine

安装Docker Engine:

sudo apt install -y docker-ce docker-ce-cli containerd.io

7.自动启动配置

#配置加载 
sudo systemctl daemon-reload 
#启动服务 
sudo systemctl start docker 
#开启启动 
sudo systemctl enable docker 
#查看服务状态 
sudo systemctl status docker 

8.检查安装结果查看版本

更详细可以:docker info查看

9.执行 hello-world 可以看到 Hello from Docker,表面 docker 服务正常

如果出现了如下报错

解决:

vi /etc/docker/daemon.json 
{
        "registry-mirrors": [
                "https://docker.m.daocloud.io",
                "https://dockerhub.timeweb.cloud",
                "https://huecker.io"
  ]
}
#文件内容输入后
sudo systemctl daemon-reload
sudo systemctl restart docker

运行:

成功啦

配环境心得:要相信自己一定能配好,遇见问题就高效的搜索解决方案,这没什么~


http://www.kler.cn/a/392417.html

相关文章:

  • quartz
  • 计算机网络(3)网络拓扑和IP地址,MAC地址,端口地址详解
  • 力扣515:在每个树行中找最大值
  • Flutter Getx状态管理
  • 车载空气净化器语音芯片方案
  • 不对称信息
  • Three.js 纹理与网格的优化
  • Linux将二进制软件包编译成rpm软件包教程详解
  • unity3d————四元数的计算
  • 【每日推荐】使用 Ollama 平台上的 Llama 3.2-vision 模型进行视频目标检测
  • 【PGCCC】Postgresql Toast 原理
  • Maven 构建项目
  • qt creator开发一个Linux 下运行的无界面的程序
  • 力扣617:合并二叉树
  • Cesium基础-(Entity)-(label )
  • 如何快速开发一套MES系统?
  • SpringBoot(八)使用AES库对字符串进行加密解密
  • 每日计划-1109
  • Git - 日志
  • Python+Appium编写脚本
  • TCP(上):成熟可靠的传输层协议
  • MySQL中指定字段的某个值排在前面
  • PET-文件包含-FINISHED
  • LeetCode每日一题1547---切棍子的最小成本
  • [Docker#6] 镜像 | 常用命令 | 迁移镜像 | 压缩与共享
  • ElegantRL:高效、稳定的深度强化学习开源框架