Atomic Host 原子主机最简测试

Atomic Host 是一个定制版本的Linux操作系统,用来运行容器,容器中可以装Docker镜像。本文用地球人都知道的世界你好,来讲述如何在容器中跑一个httpd服务器,并且里面有定制的主页内容。整个过程涵盖了,Atomic Host的测试机安装和配置,容器服务器基本操作命令,docker命令基本操作。不包含对原子主机的存储配置和网络配置,这些都是使用默认安装后的配置。

环境准备

本文使用笔记本电脑+KVM虚拟化进行以下的测试过程,当然也可以用其它的操作系统加虚拟化软件的组合,测试机需要满足以下的条件: 测试虚拟机的建议配置1C/2GB/10GB 虚拟机使用的网络需要能连接到互联网 虚拟机需要能加载光盘iso文件 可以执行起停虚拟机操作,能通过控制它登陆来做初始化配置

本文测试机是Lenovo T440s笔记本电脑,安装的操作系统是Fedora 22,使用KVM虚拟化,用Virt-Manager做GUI图形管理工具。建立了一个NAT的静态虚拟网络,虚拟机可以使用该网络来从互联网下载需要的文件包。

下载Fedora Atomic Host虚拟机文件;下载页面: http://www.projectatomic.io/download/ 点击绿色的下载按钮。下载qcow2格式的Atomic Host虚拟机文件。复制下载的文件到虚拟机运行的存储目录中,文件名可以是master.qcow2,新测试虚拟机会基于它创建。

在通过这个虚拟机模版文件生成测试机前,需要准备一个init.iso的文件,用来初始化测试机的主机名和初始用户密码。

[bash] [root@martin-fedora vm]# cat meta-data instance-id: master local-hostname: master.xenlab.com [root@martin-fedora vm]# cat user-data #cloud-config password: smartvm ssh_pwauth: True chpasswd: { expire: False } [root@martin-fedora vm]# genisoimage -output init.iso -volid cidata -joliet -rock user-data meta-data I: -input-charset not specified, using utf-8 (detected in locale settings) Total translation table size: 0 Total rockridge attributes bytes: 331 Total directory bytes: 0 Path table size(bytes): 10 Max brk space used 0 183 extents written (0 MB) [/bash]

以上的两个配置文件meta-data和user-data,最后使用genisoimage命令生成出文件init.iso。至此,Atomic Host 测试机的运行镜像文件和初始化配置文件都准备好了。

创建Atomic host测试虚拟机

使用虚拟化的管理工具基于准备好的镜像文件(master.qcow2)创建测新的试虚拟机。在首次启动前,还需要添加光驱设备,指定光驱设备在启动时加载上文中创建的init.iso配置参数文件。 首次在虚拟管理工具上启动新创建的Atomic Host测试虚拟机,查看整个的启动过程。由于本文的测试网络不是DHCP的,因此测试机在启动后,还需要登陆虚拟机控制台,使用默认账户,用户名:fedora用户,fedora的密码在前面的配置文件中已经指定。静态IP地址参考的配置文件如下:

[bash] [fedora@master ~]$ cat /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=“eth0” BOOTPROTO=“static” ONBOOT=“yes” TYPE=“Ethernet” PERSISTENT_DHCLIENT=“yes” IPADDR=192.168.10.42 NETMASK=255.255.255.0 BROADCAST=192.168.10.255 NETWORK=192.168.10.0 GATEWAY=192.168.10.1

[fedora@master ~]$ cat /etc/resolv.conf

Generated by NetworkManager

search xenlab.com nameserver 192.168.10.1 nameserver 8.8.8.8 [fedora@master ~]$ [/bash]

至此,Atomic Host测试虚拟机初始化安装完毕。

Atomic Host基本操作

登陆Atomic Host测试虚拟机 master 之后首先需要测试是否能和互联网连接,ping外部的网址,看是否能够正常解析。由于后面很多相关测试都需要从联网下载内容。 用ssh工具登陆之后,看下它: [bash] [fedora@master ~]$ cat /etc/redhat-release Fedora release 22 (Twenty Two) [fedora@master ~]$ uname -a Linux master.xenlab.com 4.0.4-301.fc22.x86_64 #1 SMP Thu May 21 13:10:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux [fedora@master ~]$ dnf bash: dnf: command not found [fedora@master ~]$ yum bash: yum: command not found [/bash]

