百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 优雅编程 > 正文

Linux容器的幕后(linux容器技术原理)

sinye56 2024-10-03 00:35 10 浏览 0 评论

在不使用Docker的情况下你能拥有Linux容器么?是的,你可以。在Docker使容器成为家喻户晓的术语之前,LXC项目提出了运行一种虚拟操作系统的概念,该操作系统共享同一内核,但是包含在定义的进程组中。

Docker建立在LXC之上,如今有许多直接或间接利用LXC工作的平台。这些平台使创建和维护容器变得非常简单,对于大型部署,使用这样的专门服务是有意义的。然而,并不是每个人都在管理大型部署或访问大型服务,以此来了解容器化。好消息是,你只要拥有一台运行Linux系统的PC,就能够创建、使用和学习容器。本文将通过查看LXC、它是如何工作的、为什么能够工作以及在出现问题时如何进行故障排除来帮助你了解容器。

如果你正在寻找LXC的快速入门指南,请参考https://linuxcontainers.org/lxc/getting-started/。

安装LXC

如果还没有安装,可以使用包管理器安装LXC。在Debian,Ubuntu和类似系统上,输入:

nbsp;sudo apt install lxc

创建网桥

大多数容器假定网络是可用的,并且大多数容器工具都希望用户能够创建虚拟网络设备。容器所需的最基本单元是网桥,它或多或少有点像一个网络交换机的软件。网络交换机有点像一个智能y适配器,它用来分离耳机接口,这样两个人就可以用不同的耳机听到相同的东西,只是网络交换机连接的不是音频信号,而是网络数据。

你可以创建自己的软件网桥,这样你的主机计算机和容器OS可以通过单个网络设备(以太网口或无线网卡)发送和接收不同的网络数据。这是一个重要的概念,因为无论你的部署规模如何,都不太可能让每一个运行的容器拥有一个专有的物理网卡。理解容器与虚拟网络设备通信是非常重要的,这样如果容器失去了网络连接,你就知道从哪里进行故障排查。

要在计算机上创建一个网桥,你必须有相应的权限。对于本文,使用sudo命令来获取root权限。(不过,LXC文档提供了一种配置,允许用户在不使用sudo的情况下进行此操作。)

$ sudo ip link add br0 type bridge

验证虚拟的网络接口是否已经创建成功

$ sudo ip addr show br0
7: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc
   noop state DOWN group default qlen 1000
   link/ether 26:fa:21:5f:cf:99 brd ff:ff:ff:ff:ff:ff

因为br0被视为网络接口,它需要有自己的IP地址。选择一个有效的本地IP,不与网路上的任何现有IP冲突,将其分配给br0设备。

$ sudo ip addr add 192.168.168.168/24 dev br0

最后,确保br0已经启动并运行:

$ sudo ip link set br0 up

设置容器配置

LXC容器的配置根据你的需要可以很复杂,但是对于本例,配置很简单。用你喜欢的文本编辑器创建一个文件,并为容器和网络所需的设置定义一个名称:

lxc.uts.name = dockman
lxc.net.0.type = veth
lxc.net.0.flags = up
lxc.net.0.link = br0
lxc.net.0.hwaddr = 4a:49:43:49:79:bd
lxc.net.0.ipv4.address = 192.168.168.167/24
lxc.net.0.ipv6.address = 2003:db8:1:0:214:1234:fe0b:3596
lxc.autodev=0

保存文件并将其命名为mycontainer.conf。lxc.uts.name是任意的,你可以随意调用你的容器;它是启动和停止时使用的名称。

网络类型设置为veth,这是一种虚拟以太网跳线。其思想是用veth将容器连接到桥接设备,该设备由lxc.net.0.link定义。容器的IP地址与桥接设备位于同一网络中,但是为了避免冲突,这个IP应该是唯一的。

除了veth网络类型和up网络标志之外,你可以在配置文件中设置所有的值。属性列表可以从man lxc.container.conf中获得。在/usr/share/doc/lxc/examples中有几个配置文件示例,你可以参考它们。

