分类 技术 下的文章

你所需了解的容器如何工作的知识。

现在人们严重过度使用了“容器”这个术语。另外,对不同的人来说,它可能会有不同的含义,这取决于上下文。

传统的 Linux 容器只是系统上普通的进程。一组进程与另外一组进程是相互隔离的,实现方法包括:资源限制(控制组 [cgoups])、Linux 安全限制(文件权限,基于 Capability 的安全模块、SELinux、AppArmor、seccomp 等)还有名字空间(进程 ID、网络、挂载等)。

如果你启动一台现代 Linux 操作系统,使用 cat /proc/PID/cgroup 命令就可以看到该进程是属于一个控制组的。还可以从 /proc/PID/status 文件中查看进程的 Capability 信息,从 /proc/self/attr/current 文件中查看进程的 SELinux 标签信息,从 /proc/PID/ns 目录下的文件查看进程所属的名字空间。因此,如果把容器定义为带有资源限制、Linux 安全限制和名字空间的进程,那么按照这个定义,Linux 操作系统上的每一个进程都在一个容器里。因此我们常说 Linux 就是容器,容器就是 Linux。而容器运行时是这样一种工具,它调整上述资源限制、安全限制和名字空间,并启动容器。

Docker 引入了容器镜像的概念,镜像是一个普通的 TAR 包文件,包含了:

  • rootfs(容器的根文件系统):一个目录,看起来像是操作系统的普通根目录(/),例如,一个包含 /usr, /var, /home 等的目录。
  • JSON 文件(容器的配置):定义了如何运行 rootfs;例如,当容器启动的时候要在 rootfs 里运行什么命令(CMD)或者入口(ENTRYPOINT),给容器定义什么样的环境变量(ENV),容器的工作目录(WORKDIR)是哪个,以及其他一些设置。

Docker 把 rootfs 和 JSON 配置文件打包成基础镜像。你可以在这个基础之上,给 rootfs 安装更多东西,创建新的 JSON 配置文件,然后把相对于原始镜像的不同内容打包到新的镜像。这种方法创建出来的是分层的镜像

开放容器计划 Open Container Initiative (OCI)标准组织最终把容器镜像的格式标准化了,也就是 镜像规范 OCI Image Specification (OCI)。

用来创建容器镜像的工具被称为容器镜像构建器。有时候容器引擎做这件事情,不过可以用一些独立的工具来构建容器镜像。

Docker 把这些容器镜像(tar 包)托管到 web 服务中,并开发了一种协议来支持从 web 拉取镜像,这个 web 服务就叫 容器仓库 container registry

容器引擎是能从镜像仓库拉取镜像并装载到容器存储上的程序。容器引擎还能启动容器运行时(见下图)。

容器存储一般是 写入时复制 copy-on-write (COW)的分层文件系统。从容器仓库拉取一个镜像时,其中的 rootfs 首先被解压到磁盘。如果这个镜像是多层的,那么每一层都会被下载到 COW 文件系统的不同分层。 COW 文件系统保证了镜像的每一层独立存储,这最大化了多个分层镜像之间的文件共享程度。容器引擎通常支持多种容器存储类型,包括 overlaydevicemapperbtrfsaufszfs

容器引擎将容器镜像下载到容器存储中之后,需要创建一份容器运行时配置,这份配置是用户/调用者的输入和镜像配置的合并。例如,容器的调用者可能会调整安全设置,添加额外的环境变量或者挂载一些卷到容器中。

容器运行时配置的格式,和解压出来的 rootfs 也都被开放容器计划 OCI 标准组织做了标准化,称为 OCI 运行时规范

最终,容器引擎启动了一个容器运行时来读取运行时配置,修改 Linux 控制组、安全限制和名字空间,并执行容器命令来创建容器的 PID 1 进程。至此,容器引擎已经可以把容器的标准输入/标准输出转给调用方,并控制容器了(例如,stopstartattach)。

值得一提的是,现在出现了很多新的容器运行时,它们使用 Linux 的不同特性来隔离容器。可以使用 KVM 技术来隔离容器(想想迷你虚拟机),或者使用其他虚拟机监视器策略(例如拦截所有从容器内的进程发起的系统调用)。既然我们有了标准的运行时规范,这些工具都能被相同的容器引擎来启动。即使在 Windows 系统下,也可以使用 OCI 运行时规范来启动 Windows 容器。