根据以上显示发现它貌似就是一个Fedora 22 的服务器,不过默认没有dnf, yum包管理工具,不过有rpm。查询一下这个系统上有什么默认安装的软件包:根据rpm -qa 结果显示,Atomic Host 虚拟机默认安装了324个软件包。下面初步尝试一下 Atomic Host 操作系统更新和管理的主要命令 atomic / rpm-ostree

[bash] [fedora@master ~]$ sudo atomic usage: atomic [-h] {host,info,install,run,uninstall,update} …

Atomic Management Tool

positional arguments: {host,info,install,run,uninstall,update} commands host execute Atomic host commands info display label information about an image install execute container image install method run execute container image run method uninstall execute container image uninstall method update pull latest container image from repository

optional arguments: -h, –help show this help message and exit

error: too few arguments [fedora@master ~]$ sudo rpm-ostree Usage: rpm-ostree [OPTION…] COMMAND

Builtin Commands: compose upgrade rebase rollback status db

Help Options: -h, –help Show help options

Application Options: –version Print version information and exit

error: No command specified

[fedora@master ~]$ sudo atomic host status TIMESTAMP (UTC) VERSION ID OSNAME REFSPEC * 2015-05-21 19:01:46 22.17 06a63ecfcf fedora-atomic fedora-atomic:fedora-atomic/f22/x86_64/docker-host [fedora@master ~]$ sudo rpm-ostree status [fedora@master ~]$ sudo atomic host usage: atomic host [-h] {rollback,status,upgrade} …

positional arguments: {rollback,status,upgrade} host commands rollback switch to alternate tree at boot status list information about all deployments upgrade upgrade to the latest Atomic tree if one is available

optional arguments: -h, –help show this help message and exit

error: too few arguments [fedora@master ~]$ [/bash]

下面使用 atomic host upgrade 来升级这个系统,使它运行在最新的补丁和版本下。这个过程需要下载180+MB的升级包,这个过程无法断点续传,但是可以任意中断。再次运行该命令后,可以重新从头下载,直到下载成功。下载成功并升级成功以后,重起操作系统。

[bash] [fedora@master ~]$ sudo atomic host upgrade Updating from: fedora-atomic:fedora-atomic/f22/x86_64/docker-host

0 metadata, 5051 content objects fetched; 183267 KiB transferred in 330 seconds Copying /etc changes: 25 modified, 0 removed, 41 added Transaction complete; bootconfig swap: yes deployment count change: 1 Changed: avahi-autoipd-0.6.31-31.fc22.x86_64 avahi-libs-0.6.31-31.fc22.x86_64 …………………………………………. tcpdump-14:4.7.4-2.fc22.x86_64 tzdata-2015e-1.fc22.noarch udisks2-2.1.6-1.fc22.x86_64 Removed: docker-storage-setup-0.0.4-2.fc22.noarch pciutils-libs-3.3.0-1.fc22.x86_64 Added: docker-selinux-1.7.0-6.git74e7a7a.fc22.x86_64 iptables-services-1.4.21-14.fc22.x86_64 kubernetes-master-0.20.0-0.3.git835eded.fc22.x86_64 kubernetes-node-0.20.0-0.3.git835eded.fc22.x86_64 python-pip-6.0.8-1.fc22.noarch python-setuptools-17.1.1-3.fc22.noarch Upgrade prepared for next boot; run “systemctl reboot” to start a reboot [/bash]

在reboot之后,这个系统就可以投入使用了。在启动的GRUB菜单上可以看到出现两个条目,默认进入最新的这个系统版本。

[bash] [fedora@master ~]$ sudo atomic host status TIMESTAMP (UTC) VERSION ID OSNAME REFSPEC * 2015-07-15 23:33:20 22.61 db540a53ba fedora-atomic fedora-atomic:fedora-atomic/f22/x86_64/docker-host 2015-05-21 19:01:46 22.17 06a63ecfcf fedora-atomic fedora-atomic:fedora-atomic/f22/x86_64/docker-host [/bash]