启动一个容器shell

至此,已经完成了三分之二的工作,你已经拥有了网络基础设施,并且已经在虚拟的PC上安装了虚拟网卡。现在你只需要安装一个操作系统。

但是,即使在这个阶段,你也可以通过在容器空间中启动shell来了解LXC的工作方式。

$ sudo lxc-execute --name basic \
--rcfile ~/mycontainer.conf /bin/bash \
--logfile mycontainer.log
#

查看网络地址信息:

# /usr/sbin/ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0@if27: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2003:db8:1:0:214:1234:fe0b:3596/60 scope global
       valid_lft forever preferred_lft foreverinet6 fe80::4849:43ff:fe49:79bd/64 scope linkvalid_lft forever preferred_lft forever

你的容器知道它的假网络设备和一个熟悉但独特但内核。

# uname -av
Linux dockman 4.15.0-76-generic #86-Ubuntu SMP Fri Jan 17 17:24:28 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

使用exit命令离开容器:

# exit

安装容器操作系统

构建完全容器化的环境要比网络和配置步骤复杂的多,可以借用LXC的容器模板。如果你没有任何模板,可以在软件仓库中寻找一个单独的LXC模板包。默认的LXC模版可以在目录/usr/share/lxc/templates中找到。

$ ls -m /usr/share/lxc/templates/
lxc-alpine, lxc-altlinux, lxc-archlinux, lxc-busybox, lxc-centos, lxc-cirros, lxc-debian, lxc-download, lxc-fedora, lxc-gentoo, lxc-openmandriva, lxc-opensuse, lxc-oracle, lxc-plamo, lxc-slackware, lxc-sparclinux, lxc-sshd, lxc-ubuntu, lxc-ubuntu-cloud

选择你喜欢的模版创建容器,本例使用lxc-ubuntu

$ sudo lxc-create --name lxc-ubuntu --template /usr/share/lxc/templates/lxc-ubuntu

观察正在执行的模版与从头构建一个模版一样有学习意义。它非常的详细,你可以看到lxc-create将容器的“root"设置为 /var/lib/lxc/lxc-ubuntu/rootfs,有几个包被下载并且安装在该目录下。

通过阅读模板文件可以使你更好地了解所涉及的内容:LXC设置了最小的设备树、常见的spool文件、文件系统表(fstab)、init文件等等。它还阻止启动容器中某些没有意义的服务(例如用于硬件检测的udev)。由于模版涵盖了大多数典型的Linux的配置,如果你打算设计自己的模版,明智的做法是将你的工作建立在最接近的模版上,否则的话你一定会犯一些遗漏错误,而这些错误LXC项目已经踩过坑了。

当安装好最小的操作系统环境后,就可以启动容器了。

nbsp;sudo lxc-start --name lxc-ubuntu --rcfile ~/mycontainer.conf

你已经启动了容器,但是你还没有附上它。(与前面的基本示例不同,这次不仅要运行shell,还要运行一个容器操作系统。)使用名字来附上它:

nbsp;sudo lxc-attach --name lxc-ubuntu

检查环境中的IP地址与配置文件中的是否一致:

# /usr/sbin/ip addr SHOW | grep eth
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 [...] 1000
link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0

退出容器并关闭它:

# exit
nbsp;sudo lxc-stop lxc-ubuntu

使用LXC运行真实的容器

在现实生活中,LXC使创建和运行安全可靠的容器变得很容易。自从2008年引入LXC以来,容器已经有了长足的进步,因此请充分利用它的专业知识。虽然linuxcontainers.org上的LXC说明简化了这个过程,但是这篇文章的内容应该可以帮助你理解容器幕后发生的事情。

相关推荐

程序员:JDK的安装与配置(完整版)_jdk的安装方法

对于Java程序员来说,jdk是必不陌生的一个词。但怎么安装配置jdk,对新手来说确实头疼的一件事情。我这里以jdk10为例,详细的说明讲解了jdk的安装和配置,如果有不明白的小伙伴可以评论区留言哦下...

