剛剛落下帷幕的 DockerCon 2017 引燃了整個 Docker 社區。除了主場,我還發現一個比較有意思的環節,叫做 Cool Hacks。

每年的 DockerCon Cool Hacks 都會推出一些比較酷的特性和產品。今年就推出了這個開源項目: Play With Docker,我把它叫做 Docker 在線實驗室。


1

簡介

Play With Docker ( Docker 在線實驗室) 是一個運行在瀏覽器中的 Docker Playground,無需安裝任何環境,就可以在線體驗 Docker。

今年 3 月,我基於開源版本做了本地化和鏡像優化,並部署在網易雲基礎服務(蜂巢)中,非常實用,收效甚佳,歡迎點擊閱讀原文上去體驗。

2

作用

一個 Docker 在線環境有什麼作用呢?

你看到一個不錯的 Docker 應用,或是 Docker 教程,想馬上動手一試,苦於當下沒有現成的環境

國內的網絡,安裝 Docker 和下載 Docker 鏡像都不盡人意,你不想浪費時間

本地雖有 Docker 環境,但無奈內存或磁盤等資源不夠,你不想浪費資源

如有以上的幾種場景,Docker 在線實驗室都可以為你提供便利。

3

頁面介紹

Docker 實驗室共兩個頁面,一個歡迎頁,一個主界面。


(點擊進入 Docker 在線實驗室會看到一個歡迎頁)


(主界面)

兩個頁面設計簡潔明了,無需贅述功能,大家可直接上手試用。這裏僅介紹下幾個有意思的特性:

每次開啟實驗室就相當於一個獨立的 Session,如果想訪問同一個實驗室,請記住你的 URL,特別是後面一串隨機字符串,否則你只能重建一遍,或者在公眾號後台留言聯繫我。

有實驗室就要有工作台,工作台本身就是一個獨立的 Docker 容器,基於 Alpine Linux 操作系統,其中再預裝 Docker 環境,背後用到的正是 Docker in Docker 技術 (又稱 DIND)

每一個工作台有一個交互終端 (Terminal),用於遠程操作和實驗,簡潔實用

終端可以切換全屏 (快捷鍵 Alt+Enter),可以調整字體大小 (見設置),方便演示

每個工作台會提供 IP 信息,以及內存和 CPU 的使用率,用的是 docker stats 接口

支持 Web 應用在線部署和訪問 (見下一節中的 Nginx 實例)

工作台之間的 IP 是聯通的,支持集群管理,比如用 Swarm 管理 Docker 集群

其它特性還有待你來發現。

當然,因為應用部署在雲主機中,雲主機畢竟資源有限,對實驗室和工作台都會有一些限制:

為防止資源佔據太久,每個實驗室會有時間限制,默認為 3 小時,所以在你不使用時,最好點擊關閉實驗室,節約資源

為防止資源佔據太多,工作台有個數上限,默認為 5 個

為了防止自動不斷的創建實驗室,會有 Google 人機驗證過程 (該限制我暫時去掉,提高體驗)

特別提醒: 該實驗室是一個 Docker 沙盒環境,注意個人信息保密!

同時,也做了一些其他優化:

暫時去掉了 Google 人機驗證,方便沒有翻牆的用戶,提高用戶體驗

工作台鏡像保持最新 Docker 社區版本,當前是 17.05.0-ce

為快速拉取鏡像,添加了多個鏡像加速器 (包括網易雲、阿里雲和 DaoCloud)

使用 Haproxy 做了簡單負載和路由,所以你在 URL 中可以看到 host1 和 host2 兩種地址

部署在網易雲基礎服務的雲主機中

如有發現實驗室不可用或任何其他問題,歡迎在公眾號後台留言。

4

使用介紹

以 Hello world 和 Nginx 為例,初步介紹該實驗室的使用。

1. Hello world

訪問實驗室首頁, 點擊開啟一個新實驗室,點擊 “創建工作台”,點擊終端界面(Alt+Enter 可切換全屏)。

在終端中,運行 Hello world:

docker run hello-world

繼而會下載鏡像並運行容器,終端輸出如下:


2. Nginx

在終端中運行 Nginx:

docker run -d -p 8080:80 nginx

同樣也會下載鏡像並運行容器,-d 將容器置於後端運行,-p 設置端口映射。

此時,在控制台的 IP 地址右邊 (需 Alt+Enter 切換為非全屏),將會出現你映射的容器端口。


點擊后可以訪問你的 Web 應用。