进入系统之后,我们看到上面这个命令输出,目前 Atomic Host 的操作系统有了两个版本,该系统可以从最新的系统回退或者回滚到旧的版本。可以认为它同时具有多个可以前后切换的操作系统版本。

在一个Atomic Host上有两种软件交付方式: rpm-ostree 管理部署和升级host系统自身的软件 Linux 容器(目前Docker)提供很多容器来跑各种软件应用服务

运行第一个Docker镜像

现在测试的是Atomic Host自身的管理工具,传统的Linux系统中,这个软件是用rpm包和系统服务的方式,被安装到被管理节点的,可是我们下面使用容器的技术来部署,也达到相同的管理功能。Cockpit是之前介绍过的一款系统管理工具,兼具对docker的管理功能,它可以Docker image的形式被下载,并且运行在本机的一个专有权限(提权)的容器中。它可以作为Atomic Host的主机管理工具,对Linix系统管理不熟练的人可以使用这个图形工具,查看和监控系统的状态,并且可以管理容器中Image。下面是安装和运行这个特殊功能容器的命令。

[bash] [fedora@a1 etc]$ sudo atomic run cockpit/ws /usr/bin/docker run -d –privileged –pid=host -v /:/host cockpit/ws /container/atomic-run –local-ssh efd3cbbad8452ff394e1d1a0c309870634207538597ba0cead26d790510e7a5e [/bash]

上面这条命令执行完后,就可以在笔记本电脑的浏览器,输入网址,来访问这个工具,如: https://192.168.10.41:9090 登陆的用户名和密码是 Atomic Host的fedora和它的密码。

HW实战篇

不错HW就是Hello World!它太有名了,掠过对它的介绍。现在可以让docker命令出场了。在命令行中不加任何参数,看下它的默认输出。输出一下它的版本信息。

[bash] [fedora@master ~]$ sudo docker version Client version: 1.7.0.fc22 Client API version: 1.19 Package Version (client): docker-1.7.0-6.git74e7a7a.fc22.x86_64 Go version (client): go1.4.2 Git commit (client): 74e7a7a/1.7.0 OS/Arch (client): linux/amd64 Server version: 1.7.0.fc22 Server API version: 1.19 Package Version (server): docker-1.7.0-6.git74e7a7a.fc22.x86_64 Go version (server): go1.4.2 Git commit (server): 74e7a7a/1.7.0 OS/Arch (server): linux/amd64 [/bash]

下面的实战内容是和过程如下:

  1. 下载fedora image

  2. 构建httpd image

  3. 构建HW主页

  4. 构建并测试HW网站

具体的命令执行过程如下:

[bash] [fedora@master ~]$ sudo docker run -i -t fedora bash Unable to find image ‘fedora:latest’ locally latest: Pulling from docker.io/fedora ded7cd95e059: Already exists 48ecf305d2cf: Already exists docker.io/fedora:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. Digest: sha256:10ba981a70632d7764c21deae25c6521db6d39730e1dd8caff90719013858a7b Status: Downloaded newer image for docker.io/fedora:latest [root@f1c79aa4c931 /]# dnf update -y Fedora 22 - x86_64 608 kB/s | 41 MB 01:09 Fedora 22 - x86_64 - Updates 439 kB/s | 12 MB 00:27 Last metadata expiration check performed 0:00:19 ago on Fri Jul 17 13:30:18 2015.

Dependencies resolved.

Package Arch Version Repository Size

Installing: python-pip noarch 6.0.8-1.fc22 fedora 1.7 M python-setuptools noarch 17.1.1-3.fc22 updates 425 k Upgrading: bash x86_64 4.3.39-4.fc22 updates 1.6 M

……………………………………….

Transaction Summary

Install 2 Packages Upgrade 59 Packages Total download size: 48 M Downloading Packages: (161): python-pip-6.0.8-1.fc22.noarch.rpm 434 kB/s | 1.7 MB 00:03 ……………………………………………………. Installed: python-pip.noarch 6.0.8-1.fc22 python-setuptools.noarch 17.1.1-3.fc22

Upgraded: bash.x86_64 4.3.39-4.fc22 bash-completion.noarch 1:2.1-7.20150513git1950590.fc22 coreutils.x86_64 8.23-10.fc22 curl.x86_64 7.40.0-5.fc22 ………………………………………………………………………………….. systemd.x86_64 219-19.fc22 systemd-libs.x86_64 219-19.fc22 tzdata.noarch 2015e-1.fc22

Complete! [root@f1c79aa4c931 /]# [root@f1c79aa4c931 /]# [/bash] 上面的过程下载和启动了一个fedora,然后更新系统到最新的包,为安装Web服务器打好了基础。

[bash] [root@f1c79aa4c931 /]# dnf install -y httpd Last metadata expiration check performed 0:06:11 ago on Fri Jul 17 13:30:18 2015.

Dependencies resolved.

Package Arch Version Repository Size

Installing: apr x86_64 1.5.1-3.fc22 fedora 111 k apr-util x86_64 1.5.4-1.fc22 fedora 96 k fedora-logos-httpd noarch 22.0.0-1.fc22 fedora 33 k httpd x86_64 2.4.12-1.fc22 fedora 1.2 M httpd-filesystem noarch 2.4.12-1.fc22 fedora 24 k httpd-tools x86_64 2.4.12-1.fc22 fedora 87 k mailcap noarch 2.1.44-1.fc22 fedora 36 k

Transaction Summary

Install 7 Packages

Total download size: 1.6 M Installed size: 4.4 M Downloading Packages: (17): apr-1.5.1-3.fc22.x86_64.rpm 128 kB/s | 111 kB 00:00 (27): apr-util-1.5.4-1.fc22.x86_64.rpm 100 kB/s | 96 kB 00:00 (37): httpd-filesystem-2.4.12-1.fc22.noarch.rpm 123 kB/s | 24 kB 00:00 (47): mailcap-2.1.44-1.fc22.noarch.rpm 123 kB/s | 36 kB 00:00 (57): httpd-tools-2.4.12-1.fc22.x86_64.rpm 185 kB/s | 87 kB 00:00 (67): fedora-logos-httpd-22.0.0-1.fc22.noarch.rpm 151 kB/s | 33 kB 00:00

(77): httpd-2.4.12-1.fc22.x86_64.rpm 363 kB/s | 1.2 MB 00:03

Total 264 kB/s | 1.6 MB 00:06 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Installing : apr-1.5.1-3.fc22.x86_64 17 warning: Unable to get systemd shutdown inhibition lock Installing : apr-util-1.5.4-1.fc22.x86_64 27 Installing : httpd-tools-2.4.12-1.fc22.x86_64 37 Installing : fedora-logos-httpd-22.0.0-1.fc22.noarch 47 Installing : mailcap-2.1.44-1.fc22.noarch 57 Installing : httpd-filesystem-2.4.12-1.fc22.noarch 67 Installing : httpd-2.4.12-1.fc22.x86_64 77 Verifying : httpd-2.4.12-1.fc22.x86_64 17 Verifying : apr-1.5.1-3.fc22.x86_64 27 Verifying : apr-util-1.5.4-1.fc22.x86_64 37 Verifying : httpd-filesystem-2.4.12-1.fc22.noarch 47 Verifying : httpd-tools-2.4.12-1.fc22.x86_64 57 Verifying : mailcap-2.1.44-1.fc22.noarch 67 Verifying : fedora-logos-httpd-22.0.0-1.fc22.noarch 77

Installed: apr.x86_64 1.5.1-3.fc22 apr-util.x86_64 1.5.4-1.fc22 fedora-logos-httpd.noarch 22.0.0-1.fc22 httpd.x86_64 2.4.12-1.fc22 httpd-filesystem.noarch 2.4.12-1.fc22 httpd-tools.x86_64 2.4.12-1.fc22 mailcap.noarch 2.1.44-1.fc22

Complete! [root@f1c79aa4c931 /]# [root@f1c79aa4c931 /]# exit exit [fedora@master ~]$ [/bash] 上面在一个互动的Bash里面完成了httpd的安装,exit命令之后,容器会停止运行,可以把这个停下来的镜像文件用下面的命令提交到本地的image库中。

[bash] [fedora@master ~]$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f1c79aa4c931 fedora “bash” 17 minutes ago Exited (130) 3 minutes ago desperate_franklin [fedora@master ~]$ sudo docker commit f1c79aa4c931 fedora-httpd c77c91fd4af681e736afc2ec76fc316732e25f52f6f3dd8aa97c973f28c55eb2 [fedora@master ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE fedora-httpd latest c77c91fd4af6 25 seconds ago 605.7 MB docker.io/cockpit/ws latest 9a4331b694a6 3 weeks ago 572.2 MB docker.io/fedora latest ded7cd95e059 7 weeks ago 186.5 MB [/bash]

第一个名为 “fedora-httpd” 的就是刚才安装完毕之后,停止的docker image,用commit提交到本第的库中待用。下面开始准备网站的内容,其实只有一个主页,上只有一句话“HW”

[bash] [fedora@master ~]$ pwd /home/fedora [fedora@master ~]$ vi index.html [fedora@master ~]$ cat index.html Hello World! [fedora@master ~]$ tar -cf mysite.tar index.html [fedora@a1 ~]$ ls Dockerfile index.html mysite mysite.tar [fedora@master ~]$ vi Dockerfile [fedora@master ~]$ cat Dockerfile FROM fedora-httpd MAINTAINER MartinLiumartin@aws-faq.com

Add the tar file of the web site

ADD mysite.tar /tmp/

Docker automatically extracted. So move files to web directory

RUN cp /tmp/index.html /var/www/html

EXPOSE 80

ENTRYPOINT [ “/usr/sbin/httpd” ] CMD [ “-D”, “FOREGROUND” ] [/bash]

上面这段命令中最重要的是 Dockerfiler 文件,这个文件的语法还有很多,以上是一个最简化的例子。使用它可构建一个具有静态页面内容的网站。下面开始构建这个网站的Docker image。

[bash] [fedora@a1 ~]$ sudo docker build -rm -t mysite . Warning: ‘-rm’ is deprecated, it will be replaced by ‘–rm’ soon. See usage. Sending build context to Docker daemon 31.74 kB Sending build context to Docker daemon Step 0 : FROM fedora-httpd —> 05ce6f68d3f2 Step 1 : MAINTAINER A D Ministator email: martin@aws-faq.com —> Running in 7ee99e26ab76 —> 03cc8c0deff1 Removing intermediate container 7ee99e26ab76 Step 2 : ADD mysite.tar /tmp/ —> 52abfb1966ad Removing intermediate container e6c20f7ca5ed Step 3 : RUN mv /tmp/* /var/www/html —> Running in ef455353caff —> 6e24f9a9ea6f Removing intermediate container ef455353caff Step 4 : EXPOSE 80 —> Running in 252b59576b54 —> 7dd7c049c9d2 Removing intermediate container 252b59576b54 Step 5 : ENTRYPOINT /usr/sbin/httpd —> Running in 572c3dafa53a —> fa01c160e081 Removing intermediate container 572c3dafa53a Step 6 : CMD -D FOREGROUND —> Running in b133650a6e18 —> f828e1847160 Removing intermediate container b133650a6e18 Successfully built f828e1847160

[fedora@master ~]$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE mysite latest 1bd6d7c1970f 45 seconds ago 605.7 MB fedora-httpd latest c77c91fd4af6 18 minutes ago 605.7 MB docker.io/cockpit/ws latest 9a4331b694a6 3 weeks ago 572.2 MB docker.io/fedora latest ded7cd95e059 7 weeks ago 186.5 MB

[fedora@master ~]$ sudo docker run -d -P mysite 6122ac7d4dff6cc73c4abc1523ac5dd02606c90d4e42da64823942d787694c1f [fedora@master ~]$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6122ac7d4dff mysite “/usr/sbin/httpd -D 37 seconds ago Up 35 seconds 0.0.0.0:32768->80/tcp evil_bardeen e5032443ab69 cockpit/ws “/container/atomic-r 16 minutes ago Up 16 minutes stoic_sammet [fedora@master ~]$ curl localhost:32768 Hello World! [/bash]

在最后的命令行输出中,成功的看到了Hello World!的出现。用的是curl的命令行 web 浏览器。