Linux中安装jdk并配置环境变量_linux jdk安装教程及环境变量配置

一、通过连接工具登录到Linux(我这里使用的Centos7.6版本)服务器连接工具有很多我就不一一介绍了今天使用比较常用的XShell工具登录成功如下:二、上传jdk安装包到Linux服务器jdk...

麒麟系统安装JAVA JDK教程_麒麟系统配置jdk

检查检查系统是否自带java在麒麟系统桌面空白处,右键“在终端打开”,打开shell对话框输入:java–version查看是否自带java及版本如图所示,系统自带OpenJDK,要先卸载自带JDK...

学习笔记-Linux JDK - 安装&amp;配置

前提条件#检查是否存在JDKrpm-qa|grepjava#删除现存JDKyum-yremovejava*安装OracleJDK不分系统#进入安装文件目...

Linux新手入门系列:Linux下jdk安装配置

本系列文章是把作者刚接触和学习Linux时候的实操记录分享出来,内容主要包括Linux入门的一些理论概念知识、Web程序、mysql数据库的简单安装部署,希望能够帮到一些初学者,少走一些弯路。注意:L...

测试员必备:Linux下安装JDK 1.8你必须知道的那些事

1.简介在Oracle收购Sun后,Java的一系列产品就被整合到Oracle官网中,打开官网乍眼一看也不知道去哪里下载,还得一个一个的摸索尝试,而且网上大多数都是一些Oracle收购Sun前,或者就...

Linux 下安装JDK17_linux 安装jdk1.8 yum

一、安装环境操作系统:JDK版本:17二、安装步骤第一步:下载安装包下载Linux环境下的jdk1.8,请去官网(https://www.oracle.com/java/technologies/do...

在Ubuntu系统中安装JDK 17并配置环境变量教程

在Ubuntu系统上安装JDK17并配置环境变量是Java开发环境搭建的重要步骤。JDK17是Oracle提供的长期支持版本,广泛用于开发Java应用程序。以下是详细的步骤,帮助你在Ubuntu系...

如何在 Linux 上安装 Java_linux安装java的步骤

在桌面上拥抱Java应用程序,然后在所有桌面上运行它们。--SethKenlon(作者)无论你运行的是哪种操作系统,通常都有几种安装应用程序的方法。有时你可能会在应用程序商店中找到一个应用程序...

Windows和Linux环境下的JDK安装教程

JavaDevelopmentKit(简称JDK),是Java开发的核心工具包,提供了Java应用程序的编译、运行和开发所需的各类工具和类库。它包括了JRE(JavaRuntimeEnviro...

linux安装jdk_linux安装jdk软连接

JDK是啥就不用多介绍了哈,外行的人也不会进来看我的博文。依然记得读大学那会,第一次实验课就是在机房安装jdk,编写HelloWorld程序。时光飞逝啊,一下过了十多年了,挣了不少钱,买了跑车,娶了富...

linux安装jdk,全局配置,不同用户不同jdk

jdk1.8安装包链接:https://pan.baidu.com/s/14qBrh6ZpLK04QS8ogCepwg提取码:09zs上传文件解压tar-zxvfjdk-8u152-linux-...

运维大神教你在linux下安装jdk8_linux安装jdk1.7

1.到官网下载适合自己机器的版本。楼主下载的是jdk-8u66-linux-i586.tar.gzhttp://www.oracle.com/technetwork/java/javase/downl...

window和linux安装JDK1.8_linux 安装jdk1.8.tar

Windows安装JDK1.8的步骤:步骤1:下载JDK打开浏览器,找到JDK下载页面https://d.injdk.cn/download/oraclejdk/8在页面中找到并点击“下载...

最全的linux下安装JavaJDK的教程(图文详解)不会安装你来打我?

默认已经有了linux服务器,且有root账号首先检查一下是否已经安装过java的jdk任意位置输入命令:whichjava像我这个已经安装过了,就会提示在哪个位置,你的肯定是找不到。一般我们在...

取消回复欢迎 发表评论: