如何部署一个酷酷的 Docker 在线实验室

社区编辑2018-05-18 15:32

刚刚落下帷幕的 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 如何部署

 

本地部署

 
无论是调试还是开发需要,本地部署都非常有必要,这里将从代码级别,以 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)