10分鐘內藉助LinuxKit引導OpenSSH伺服器
我們在本文中將逐步介紹使用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
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
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文件中:
首先編輯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/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/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虛擬機:
Welcome to LinuxKit
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.5.0
PRETTY_NAME="Alpine Linux v3.5"
HOME_URL="http://alpinelinux.org"
正如你所見,該系統運行containerd和runc:
356 root 0:00 /usr/bin/containerd
...
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伺服器中的一台,也可以同時連接兩台。
10:45:39 up 29 min, load average: 0.00, 0.02, 0.00
10:45:40 up 1 min, load average: 0.00, 0.00, 0.00
/ #
結束語
這個很簡單的例子表明了如何藉助一項實用的系統服務構建可引導的映像,然後連接至它。讓人覺得這個項目帶來了無盡的機會。我很想看看別人會如何靈活地使用這個工具。
如果你是谷歌雲用戶,可以在谷歌雲端同樣輕鬆地引導映像。PacketHost甚至支持引導我們就在裸機伺服器上構建的映像。
·Raspberry Pi怎麼樣?
我認為,從概念上來說,LinuxKit最終有望為32位的Raspberry Pi架構構建映像,但這需要對用來構建系統的內核和映像進行一番調整和移植。眼下,想開始入手Raspberry Pi,最容易的方法就是藉助Raspbian映像和我撰寫的教程系列。
RancherOS是一種操作系統,使用Docker作為起點,通過Docker容器來運行所有系統服務。LinuxKit以一種非常相似的方式來運行,但是直接使用containerd,而不是使用Docker。


※技術人注意這個!小心被處五年以上有期徒刑!
※谷歌將在年底推出量子晶元,將創造又一個計算機史上的里程碑
※Linux基金會開源物聯網邊緣計算項目:EdgeX Foundry
※Java 的日子屈指可數
TAG:雲頭條 |
※在 Ubuntu 18.04 LTS 無頭伺服器上安裝 Oracle VirtualBox
※re:Invent 2018:AWS擴展Lambda無伺服器功能 新增Kafka管理服務
※如何在Ubuntu 18.04伺服器上安裝TensorFlow(Nvidia GPU)
※EchoStreams基於AMD EPYC的伺服器可配備108個Intel Ruler固態硬碟
※Linux Ubuntu搭建Git伺服器
※PUBG Xbox One獲得Oceanic伺服器
※OpenMandriva Lx 4.0 發布,Linux 桌面與伺服器發行版本
※TYAN於Computex2018展示支持AMD EPYC處理器伺服器
※Nginx+FastDFS圖片伺服器搭建
※Intel下代伺服器Cascade Lake發貨:10nm Ice Lake 2020年見
※Docker環境下搭建DNS LVS(keepAlived) OpenResty伺服器簡易集群
※首款搭載國產CPU的域名伺服器發布;iPhone徹底淘汰Lightning介面?ChromeOS 75發布 | 極客頭條
※2U機架伺服器 戴爾 PowerEdge R730xd促
※Hitachi Vantara升級Skylaking伺服器加入Optane緩存和GPU
※windows上運行的SSH伺服器-OpenSSH 總結
※Cray支持英特爾Xeon Gold Platium 9200處理器:448核伺服器來了
※VSCode 引入 Python 語言伺服器;Canonical 請求幫助測試 Ubuntu 伺服器安裝程序
※Eurocom發布Tornado F7 SE伺服器式筆記本:最多支持22TB硬碟
※Linux伺服器下的HTTP抓包分析
※Netcraft 6月Web 伺服器排名:Nginx有望超越Microsoft,Apache持續走低