atomic
本文与Maxim Svistunov共同撰写。
与包含整个操作系统的虚拟机不同,容器旨在仅容纳运行应用程序所需的软件。 因此,为了高效,安全地运行容器,您需要一个提供安全容器服务并充当运行容器基础的操作系统。 为此任务开发的一种操作系统是Atomic Host 。
将Atomic Host视为Fedora,CentOS或Red Hat Enterprise Linux(RHEL)的安全,专业版本。 它的最佳用途是为运行容器提供可靠且易于升级的操作系统。 从裸机到各种云环境,都可以使用不同格式的Atomic Host来运行。 安装了Atomic Host系统后,您可以像在其他启用了容器的系统上一样使用docker
命令。 但是,Atomic Host还附带了一个名为atomic
的附加命令,该命令扩展了您可以对容器执行的操作。
atomic
命令是用于处理Atomic Host系统以及这些系统上的映像和容器的特殊工具。
像docker
命令一样, atomic
可用于列出,运行,标记,推送,拉取和删除容器和图像。
但是atomic
还具有其他功能,可让您:
- 使用Atomic主机:验证,升级,回滚和解锁Atomic Host系统
- 管理映像:安装(以预定义的方式运行),更新,验证和扫描容器映像
- 在容器上操作:列出,更新和回滚
此外,与docker
命令具有atomic
不同的一项关键功能是,它可以与未与Docker守护程序关联的容器一起使用。 使用atomic
安装所谓的系统容器 ,您可以将那些容器设置为在Docker守护程序启动之前运行,或者在完全没有Docker守护程序的系统上运行。 随着容器运行时可用于替换Docker(例如CRI-O), atomic
命令将使您也可以在这些运行时上使用容器。
如果您以前从未使用过Atomic Host,请逐步执行以下10个任务,以使您对使用Atomic Host可以做的事情有个良好的感觉。 首先获取并启动以下操作系统之一的Atomic Host映像:
任务1:升级并回滚Atomic Host
通常的Linux发行版使用软件包管理器,因此更新是逐软件包进行的。 原子是不同的:更新一次发生在整个文件系统树上。 文件系统树称为“ ostree” 。
Ostree更新是原子性的-如果系统关闭,则更新不能进行一半。 您具有先前使用的ostree(“旧”)或要切换到的ostree(“新”)。 从一个到另一个的更改是即时的。 这是可能的,因为与修改旧的ostree而不是在其旁边创建“新的” ostree一样。 下次重启时,将使用新的重启。
要获取有关当前ostree的信息,请运行:
[root@localhost ~]# atomic host status
...
Deployments:
● fedora-atomic:fedora/26/x86_64/atomic-host
Version: 26.157 (2017-10-29 14:42:37)
Commit: c099633883cd8d06895e32a14c63f6672072430c151de882223e4abe20efa7ca
...
ostree技术(管理ostree)类似于Git。 当前使用的ostree就像一个Git提交,已被检出到工作目录中。 此外,历史记录中的每个可用ostree都像一个Git提交,您可以检出和使用它。
要升级原子,请运行:
[root@localhost ~]# atomic host upgrade
...
Upgraded:
GeoIP-GeoLite-data 2017.10-1.fc26 -> 2018.01-1.fc26
NetworkManager 1:1.8.2-1.fc26 -> 1:1.8.2-4.fc26
...
Removed:
...
Added:
...
此命令类似于git pull
pull-它获取并部署最新的可用ostree。 在输出中,您会看到新的,已升级和已删除的软件包及其版本。 在重新引导之前,将使用旧的ostree。 要开始使用新的,请重新启动:
[root@localhost ~]# reboot
当您切换到另一个ostree时,将保留诸如配置,容器映像和用户文件之类的内容,并且仅更改可执行文件和库之类的文件。 这样,切换到其他ostree类似于在常规Linux发行版上升级软件包。
现在登录并再次检查状态:
[root@localhost ~]# atomic host status
...
Deployments:
● ostree://fedora-atomic:fedora/26/x86_64/atomic-host
Version: 26.247 (2018-02-14 16:51:26)
Commit: 5d0283ee...
...
ostree://fedora-atomic:fedora/26/x86_64/atomic-host
Version: 26.157 (2017-10-29 14:42:37)
Commit: c0996338...
...
●
符号显示当前ostree是版本26.247,它对应于commit 5d0283ee
。 您还会看到“旧”的ostree。 原子总是保留两个ostree:当前的和旧的。
回滚到旧的ostree很容易:
[root@localhost ~]# atomic host rollback
Moving 'c0996338...' to be first deployment
...
Downgraded:
GeoIP-GeoLite-data 2018.01-1.fc26 -> 2017.10-1.fc26
NetworkManager 1:1.8.2-4.fc26 -> 1:1.8.2-1.fc26
...
Removed:
...
Added:
...
[root@localhost ~]# reboot
系统现在再次使用旧的ostree。
您可以将ostree A与ostree B进行比较,而无需从A升级到B。您甚至不需要获取A或B。只需运行:
[root@localhost ~]# rpm-ostree db diff c099633 5d0283e
ostree diff commit old: c099633
ostree diff commit new: 5d0283e
Upgraded:
GeoIP-GeoLite-data 2017.10-1.fc26.noarch -> 2018.01-1.fc26.noarch
NetworkManager 1:1.8.2-1.fc26.x86_64 -> 1:1.8.2-4.fc26.x86_64
...
Removed:
...
Added:
...
您将获得与升级期间相同的信息。
任务2:部署较旧的原子主机
升级到最新的ostree并回滚是更一般的“部署”操作的特定情况。 与Git中一样,您可以在其中签出任何提交,也可以部署任何版本的ostree。
要列出可用的ostree版本,请拉出ostree元数据:
[root@localhost ~]# ostree pull --commit-metadata-only --depth=-1 \
fedora-atomic:fedora/26/x86_64/atomic-host
…
上面命令中的最后一个参数指定ostree的远程源。 它们存储在/sysroot/ostree/deploy/fedora-atomic/deploy/*.origin
文件中。 要了解此参数在您的系统中的.origin
,请查看以下.origin
文件:
# cat /sysroot/ostree/deploy/fedora-atomic/deploy/*.origin
[origin]
refspec=fedora-atomic:fedora/26/x86_64/atomic-host
比较ostree版本之间的RPM软件包很有用,因此也请提取有关RPM的元数据:
[root@localhost ~]# ostree pull --subpath /usr/share/rpm --depth=-1 \
fedora-atomic:fedora/26/x86_64/atomic-host
要列出可用的ostree,请运行:
[root@localhost ~]# ostree log fedora-atomic:fedora/26/x86_64/atomic-host
commit 5d0283ee9dda7d3e1d49b8b34376bd38d36c5e4774c06bb2155168cef7f08cbe
Date: 2018-02-14 16:51:26 +0000
Version: 26.247
(no subject)
commit 26957d49f289bdfe3c24ede92112a8c91a22a19f5cec860cd77190825cef3419
Date: 2018-02-13 17:27:26 +0000
Version: 26.246
(no subject)
...
假设您要部署版本26.230。 首先了解当前ostree版本中的软件包与26.230中的软件包相比会有帮助。 您可以通过运行deploy操作的预览来做到这一点:
# atomic host deploy --preview 26.230
Resolving version '26.230'
!GeoIP-GeoLite-data-2017.10-1.fc26-noarch
=GeoIP-GeoLite-data-2018.01-1.fc26-noarch
...
要部署26.230,请删除--preview
选项:
# atomic host deploy 26.230
与升级一样,您必须首先重新引导才能运行新的ostree。
另外,我们用于比较当前ostree和最新rpm-ostree db diff
的rpm-ostree db diff
命令可用于任何两个ostree版本。
任务3:部署其他原子主机
在任务1和2中,部署了Fedora Atomic Host ostree。 但是,您也可以部署其他Atomic Host变体的ostree,例如CentOS Atomic Host或RHEL Atomic Host。 这意味着切换到其他操作系统,例如在最新的Fedora与稳定的CentOS Atomic Host或RHEL Atomic Host之间。
要进行切换,请添加其他Atomic Host变体的存储库,然后使用以下命令切换到CentOS:
# ostree remote add --no-gpg-verify centos-atomic \
http://mirror.centos.org/centos/7/atomic/x86_64/repo
切换至CentOS的操作称为重新定基:
# atomic host rebase \
centos-atomic:centos-atomic-host/7/x86_64/standard
# reboot
这将获得最新的CentOS ostree并进行部署,就像使用Fedora ostree一样。 重新启动后,您将运行CentOS ostree:
# atomic host status
State: idle; auto updates disabled
Deployments:
● ostree://centos-atomic-host:centos-atomic-host/7/x86_64/standard
Version: 7.1803 (2018-04-03 12:35:38)
Commit: cbb9dbf9c8697e9254f481fff8f399d6808cecbed0fa6cc24e659d2f50e05a3e
ostree://fedora-atomic:fedora/27/x86_64/atomic-host
Version: 27.122 (2018-04-18 23:34:24)
Commit: 931ebb3941fc49af706ac5a90ad3b5a493be4ae35e85721dabbfd966b1ecbf99
GPGSignature: Valid signature by 860E19B0AFA800A1751881A6F55E7430F5282EE4
现在,您将跟踪CentOS ostree,因此,如果您运行atomic host upgrade
,您将获得升级的CentOS ostree,而不是Fedora ostree。
要恢复为Fedora Atomic Host,请执行atomic host rollback
。
任务4:安装软件包
在Atomic上,可以使用rpm-ostree
而不是使用yum
和dnf
类的软件包管理命令来安装软件。 在此任务中,您将在Atomic Host上安装和删除RPM软件包。
注意 :在RHEL系统上,请在安装软件之前注册并订阅系统。
安装套件
要安装名为nmap
的软件包,请输入以下内容:
# rpm-ostree install nmap
Checking out tree da0bd96... done
…
Added:
nmap-2:7.60-7.fc27.x86_64
Run "systemctl reboot" to start a reboot
# systemctl reboot
重新启动后,再次登录。 然后检查RPM是否已安装并可用:
# rpm -q nmap
nmap-7.60-7.fc27.x86_64
删除包裹
要删除软件包,请使用rpm-ostree uninstall
命令:
# rpm-ostree uninstall nmap
Copying /etc changes: 17 modified, 0 removed, 36 added
Transaction complete; bootconfig swap: no deployment count change: 0
Removed:
nmap-2:7.60-7.fc27.x86_64
Run "systemctl reboot" to start a reboot
# systemctl reboot
重新启动后,再次登录。 然后检查RPM不可用:
# rpm -q nmap
package nmap is not installed
任务5:管理映像和容器
atomic
命令简化了容器映像和容器的管理。 容器映像和容器之间有什么区别? 与RPM中的命令和使用这些命令开始的进程之间的相同。 例如, yum install vim
安装vim
具有命令(容器图像) vim
命令,而vim file.txt
使用开始一个实例(容器) vim
命令。
以下命令显示如何在Atomic上管理容器映像。 第一个命令下载图像,第二个命令列出图像,最后一个命令删除图像:
# atomic pull docker.io/fedora/apache
# atomic images list
# atomic images delete docker.io/fedora/apache
以下命令显示如何在Atomic上管理容器映像。 第一个从映像运行一个容器,第二个列出正在运行的容器,第三个停止一个正在运行的ID为ecc736143f0c
的容器,最后一个删除了一个ID为ecc736143f0c
的容器:
# atomic run docker.io/fedora/apache
# atomic containers list
# atomic stop ecc736143f0c
# atomic containers delete ecc736143f0c
任务6:更新和验证图像
使用atomic images verify
,可以查看容器映像的本地和远程版本信息。 如果注册表中可用的映像比本地可用的映像更多,则可以更新该映像。 这是如何做:
# docker pull registry.access.redhat.com/rhel7/rhel
# atomic images verify -v registry.access.redhat.com/rhel7/rhel
registry.access.redhat.com/rhel7/rhel contains the following images:
NAME LOCAL VERSION REMOTE VERSION DIFFERS
rhel7 7.3-97 7.4-129 YES
# atomic images update registry.access.redhat.com/rhel7/rhel
Pulling registry.access.redhat.com/rhel7/rhel:latest ...
Copying blob sha256:9c …
…
# atomic images verify -v registry.access.redhat.com/rhel7/rhel
registry.access.redhat.com/rhel7/rhel contains the following images:
NAME LOCAL VERSION REMOTE VERSION DIFFERS
rhel7 7.4-129 7.4-129 NO
在此示例中,本地rhel7映像适用于版本7.3-97,而注册表中提供了其他版本(7.4-129)。 更新映像后,可以验证本地版本与远程版本匹配。
任务7:运行特权容器
support-tools
映像是一个容器的示例,该容器为主机打开特权,并允许您从该容器运行Atomic中未包含的工具(例如sosreport
和strace
)。 这个容器完全打开了对主机功能(IPC,网络接口和进程表)和文件系统内容( /run
,/ var/log
等)的访问,可以访问您运行的命令(在此示例中为sosreport
)。
# atomic run rhel7/support-tools sosreport
docker run -it --name support-tools --privileged --ipc=host --net=host --pid=host -e HOST=/host -e NAME=support-tools -e IMAGE=rhel7/support-tools -v /run:/run -v /var/log:/var/log -v /etc/machine-id:/etc/machine-id -v /etc/localtime:/etc/localtime -v /:/host rhel7/support-tools sosreport
This container uses privileged security switches:
...
Your sosreport has been generated and saved in:
/host/var/tmp/sosreport-c.12345-20180228004916.tar.xz
The checksum is: e1eb00750a5d44d7e8210c5a9a7ceae7
Please send this file to your support representative.
某些容器(包括support-tools
)是专门构建为包含run
变量的。 当您使用atomic run
启动该变量时,该变量将设置要启动的确切docker
命令。 您可以使用docker inspect
查看该变量:
# docker inspect registry.access.redhat.com/rhel7/support-tools \
| grep run
"run": "docker run -it --name NAME --privileged --ipc=host --net=host --pid=host -e HOST=/host -e NAME=NAME -e IMAGE=IMAGE -v /run:/run -v /var/log:/var/log -v /etc/machine-id:/etc/machine-id -v /etc/localtime:/etc/localtime -v /:/host IMAGE",
任务8:安装超级特权容器和系统容器
某些供atomic
使用的特殊容器,可以“安装”在原子主机上,以按照容器内的信息定义运行。 这些包括:
超级特权容器 :具有额外特权(可以访问或修改主机系统)并包括安装步骤以准备系统运行容器的容器
系统容器 :在安装步骤中设置并由systemd管理的容器,因此它们可以在系统启动时自动启动并连续运行,而无需Docker服务
安装并运行超级特权容器
atomic install
命令通过将映像拉到本地系统并运行脚本来设置要运行的主机系统来设置要运行的超级特权容器。 对于某些容器,这包括创建配置文件。 然后, atomic run
命令使用容器内部的预设选项运行容器,以打开额外的主机特权。
例如,要配置rsyslog容器,请运行:
# atomic install registry.access.redhat.com/rhel7/rsyslog
Pulling registry.access.redhat.com/rhel7/rsyslog:latest ...
…
Creating directory at /host//etc/pki/rsyslog
Installing file at /host//etc/rsyslog.conf
Installing file at /host//etc/sysconfig/rsyslog
Installing file at /host//etc/logrotate.d/syslog
atomic run
命令使用容器内部的预设选项运行容器:
# atomic run registry.access.redhat.com/rhel7/rsyslog
docker run -d --privileged --name rsyslog --net=host --pid=host -v
/etc/pki/rsyslog:/etc/pki/rsyslog ...
对于超级特权的容器(例如rsyslog),容器在主机上具有额外的特权。 结果是rsyslogd守护程序正在运行,并且可以访问主机上的配置文件和日志文件。 在atomic run
命令之后查看完整的docker
命令输出。 有关超级特权容器的更多信息以及特权选项的描述,请参阅“ 运行超级特权容器” 。
安装并运行系统容器
一些容器需要在Docker服务启动之前启动,或者在没有Docker服务的系统上启动。 使用atomic install
设置系统容器,该系统容器将完全绕过docker
服务,并使用systemd
服务启动容器。
这是etcd
系统容器的示例。
# atomic pull --storage=ostree registry.access.redhat.com/rhel7/etcd
Pulling layer 9a32f102e6778e4b3c677f1f93fa121808006d3c9e002237677248de9acb9589
# atomic install --system registry.access.redhat.com/rhel7/etcd
Extracting to /var/lib/containers/atomic/etcd.0
systemctl daemon-reload
systemd-tmpfiles --create /etc/tmpfiles.d/etcd.conf
systemctl enable etcd
# systemctl start etcd
结果是etcd
服务启动并连续运行,然后在每次重新引导系统时重新启动。 有关系统容器的更多信息,请参见运行系统容器 。
任务9:更新和回滚容器
如果您已经设置了要在系统上运行的容器,并且该容器的新版本可用,则可以对其进行更新,而不必重复执行拉取和安装步骤。 这是一个例子:
# atomic pull --storage=ostree \
registry.access.redhat.com/rhel7/flannel
# atomic install --system \
registry.access.redhat.com/rhel7/flannel
# systemctl start flannel
# atomic containers list
CONTAINER ID IMAGE COMMAND
CREATED STATE BACKEND RUNTIME
flannel registry.access.redh flannel /usr/bin/f
2018-02-28 16:48 running ostree /usr/bin/r
# atomic containers update flannel
# atomic containers rollback flannel
在此示例中,拉出,安装和启动flannel
容器后,列出容器显示flannel
容器正在运行并且是ostree类型。 当有新的flannel
容器图像可用时,您可以使用update
选项来获取新的容器。 如果要返回到旧容器,请使用rollback
选项。
任务10:扫描图像
atomic scan
命令对容器映像和容器执行安全扫描。 该命令可以在后端使用不同的扫描仪。 本示例使用openscap
扫描器。 请注意, openscap
仅适用于容器映像和基于rhel
容器映像的容器。
首先,安装openscap
容器映像:
# atomic install registry.access.redhat.com/rhel7/openscap
...
docker run --rm --privileged -v /:/host/ registry.access.redhat.com/rhel7/openscap sh /root/install.sh registry.access.redhat.com/rhel7/openscap
...
其次,下载而不安装要扫描的图像。 在此示例中,将扫描Apache Web服务器容器图像:
# atomic pull registry.access.redhat.com/rhscl/httpd-24-rhel7
最后,使用openscap
扫描器扫描Apache映像:
# atomic scan --scanner openscap registry.access.redhat.com/rhscl/httpd-24-rhel7
...
registry.access.redhat.com/rhscl/httpd-24-rhel7 passed the scan
...
与此扫描相关的文件位于/var/lib/atomic/openscap/2018-04-29-22-38-58-453732
。
上面的命令在容器映像中扫描了常见漏洞和披露(CVE)。 这是默认的扫描类型。 还有其他两种扫描类型:扫描配置合规性和补救配置合规性。
要扫描配置合规性:
# atomic scan --scanner openscap \
--scan_type configuration_compliance \
registry.access.redhat.com/rhscl/httpd-24-rhel7
...
发现以下问题:
...
Ensure Software Patches Installed
Severity: Important
XCCDF result: notchecked
...
与此扫描相关的文件位于/var/lib/atomic/openscap/2018-04-29-22-39-21-584104
。
要修正配置合规性:
# atomic scan --scanner openscap \
--scan_type configuration_compliance --remediate \
registry.access.redhat.com/rhscl/httpd-24-rhel7
...
Remediating target df5ff2793065d8bf2dd8d9ab9678fc17f7c8dadfed97197795dd4ffb08cafcda.
...
有关更多信息,请参阅《 Atomic CLI参考指南》以及将OpenSCAP与原子扫描命令配合使用 。
翻译自: https://opensource.com/article/18/5/10-tasks-running-containers-atomic-hosts
atomic