10分钟内借助LinuxKit引导OpenSSH服务器
2017-04-26 编辑:
我们在本文中将逐步介绍使用Docker的LinuxKit,构建、运行和使用连接至内置OpenSSH的可引导Linux系统映像。就本文中的例子而言,你需要Docker for Mac,但LinuxKit可以创建在许多类型的系统上引导的映像。
Dockercon大会期间,在奥斯汀的一家星巴克首次运行LinuxKit。
LinuxKit是个激动人心的新项目,它从Docker的内部派生出来。它旨在构建可引导的Linux系统,而这种系统可以在裸机、云端或Docker容器中运行,也可以通过HyperKit(用于Docker for Mac的虚拟机管理程序)来运行。一个很小的init进程启动系统,然后其余一切经由containerd,通过容器来运行。
containerd是Docker的低级容器技术。
只需10分钟即可入手
从https://golang.org/dl/安装和配置go。
安装并启动Docker for Mac,选择边缘版本(我用的是17.05.0-ce-rc1-mac8)。
我想为大家演示如何在大约10分钟内构建和运行一台SSHD服务器。我们将使用由罗尔夫·纽格鲍尔(Rolf Neugebauer)在Dockercon的全体大会上演示的一个例子。
开始入手
先获取LinuxKit的代码,然后编译构建代码。
# git clone https://github.com/linuxkit/linuxkit
现在进入到目录,开始执行make:
# cd $GOPATH/src/github.com/linuxkit/linuxkit
# make
你会看到类似这样的输出结果:
tar cf - vendor src/initrd src/pad4 -C src/cmd/moby . | docker run
--rm --net=none --log-driver=none -i -e GOOS=darwin -e GOARCH=amd64
linuxkit/go-
compile:4513068d9a7e919e4ec42e2d7ee879ff5b95b7f5@sha256:bdfadbe3e4e
c699ca45b67453662321ec270f2d1a1dbdbf09625776d3ebd68c5 --package
github.com/linuxkit/linuxkit --ldflags "-X
main.GitCommit=90d459a82eac9111a08795d6e2a89f32c270e41e -X
main.Version="0.0" " -o bin/moby > tmp_moby_bin.tar
gofmt...
govet...
golint...
ineffassign...
go build...
tar xf tmp_moby_bin.tar > bin/moby
rm tmp_moby_bin.tar
touch bin/moby
tar cf - vendor -C src/cmd/infrakit-instance-hyperkit . | docker
run --rm --net=none --log-driver=none -i -e GOOS=darwin –e
GOARCH=amd64 linuxkit/go-
compile:4513068d9a7e919e4ec42e2d7ee879ff5b95b7f5@sha256:bdfadbe3e4e
c699ca45b67453662321ec270f2d1a1dbdbf09625776d3ebd68c5 --package
github.com/linuxkit/linuxkit -o bin/infrakit-instance-hyperkit >
tmp_infrakit_instance_hyperkit_bin.tar
gofmt...
govet...
golint...
ineffassign...
go build...
tar xf tmp_infrakit_instance_hyperkit_bin.tar > bin/infrakit-
instance-hyperkit
rm tmp_infrakit_instance_hyperkit_bin.tar
touch bin/infrakit-instance-hyperkit
这构建了两个新的CLI,名为moby和linuxkit,它们可以用来构建和启动可引导的系统。
安装新的moby和linuxkit CLI:
sudo cp ./bin/moby /usr/local/bin
sudo cp ./bin/linuxkit /usr/local/bin
构建SSHD例子
我使用一些实用脚本组建了一个sshdkit Github代码库(https://github.com/alexellis/sshdkit),我们将把该代码库复制到当前文件夹,文章后面要用到它。
# git clone https://github.com/alexellis/sshdkit
# cd sshdkit
把你的公共SSH密钥放入到YAML文件中:
# cp sshd.example.yml sshd.yml
首先编辑sshd.yml示例文件,把你的ssh密钥放入到显示root/.ssh/authorized_keys的slot中:
- path: root/.ssh/authorized_keys
contents: "ssh-rsa ...."
ssh密钥将放在$HOME/.ssh/id_rsa.pub中,如果没有该文件,那么输入ssh-keygen,对于所有问题一律按回车键。
现在构建一个可引导的系统:
# moby build ./sshd.yml
你会看到moby CLI工具会将各个映像下拉出来,然后构建一个最终的软件包(包括最近的Linux内核)。
Extract kernel image: linuxkit/kernel:4.9.x
Add init containers:
Process init image: linuxkit/init:63eed9ca7a09d2ce4c0c5e7238ac005fa44f564b
Process init image: linuxkit/runc:b0fb122e10dbb7e4e45115177a61a3f8d68c19a9
Process init image: linuxkit/containerd:18eaf72f3f4f9a9f29ca1951f66df701f873060b
Process init image: linuxkit/ca-certificates:eabc5a6e59f05aa91529d80e9a595b85b046f935
Add onboot containers:
Create OCI config for linuxkit/sysctl:2cf2f9d5b4d314ba1bfc22b2fe931924af666d8c
Add service containers:
Create OCI config for linuxkit/rngd:3dad6dd43270fa632ac031e99d1947f20b22eec9
Create OCI config for linuxkit/dhcpcd:48e249ebef6a521eed886b3bce032db69fbb4afa
Create OCI config for linuxkit/sshd:e108d208adf692c8a0954f602743e0eec445364e
Add files:
root/.ssh/authorized_keys
Create outputs:
sshd-bzImage sshd-initrd.img sshd-cmdline
sshd.iso
sshd-efi.iso
你会看到当前文件夹中已构建了几个系统映像:
Create outputs:
sshd-bzImage sshd-initrd.img sshd-cmdline
sshd.iso
sshd-efi.iso
引导系统
现在只管输入下列内容,看看一个完整的Linux系统在终端中引导。一旦准备就绪,你将连接至BusyBox外壳,可以输入命令。
这会利用HyperKit项目作为虚拟机管理程序。若要关闭虚拟机,如果你已准备好,只需输入halt。
# linuxkit run -ip 192.168.65.100 sshd
Welcome to LinuxKit
/ # INFO[0000] starting containerd boot... module=containerd
...
INFO[0000] containerd successfully booted in 0.022888s module=containerd
- 000-sysctl
- dhcpcd
- rngd
- sshd
/ #
我们还分配了一个静态的IP地址,那样以后就能访问它。
要访问我们在HyperKit中启动的SSHD虚拟机,最容易的方法就是运行内置SSH客户软件和SSH密钥的Docker容器。
使用随附的实用脚本来构建该Docker映像:
# ./build.sh
现在运行Docker容器,这其实是Alpine Linux映像,已添加了SSHD,并已挂载了你的SSH密钥:
# ./run-client.sh
/ #
通过该Docker容器,我们就可以使用ssh客户软件连入至SSH虚拟机:
/ # ssh root@192.168.65.100
Welcome to LinuxKit
moby-025000000002:~# cat /etc/os-release
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.5.0
PRETTY_NAME="Alpine Linux v3.5"
HOME_URL="http://alpinelinux.org"
BUG_REPORT_URL="http://bugs.alpinelinux.org"
moby-025000000002:~# uname -a
Linux moby-025000000002 4.9.22-moby #1 SMP Fri Apr 14 12:32:33 UTC 2017 x86_64 Linux
正如你所见,该系统运行containerd和runc:
moby-025000000002:~# ps |grep containerd
356 root 0:00 /usr/bin/containerd
...
moby-025000000002:~# ps |grep runc
392 root 0:00 /usr/bin/runc run --bundle
/containers/services/dhcpcd --pid-file /run/dhcpcd.pid dhcpcd
408 root 0:00 /usr/bin/runc run –bundle
/containers/services/rngd --pid-file /run/rngd.pid rngd
420 root 0:00 /usr/bin/runc run --bundle
/containers/services/sshd --pid-file /run/sshd.pid sshd
引导多个SSDH虚拟机:
你可以引导额外的系统,只需要为它们分配单独的IP地址。这是boot.sh文件(linuxkit run -ip 192.168.65.100 sshd)的内容:
用独特的IP地址来引导:
# linuxkit run -ip 192.168.65.101 sshd
在我的台2016入门级Macbook 12英寸电脑上,这个过程只有约4至5秒,感觉相当快。
现在,你可以连接至那些SSHD服务器中的一台,也可以同时连接两台。
/ # ssh root@192.168.65.100 uptime
10:45:39 up 29 min, load average: 0.00, 0.02, 0.00
/ # ssh root@192.168.65.101 uptime
10:45:40 up 1 min, load average: 0.00, 0.00, 0.00
/ #
结束语
这个很简单的例子表明了如何借助一项实用的系统服务构建可引导的映像,然后连接至它。让人觉得这个项目带来了无尽的机会。我很想看看别人会如何灵活地使用这个工具。
如果你是谷歌云用户,可以在谷歌云端同样轻松地引导映像。PacketHost甚至支持引导我们就在裸机服务器上构建的映像。
·Raspberry Pi怎么样?