容器编排器是一个更高层次的概念。它是在多个不同的节点上协调容器执行的工具。容器编排工具通过和容器引擎的通信来管理容器。编排器控制容器引擎做容器的启动和容器间的网络连接,它能够监控容器,在负载变高的时候进行容器扩容。


via: https://opensource.com/article/18/8/sysadmins-guide-containers

作者:Daniel J Walsh 选题:lujun9972 译者:belitex 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在过去的几个月里,我一直在使用 React 和 React-Native。我已经发布了两个作为产品的应用, Kiven Aa(React)和 Pollen Chat(React Native)。当我开始学习 React 时,我找了一些不仅仅是教我如何用 React 写应用的东西(一个博客,一个视频,一个课程,等等),我也想让它帮我做好面试准备。

我发现的大部分资料都集中在某一单一方面上。所以,这篇文章针对的是那些希望理论与实践完美结合的观众。我会告诉你一些理论,以便你了解幕后发生的事情,然后我会向你展示如何编写一些 React.js 代码。

如果你更喜欢视频形式,我在 YouTube 上传了整个课程,请去看看。

让我们开始……

React.js 是一个用于构建用户界面的 JavaScript 库

你可以构建各种单页应用程序。例如,你希望在用户界面上实时显示变化的聊天软件和电子商务门户。

一切都是组件

React 应用由组件组成,数量繁多且互相嵌套。你或许会问:”可什么是组件呢?“

组件是可重用的代码段,它定义了某些功能在 UI 上的外观和行为。 比如,按钮就是一个组件。

让我们看看下面的计算器,当你尝试计算 2 + 2 = 4 -1 = 3(简单的数学题)时,你会在 Google 上看到这个计算器。

红色标记表示组件

如上图所示,这个计算器有很多区域,比如展示窗口和数字键盘。所有这些都可以是许多单独的组件或一个巨大的组件。这取决于在 React 中分解和抽象出事物的程度。你为所有这些组件分别编写代码,然后合并这些组件到一个容器中,而这个容器又是一个 React 组件。这样你就可以创建可重用的组件,最终的应用将是一组协同工作的单独组件。

以下是一个你践行了以上原则并可以用 React 编写计算器的方法。

<Calculator>
  <DisplayWindow />
  <NumPad>
    <Key number={1}/>
    <Key number={2}/>
    .
    .
    .
    <Key number={9}/>
  </NumPad>
</Calculator>

没错!它看起来像HTML代码,然而并不是。我们将在后面的部分中详细探讨它。

设置我们的 Playground

这篇教程专注于 React 的基础部分。它没有偏向 Web 或 React Native(开发移动应用)。所以,我们会用一个在线编辑器,这样可以在学习 React 能做什么之前避免 web 或 native 的具体配置。

我已经为读者在 codepen.io 设置好了开发环境。只需点开该链接并且阅读 HTML 和 JavaScript 中的所有注释。

控制组件

我们已经了解到 React 应用是各种组件的集合,结构为嵌套树。因此,我们需要某种机制来将数据从一个组件传递到另一个组件。

进入 “props”

我们可以使用 props 对象将任意数据传递给我们的组件。 React 中的每个组件都会获取 props 对象。在学习如何使用 props 之前,让我们学习函数式组件。

a) 函数式组件

在 React 中,一个函数式组件通过 props 对象使用你传递给它的任意数据。它返回一个对象,该对象描述了 React 应渲染的 UI。函数式组件也称为无状态组件。

让我们编写第一个函数式组件。

function Hello(props) {
  return <div>{props.name}</div>
}

就这么简单。我们只是将 props 作为参数传递给了一个普通的 JavaScript 函数并且有返回值。嗯?返回了什么?那个 <div>{props.name}</div>。它是 JSX(JavaScript Extended)。我们将在后面的部分中详细了解它。

上面这个函数将在浏览器中渲染出以下 HTML。

<!-- If the "props" object is: {name: 'rajat'} -->
<div>
  rajat
</div>
阅读以下有关 JSX 的部分,这一部分解释了如何从我们的 JSX 代码中得到这段 HTML 。

如何在 React 应用中使用这个函数式组件? 很高兴你问了! 它就像下面这么简单。

<Hello name='rajat' age={26}/>

属性 name 在上面的代码中变成了 Hello 组件里的 props.name ,属性 age 变成了 props.age

记住! 你可以将一个 React 组件嵌套在其他 React 组件中。

让我们在 codepen playground 使用 Hello 组件。用我们的 Hello 组件替换 ReactDOM.render() 中的 div,并在底部窗口中查看更改。

function Hello(props) {
  return <div>{props.name}</div>
}

ReactDOM.render(<Hello name="rajat"/>, document.getElementById('root'));
但是如果你的组件有一些内部状态怎么办?例如,像下面的计数器组件一样,它有一个内部计数变量,它在 +- 键按下时发生变化。

具有内部状态的 React 组件

b) 基于类的组件

基于类的组件有一个额外属性 state ,你可以用它存放组件的私有数据。我们可以用 class 表示法重写我们的 Hello 。由于这些组件具有状态,因此这些组件也称为有状态组件。

class Counter extends React.Component {
  // this method should be present in your component
  render() {
    return (
      <div>
        {this.props.name}
      </div>
    );
  }
}

我们继承了 React 库的 React.Component 类以在 React 中创建基于类的组件。在这里了解更多有关 JavaScript 类的东西。

render() 方法必须存在于你的类中,因为 React 会查找此方法,用以了解它应在屏幕上渲染的 UI。为了使用这种内部状态,我们首先要在组件

要使用这种内部状态,我们首先必须按以下方式初始化组件类的构造函数中的状态对象。

class Counter extends React.Component {
  constructor() {
    super();
    
    // define the internal state of the component
    this.state = {name: 'rajat'}
  }
  
  render() {
    return (
      <div>
        {this.state.name}
      </div>
    );
  }
}

// Usage:
// In your react app: <Counter />

类似地,可以使用 this.props 对象在我们基于类的组件内访问 props

要设置 state,请使用 React.ComponentsetState()。 在本教程的最后一部分中,我们将看到一个这样的例子。

提示:永远不要在 render() 函数中调用 setState(),因为 setState 会导致组件重新渲染,这将导致无限循环。

基于类的组件具有可选属性 “state”。

除了 state 以外,基于类的组件有一些声明周期方法比如 componentWillMount()。你可以利用这些去做初始化 state这样的事, 可是那将超出这篇文章的范畴。

JSX

JSX 是 JavaScript Extended 的缩写,它是一种编写 React 组件的方法。使用 JSX,你可以在类 XML 标签中获得 JavaScript 的全部力量。

你把 JavaScript 表达式放在 {} 里。下面是一些有效的 JSX 例子。

 <button disabled={true}>Press me!</button>
 <button disabled={true}>Press me {3+1} times!</button>;
 <div className='container'><Hello /></div>

它的工作方式是你编写 JSX 来描述你的 UI 应该是什么样子。像 Babel 这样的转码器将这些代码转换为一堆 React.createElement() 调用。然后,React 库使用这些 React.createElement() 调用来构造 DOM 元素的树状结构。对于 React 的网页视图或 React Native 的 Native 视图,它将保存在内存中。

React 接着会计算它如何在展示给用户的 UI 的内存中有效地模仿这个树。此过程称为 reconciliation。完成计算后,React 会对屏幕上的真正 UI 进行更改。

React 如何将你的 JSX 转化为描述应用 UI 的树。

你可以使用 Babel 的在线 REPL 查看当你写一些 JSX 的时候,React 的真正输出。

使用Babel REPL 转换 JSX 为普通 JavaScript

由于 JSX 只是 React.createElement() 调用的语法糖,因此可以在没有 JSX 的情况下使用 React。

现在我们了解了所有的概念,所以我们已经准备好编写我们之前看到之前的 GIF 图中的计数器组件。

代码如下,我希望你已经知道了如何在我们的 playground 上渲染它。

class Counter extends React.Component {
  constructor(props) {
    super(props);
    
    this.state = {count: this.props.start || 0}
    
    // the following bindings are necessary to make `this` work in the callback
    this.inc = this.inc.bind(this);
    this.dec = this.dec.bind(this);
  }
  
  inc() {
    this.setState({
      count: this.state.count + 1
    });
  }
  
  dec() {
    this.setState({
      count: this.state.count - 1
    });
  }
  
  render() {
    return (
      <div>
        <button onClick={this.inc}>+</button>
        <button onClick={this.dec}>-</button>
        <div>{this.state.count}</div>
      </div>
    );
  }
}

以下是关于上述代码的一些重点。

  1. JSX 使用 驼峰命名 ,所以 button 的 属性是 onClick,不是我们在HTML中用的 onclick
  2. 绑定 this 是必要的,以便在回调时工作。 请参阅上面代码中的第8行和第9行。

最终的交互式代码位于此处

有了这个,我们已经到了 React 速成课程的结束。我希望我已经阐明了 React 如何工作,以及如何使用 React 来构建更大的应用程序,使用更小和可重用的组件。


via: https://medium.freecodecamp.org/rock-solid-react-js-foundations-a-beginners-guide-c45c93f5a923

作者:Rajat Saxena 译者:GraveAccent 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这些最有用的命令可以让你了解安装在你的 Debian 类的 Linux 系统上的包的情况。

你有没有想过你的 Linux 系统上安装了几千个软件包? 是的,我说的是“千”。 即使是相当一般的 Linux 系统也可能安装了上千个软件包。 有很多方法可以获得这些包到底是什么包的详细信息。

首先,要在基于 Debian 的发行版(如 Ubuntu)上快速得到已安装的软件包数量,请使用 apt list --installed, 如下:

$ apt list --installed | wc -l
2067

这个数字实际上多了一个,因为输出中包含了 “Listing …” 作为它的第一行。 这个命令会更准确:

$ apt list --installed | grep -v "^Listing" | wc -l
2066

要获得所有这些包的详细信息,请按以下方式浏览列表:

$ apt list --installed | more
Listing...
a11y-profile-manager-indicator/xenial,now 0.1.10-0ubuntu3 amd64 [installed]
account-plugin-aim/xenial,now 3.12.11-0ubuntu3 amd64 [installed]
account-plugin-facebook/xenial,xenial,now 0.12+16.04.20160126-0ubuntu1 all [installed]
account-plugin-flickr/xenial,xenial,now 0.12+16.04.20160126-0ubuntu1 all [installed]
account-plugin-google/xenial,xenial,now 0.12+16.04.20160126-0ubuntu1 all [installed]
account-plugin-jabber/xenial,now 3.12.11-0ubuntu3 amd64 [installed]
account-plugin-salut/xenial,now 3.12.11-0ubuntu3 amd64 [installed]

这需要观察很多细节 —— 特别是让你的眼睛在所有 2000 多个文件中徘徊。 它包含包名称、版本等,以及更多但并不是以最易于我们人类解析的显示信息。 dpkg-query 使得描述更容易理解,但这些描述会塞满你的命令窗口,除非窗口非常宽。 因此,为了让此篇文章更容易阅读,下面的数据显示已经分成了左右两侧。

左侧:

$ dpkg-query -l | more
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                                                 Version                                      
+++-==============================================-=================================-
ii  a11y-profile-manager-indicator                 0.1.10-0ubuntu3                              
ii  account-plugin-aim                             3.12.11-0ubuntu3                             
ii  account-plugin-facebook                        0.12+16.04.20160126-0ubuntu1                 
ii  account-plugin-flickr                          0.12+16.04.20160126-0ubuntu1                 
ii  account-plugin-google                          0.12+16.04.20160126-0ubuntu1                 
ii  account-plugin-jabber                          3.12.11-0ubuntu3                             
ii  account-plugin-salut                           3.12.11-0ubuntu3                             
ii  account-plugin-twitter                         0.12+16.04.20160126-0ubuntu1                 
rc  account-plugin-windows-live                    0.11+14.04.20140409.1-0ubuntu2               

右侧:

Architecture Description
============-=====================================================================
amd64        Accessibility Profile Manager - Unity desktop indicator
amd64        Messaging account plugin for AIM
all          GNOME Control Center account plugin for single signon - facebook
all          GNOME Control Center account plugin for single signon - flickr
all          GNOME Control Center account plugin for single signon
amd64        Messaging account plugin for Jabber/XMPP
amd64        Messaging account plugin for Local XMPP (Salut)
all          GNOME Control Center account plugin for single signon - twitter
all          GNOME Control Center account plugin for single signon - windows live

每行开头的 iirc 名称(见上文“左侧”)是包状态指示符。 第一个字母表示包的预期状态:

  • u – 未知
  • i – 安装
  • r – 移除/反安装
  • p – 清除(也包括配置文件)
  • h – 保留

第二个代表包的当前状态:

  • n – 未安装
  • i – 已安装
  • c – 配置文件(只安装了配置文件)
  • U – 未打包
  • F – 半配置(出于某些原因配置失败)
  • h – 半安装(出于某些原因配置失败)
  • W – 等待触发(该包等待另外一个包的触发器)
  • t – 待定触发(该包被触发)

在通常的双字符字段末尾添加的 R 表示需要重新安装。 你可能永远不会碰到这些。

快速查看整体包状态的一种简单方法是计算在不同状态中包含的包的数量:

$ dpkg-query -l | tail -n +6 | awk '{print $1}' | sort | uniq -c
 2066 ii
 134 rc

我从上面的 dpkg-query 输出中排除了前五行,因为这些是标题行,会混淆输出。

这两行基本上告诉我们,在这个系统上,应该安装了 2066 个软件包,而 134 个其他的软件包已被删除,但留下了配置文件。 你始终可以使用以下命令删除程序包的剩余配置文件:

$ sudo dpkg --purge xfont-mathml

请注意,如果程序包二进制文件和配置文件都已经安装了,则上面的命令将两者都删除。


via: https://www.networkworld.com/article/3242808/linux/peeking-into-your-linux-packages.html

作者:Sandra Henry-Stocker 译者:Flowsnow 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

你编写或维护过有意义的 bash 脚本吗?如果回答是,那么你可能希望它们以标准且健壮的方式接收命令行参数。Fedora 最近得到了一个很好的附加组件,它可以帮助你生成更好的脚本。不用担心,它不会花费你很多时间或精力。

为什么需要 Argbash?

Bash 是一种解释性的命令行语言,没有标准库。因此,如果你编写 bash 脚本并希望命令行界面符合 POSIXGNU CLI 标准,那么你一般只有两种选择:

  1. 直接编写为脚本量身定制的参数解析功能(可使用内置的 getopts)。
  2. 使用外部 bash 模块。

第一个选项看起来非常愚蠢,因为正确实现接口并非易事。但是,从 Stack OverflowBash Hackers wiki 的各种站点上,它却被认为是最佳选择。

第二个选项看起来更聪明,但使用模块有它自己的问题。最大的问题是你必须将其代码与脚本捆绑在一起。这可能意味着:

  • 要么,你将库作为单独的文件分发
  • 或者,在脚本的开头包含库代码

有两个文件而不是一个是愚蠢的;但采用一个文件的话,会让一堆上千行的复杂代码污染了你的脚本。

这是 Argbash 项目诞生的主要原因。Argbash 是一个代码生成器,它为你的脚本生成一个量身定制的解析库。与其他 bash 模块的通用代码不同,它生成你的脚本所需的最少代码。此外,如果你不需要 100% 符合那些 CLI 标准的话,你可以生成更简单的代码。

示例

分析

假设你要实现一个脚本,它可以在终端窗口中绘制条形图,你可以通过重复一个字符选定的次数来做到这一点。这意味着你需要从命令行获取以下信息:

  • 哪个字符是组成该行的元素。如果未指定,使用破折号 -。 在命令行上,这是个单值定位参数 character,其默认值为 -。(LCTT 译注:定位参数是指确定位置的参数,此处 character 需是命令行的第一个参数)
  • 直线的长度。如果未指定,会选择 80。 这是一个单值可选参数 length,默认值为 80
  • Verbose 模式(用于调试)。 这是一个布尔型参数 verbose,默认情况下关闭。

由于脚本的主体非常简单,因此本文主要关注从命令行获取用户的输入到合适的脚本变量。Argbash 生成的代码会将参数解析结果保存到 shell 变量 _arg_character_arg_length_arg_verbose 当中。

执行

接下来,你还需要 argbash-initargbash bash 脚本,它们是 argbash 包的一部分。因此,运行以下命令:

sudo dnf install argbash

然后,使用 argbash-init 来为 argbash 生成模板,它会生成可执行脚本。你需要三个参数:一个名为 character 的定位参数,一个可选的 length 参数以及一个可选的布尔 verbose。将这些传递给 argbash-init,然后将输出传递给 argbash : `argbash-init --pos character --opt length --opt-bool verbose script-template.sh
argbash script-template.sh -o script
./script`

看到帮助信息了吗?看起来该脚本不知道字符参数的默认选项。因此,看一下 Argbash API,然后通过编辑脚本的模板部分来解决问题:

# ...
# ARG_OPTIONAL_SINGLE([length],[l],[Length of the line],[80])
# ARG_OPTIONAL_BOOLEAN([verbose],[V],[Debug mode])
# ARG_POSITIONAL_SINGLE([character],[The element of the line],[-])
# ARG_HELP([The line drawer])
# ...

Argbash 非常智能,它试图让每个生成的脚本都成为自己的模板,这意味着你不需要存储源模版以供进一步使用,你也不要丢掉生成的 bash 脚本。现在,尝试重新生成如你所预期的下一个线条绘图脚本:

argbash script -o script
./script

如你所见,一切正常。剩下要做的唯一事情就是完成线条绘图功能。

结论

你可能会发现包含解析代码的部分很长,但考虑到它允许你以 ./script.sh x -Vl50 的方式调用,并且能像 ./script -V -l 50 x 一样工作。确实需要一些代码才能做到这一点。

但是,通过调用 argbash-init 并将参数 -mode 设置为 minimal,你可以平衡生成的代码复杂度和解析能力,而转向更简单的代码。这个选项将脚本的大小减少了大约 20 行,这相当于生成的解析代码大小减少了大约 25%。另一方面,full 模式使脚本更加智能。

如果你想要检查生成的代码,请给 argbash 提供参数 -commented,它会将注释放入解析代码中,从而揭示各个部分背后的意图。与其他参数解析库相比较,如 shflags, argsparsebash-modules/arguments,你将看到 Argbash 强大的简单性。如果出现了严重的错误,你需要快速修复解析功能中的一个故障,Argbash 也允许你这样做。

由于你很有可能是 Fedora 用户,因此你可以享受从官方仓库安装命令行 Argbash 的便利。不过,也有一个在线解析代码生成器服务可以使用。此外,如果你在服务器上使用 Docker 工作,你可以试试 Argbash Docker 镜像

这样你可以让你的脚本具有令用户满意的命令行界面。Argbash 随时为你提供帮助,你只需付出很少的努力。


via: https://fedoramagazine.org/improve-bash-scripts-argbash/

作者:Matěj Týč 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Linux 容器是由 Linux 内核所提供的具有特定隔离功能的进程 —— 包括文件系统、进程和网络的隔离。容器有助于实现可移植性 —— 应用可以在容器镜像中与其依赖项一起分发,并可在几乎任何有容器运行时环境的 Linux 系统上运行。

虽然容器技术存在了很长时间,但 Linux 容器是由 Docker 而得到了广泛推广。 “Docker” 这个词可以指几个不同的东西,包括容器技术和工具,周围的社区,或者 Docker Inc. 公司。但是,在本文中,我将用来指管理 Linux 容器的技术和工具。

什么是 Docker

Docker 是一个以 root 身份在你的系统上运行的守护程序,它利用 Linux 内核的功能来管理正在运行的容器。除了运行容器之外,它还可以轻松管理容器镜像 —— 与容器注册库交互、存储映像、管理容器版本等。它基本上支持运行单个容器所需的所有操作。

但即使 Docker 是管理 Linux 容器的一个非常方便的工具,它也有两个缺点:它是一个需要在你的系统上运行的守护进程,并且需要以 root 权限运行,这可能有一定的安全隐患。然而,Podman 在解决这两个问题。

Podman 介绍

Podman 是一个容器运行时环境,提供与 Docker 非常相似的功能。正如已经提示的那样,它不需要在你的系统上运行任何守护进程,并且它也可以在没有 root 权限的情况下运行。让我们看看使用 Podman 运行 Linux 容器的一些示例。

使用 Podman 运行容器

其中一个最简单的例子可能是运行 Fedora 容器,在命令行中打印 “Hello world!”:

$ podman run --rm -it fedora:28 echo "Hello world!"

使用通用 Dockerfile 构建镜像的方式与 Docker 相同:

$ cat Dockerfile
FROM fedora:28
RUN dnf -y install cowsay

$ podman build . -t hello-world
... output omitted ...

$ podman run --rm -it hello-world cowsay "Hello!"

为了构建容器,Podman 在后台调用另一个名为 Buildah 的工具。你可以阅读最近一篇关于使用 Buildah 构建容器镜像的文章 —— 它不仅仅是使用典型的 Dockerfile。

除了构建和运行容器外,Podman 还可以与容器托管进行交互。要登录容器注册库,例如广泛使用的 Docker Hub,请运行:

$ podman login docker.io

为了推送我刚刚构建的镜像,我只需打上标记来代表特定的容器注册库,然后直接推送它。

$ podman -t hello-world docker.io/asamalik/hello-world
$ podman push docker.io/asamalik/hello-world

顺便说一下,你是否注意到我如何以非 root 用户身份运行所有内容?此外,我的系统上没有运行又大又重的守护进程!

安装 Podman

Podman 默认在 Silverblue 上提供 —— 一个基于容器的工作流的新一代 Linux 工作站。要在任何 Fedora 版本上安装它,只需运行:

$ sudo dnf install podman

via: https://fedoramagazine.org/running-containers-with-podman/

作者:Adam Šamalík 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Boxes 是 GNOME 上的虚拟机应用。最近 Boxes 添加了一个新的特性,使得它在运行不同的 Linux 发行版时更加容易。你现在可以在 Boxes 中自动安装那些发行版以及像 FreeBSD 和 FreeDOS 这样的操作系统,甚至还包括红帽企业 Linux。红帽开发者计划包括了一个红帽企业版 Linux 的免费订阅。 使用红帽开发者帐户,Boxes 可以自动设置一个名为 Developer Suite 订阅的 RHEL 虚拟机。 下面是它的工作原理。

红帽企业版 Linux

要创建一个红帽企业版 Linux 的虚拟机,启动 Boxes,点击“新建”。从源选择列表中选择“下载一个镜像”。在顶部,点击“红帽企业版 Linux”。这将会打开网址为 developers.redhat.com 的一个 Web 表单。使用已有的红帽开发者账号登录,或是新建一个。

如果这是一个新帐号,Boxes 在继续之前需要一些额外的信息。这一步需要在账户中开启开发者订阅。还要确保 接受条款和条件,这样可以在之后的注册中节省一步。

点击“提交”,然后就会开始下载安装磁盘镜像。下载需要的时间取决于你的网络状况。在这期间你可以去喝杯茶或者咖啡歇息一下。

等介质下载完成(一般位于 ~/Downloads ),Boxes 会有一个“快速安装”的显示。填入账号和密码然后点击“继续”,当你确认了虚拟机的信息之后点击“创建”。“快速安装”会自动完成接下来的整个安装!(现在你可以去享受你的第二杯茶或者咖啡了)

等到安装结束,虚拟机会直接重启并登录到桌面。在虚拟机里,在应用菜单的“系统工具”一栏启动“红帽订阅管理”。这一步需要输入 root 密码。

单击“注册”按钮,然后按照注册助手中的步骤操作。 出现提示时,使用你的红帽开发者帐户登录。

现在你可以通过任何一种更新方法,像是 yum 或是 GNOME Software 进行下载和更新了。

FreeDOS 或是其他

Boxes 可以安装很多操作系统,而不仅仅只是红帽企业版。 作为 KVM 和 qemu 的前端,Boxes 支持各种操作系统。使用 libosinfo,Boxes 可以自动下载(在某些情况下安装)相当多不同操作系统。

要从列表中安装一个操作系统,只需选择并完成创建一个新的虚拟机。一些操作系统,比如 FreeDOS,并不支持快速安装。这些操作系统需要虚拟机从安装介质中引导。之后你可以手动安装。

Boxes 上流行的操作系统

这里仅仅是一些目前在它上面比较受欢迎的选择。

Fedora 会定期更新它的操作系统信息数据库(osinfo-db)。确保你会经常检查是否有新的操作系统选项。


via: https://fedoramagazine.org/download-os-gnome-boxes/

作者:Link Dupont 选题:lujun9972 译者:dianbanjiu 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出