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

目录

1.LXC容器操作

安装LXC

LXC容器操作步骤

2.理论

[LXC 是什么?](#LXC 是什么?)

[Docker 是什么](#Docker 是什么)

[Docker 和虚拟机的区别](#Docker 和虚拟机的区别)

[Docker 和 JVM 虚拟化的区别](#Docker 和 JVM 虚拟化的区别)

[Docker 版本](#Docker 版本)

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

[Docker 架构](#Docker 架构)

生活案例

[Docker 生态](#Docker 生态)

[Docker 解决方案](#Docker 解决方案)

[3. Docker 安装](#3. Docker 安装)

[centos 安装](#centos 安装)

[ubuntu 安装](#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 # 确保服务已卸载

  2. 安装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 # 确保服务已卸载

  2. 配置源并安装LXC

    yum -y install epel-release
    yum -y install lxc lxc-templates bridge-utils lxc-libs libcgrouplib libvirt lxc-extra debootstrap

  3. 启动服务并检查

    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/

  1. 创建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
  1. 查看容器创建结果

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

  2. 列出容器信息

    lxc-ls -f

  3. 启动容器

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

  4. 查看容器详细信息

    lxc-info -n lxchost1

  5. 使用SSH进入容器

    ssh ubuntu@10.0.3.248

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

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

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

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

  8. 停止容器

    lxc-stop -n lxchost1

  9. 删除容器

    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 使用客户端-服务器 (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
  1. 安装必要的依赖包

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

sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
  1. 添加Docker的官方GPG密钥

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

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  1. 设置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
  1. 更新软件包索引

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

sudo apt update
  1. 安装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

运行:

成功啦

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

相关推荐
Hacker_Nightrain5 分钟前
linux 网络安全不完全笔记
linux·笔记·web安全
一入程序无退路9 分钟前
c语言传参数路径太长,导致无法获取参数
linux·c语言·数据库
上海运维Q先生11 分钟前
面试题整理19----Metric的几种类型?分别是什么?
运维·服务器·面试
打鱼又晒网19 分钟前
Linux网络 | 网络计算器客户端实现与Json的安装以及使用
linux·c++·网络协议·计算机网络
hao_wujing21 分钟前
现代网络负载均衡与代理导论
运维·网络·负载均衡
朝九晚五ฺ22 分钟前
【Linux探索学习】第二十三弹——理解文件系统:认识硬件、探索文件在硬件上的存储问题
linux·运维·学习
weixin_SAG23 分钟前
21天掌握javaweb-->第19天:Spring Boot后端优化与部署
java·spring boot·后端
匹马夕阳1 小时前
容器化平台Docker初识
运维·docker·容器
互联网资讯1 小时前
抖音生活服务商系统源码怎么搭建?
大数据·运维·人工智能·生活
-指短琴长-1 小时前
Linux从0到1——线程同步和互斥【互斥量/条件变量/信号量/PC模型】
linux·运维·服务器