是不是很酷!那麼,這麼酷的 Docker 實驗室是怎麼獨立部署的?接下來我就講一下部署方法,會分為本地部署和在線部署兩種方式進行講解。

5

如何部署

1. 本地部署

無論是調試還是開發需要,本地部署都非常有必要,這裏將從代碼級別,以 Mac 為例來介紹如何做本地部署。

前置條件準備以下環境:

操作系統:Mac、Linux、Windows 不限,推薦 Mac 和 Linux,這裏以 Mac 為例

安裝 git:用於 clone 代碼倉庫,更新依賴

安裝 go:要求 1.7.1+,當前最新 1.8.2,安裝方式多樣,可參考官網安裝,Mac下 brew 安裝也非常方便,我還推薦一種跨平台多版本管理的安裝方式: gvm 。

安裝 Docker:要求 1.13+,當前最新 17.05.0-ce,官方文檔非常詳細,Mac 下推薦使用 Docker for Mac,Windows 下推薦使用 Docker for Windows

安裝 docker-compose:當前最新 1.13.0,推薦命令行安裝,如果安裝了 Docker for Mac 或 Docker for windows,將自帶安裝 docker-compose,無需另行安裝

安裝部署

1) 本地環境需要開啟 swarm 模式,因為需要用到 swarm 的 overlay 網絡:

docker swarm init

2) 主動加載 IPVS 內核模塊:(實測 Mac 下不需要, Linux下操作沒問題)

sudo modprobe xt_ipvs

3) 下載基礎 Docker 鏡像:(後續執行 docker-compose up -d 也會自動下載)

docker pull hub.c.163.com/library/haproxy:1.7.5

docker pull hub.c.163.com/library/golang:1.8.2

docker pull hub.c.163.com/bingohuang/dind:17.05.0-ce-dind

4) 配置好 GOPATH 之後,在相應目錄下 clone 代碼:

mkdir -p $GOPATH/src/github.com/bingohuang && cd $GOPATH/src/github.com/bingohuang

git clone https://github.com/bingohuang/docker-labs.git

cd docker-labs

5) 使用 go get 安裝工程依賴:(從 Github 下載依賴代碼,有代理速度更佳)

go get -v -d -t ./…

6) 容器編排運行,在工程目錄下執行 docker-compose 相關命令,確保 80 端口未被佔用,或者修改 docker-compose.yml 文件中的 haproxy 的端口

docker-compose up -d – 後台啟動容器

docker-compose log -f- 查看容器日誌

docker-compose down- 刪除所有容器

7) 日誌中無明顯錯誤,可在瀏覽器中訪問看看:http://localhost ( 確保 hosts 中綁定了 localhost 到 127.0.0.1 的映射)

首先看到 歡迎界面,點擊開啟一個新實驗室

接着來到 實驗室界面,點擊+創建工作台

正常彈出 工作台界面,右側會出現終端及 node 信息

在終端中輸入 docker version docker info ,如能正常查看到 docker 版本和信息,說明部署成功

2. 在線部署

在線部署可以讓你隨時隨地在線訪問,並且讓更多的人用到你的實驗室。如果想搭建一個在線的 Docker 實驗室,只需要使用雲主機和 Docker 即可。這裏將藉助網易雲基礎服務(蜂巢)的雲主機和 Docker ,來介紹下如何做在線部署。

前置條件

和本地部署不同的是,這裏首先需要準備一台雲主機,再就是安裝 Docker :

1)創建雲主機 :一台雲主機必不可少,推薦 Linux 操作系統,這裏以 Debian 8 為例,步驟如下:

註冊並登錄網易雲控制台,選擇雲計算基礎服務,選擇雲主機

點擊 創建雲主機,接下來的界面很好理解,鏡像推薦選擇 Debian 8.6,規格按自己需求而定,記得添加秘鑰,方便後續 SSH 登錄,最後點擊立即創建

很快虛擬機就創建成功,默認只有內網 IP,我們先不急着綁定外網,可以通過 VPN + 秘鑰,登錄到該雲主機當中

注:後續如果需要對外訪問,還是需要綁定外網,在雲主機詳情頁即可進行綁定操作


2)安裝 docker:需 SSH 登錄到雲主機上,安裝 docker 可參考官網安裝說明,還有一鍵安裝方式,如下:

curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh –

安裝部署

在線部署在本地部署的基礎上做了簡化,省去了從代碼層面執行的過程,相應的步驟如下:

1) 開啟 swarm 模式,加載 IPVS 內核模塊:

docker swarm init

sudo modprobe xt_ipvs

2)下載 Docker 鏡像:

docker pull hub.c.163.com/bingohuang/dind:17.05.0-ce-dind

docker pull hub.c.163.com/bingohuang/docker-labs:1.0

注:為了簡單起見,可以用我打好的公開鏡像,如需自己打鏡像,可以參考代碼倉庫中的 docker-build.sh腳本、Dockerfile.build 和 Dockerfile.dind

3)部署相對簡單多了,只需要執行一個腳本 docker-run.sh:

$ ./docker-run.sh 1.0 17.05.0-ce-dind

第一個參數 1.0 表示 docker-labs 的鏡像版本,第二個參數 17.05.0-ce-dind 表示 dind 的鏡像版本。

腳本內容如下,具體步驟參考註釋:

#!/bin/bash

# 讀取兩個鏡像版本

labs_version=$1

echo“labs_version=$labs_version

dind_version=$2

echo“dind_version=$dind_version

# 拉取或更新兩個鏡像

docker pull hub.c.163.com/bingohuang/docker-labs:$labs_version

docker pull hub.c.163.com/bingohuang/dind:$dind_version

# 刪除之前的容器

docker rm -f docker-labs

# 運行容器,注意注入環境變量

docker run -d \

–publish=80:3000 \

–volume /var/run/docker.sock:/var/run/docker.sock \

-e GOOGLE_RECAPTCHA_DISABLED=”true” \

-e DIND_IMAGE=”hub.c.163.com/bingohuang/dind:$dind_version” \

-e EXPIRY=”3h” \

–name docker-labs \

hub.c.163.com/bingohuang/docker-labs:$labs_version

# 查看容器實時日誌

docker logs -f docker-labs

4) 檢驗是否部署成功

通過 docker ps -a 查看容器狀態

通過 docker logs -f docker-labs 查看容器

通過 curl http://localhost 查看是否聯通

如果你連接了雲主機的 VPN,此時也可以在瀏覽器中通過內網 IP 訪問

5) 綁定公網 IP

在雲主機詳情頁綁定公網 IP,比如我這裏綁定的公網IP是:59.111.97.225

瀏覽器打開 http://59.111.97.225/ 可以看到歡迎頁

但要想正常開啟一個新實驗室,還需綁定域名

6) 本地域名綁定

此種方法簡單,只需添加 hosts,檢驗是否部署成功,類似如下:

59.111.97.225 docker-labs.com

59.111.97.225 host1.docker-labs.com

如果你創建了一個帶端口訪問的 Docker 容器,想要訪問該端口,還要添加如下類似的綁定:

59.111.97.225 pwd10_0_3_3-80.host1.docker-labs.com

以上綁定略顯繁瑣,更方便的方法是在本地架設一台 dnsmasq 服務器,並添加如下配置:

address=/localhost/127.0.0.1

7) 公網域名解析

如果你有公網域名(比如我的 bingohuang.com),就可以設置域名解析,將 labs.bingohuang.com 和 *.labs.bingohuang.com 都指向該公網 IP 即可

最後訪問你綁定的公網域名,你就擁有了 Docker 在線實驗室了

6

小結

總的來說,Docker 在線實驗室,提供了一個讓你輕快體驗在雲上構建和運行 Docker 容器的環境。每個雲上的環境都是一個獨立的沙盒(Docker 容器),沙盒中再套容器,即 DIND(Docker-in-Docker)技術,沙盒基於 Alpine Linux 操作系統,配備最新 Docker 社區版本,最終,讓你隨時玩轉 Docker。

(部分圖片來源於網絡,侵權刪)

參考資料

Docker Labs 網易雲版 – 訪問無障礙

(http://labs.bingohuang.com/)

Docker Labs 開源地址

(https://github.com/bingohuang/docker-labs)

Docker Cool hacks

(https://blog.docker.com/2017/04/dockercon-2017-mobys-cool-hack-sessions/)

Play with Docker 官方體驗版 – 請自備梯子

(http://labs.play-with-docker.com/)

Play with Docker 開源地址

(https://github.com/play-with-docker/play-with-docker)

以上由網易企業服務-企業信息化服務提供商:湖南領先網絡科技 整理髮布。

網易企業服務(qiye163.co)是網易憑藉其20年品牌優勢與經驗打造的企業級產品矩陣,致力於提供一站式企業信息化解決方案。網易企業服務的推出是網易在企業郵箱的基礎上對企業市場的進一步重要布局。湖南領先網絡科技是網易企業產品一級經銷商,專業為企業提供網易企業郵箱、網易辦公套件、網站建設、域名註冊等一站式信息化解決方案。