«

Play with Docker - 非常酷的Docker在线实验室 (下)

play-with-docker

一、简介

文章上篇,介绍了Docker在线实验室的特性及使用,发表之后,吸引了不少同学上来体验试用,本着知其然并知其所以然的宗旨,不少同学还很想知道这么酷的Docker实验室是怎么独立部署的?那这篇文章就给大家介绍如何部署这个Docker在线实验室,分为本地部署在线部署两种方式。

二、本地部署

本地部署对于调试和开发,都非常有必要,这里将从代码级别,以 Mac OS为例,来介绍如何做本地部署。

1、前置条件

在本地部署之前,需准备以下环境: 1. 操作系统:Mac、Linux、Windows 不限,推荐Mac和Linux,这里以Mac为例
2. 安装 git:用于clone代码仓库,更新项目依赖
3. 安装 go:要求 1.7.1+,当前最新1.8.2,安装方式多样,可参考官网安装,Mac下 brew 安装也非常方便,我还推荐一种跨平台多版本管理的安装方式 gvm ,具体可以参考这篇文章
4. 安装Docker:要求 1.13+,当前最新17.05.0-ce官方文档非常详细,不再赘述。Mac下推荐使用 Docker for Mac,Windows下推荐使用Docker for Windows
5. 安装 docker-compose:当前最新 1.13.0,推荐命令行安装,如果安装了Docker for MacDocker for windows,将自带安装 docker-compose,无需另行安装

2、本地部署

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 中绑定了 localhost127.0.0.1 的映射 - 首先来到 欢迎界面,点击开启一个新实验室 - 接着看到 实验室界面,点击+创建工作台 - 正常会弹出 工作台界面,右侧会出现终端及node信息 - 在终端中输入 docker version docker info ,如能正常查看到 docker 版本和信息,说明部署成功 - (使用详情见Play with Docker - 非常酷的Docker在线实验室 (上)

三、在线部署

在线部署可以让你随时随地的在线访问,并且让更多的人用到你的实验室。如果想搭建一个在线的Docker实验室,只需要使用云主机和Docker即可。这里将借助网易云基础服务的云主机和Docker,来介绍如何做在线部署。

1、前置条件

和本地部署相比,首先准备一台云主机,再 就是安装Docker即可:

1) 创建云主机:一台云主机必不可少,推荐 Linux 操作系统,这里以 Debian 8 为例,步骤如下:
- 注册并登录网易云控制台,选择云计算基础服务,选择云主机 - 点击 创建云主机,接下来的界面很好理解,镜像推荐选择 Debian 8.6,规格按自己需求而定,记得添加秘钥,方便后续SSH登录,最后点击立即创建 - 很快虚拟机就创建成功,默认只有内网IP,我们先不急着绑定外网,可以通过 VPN+秘钥,登录到该云主机当中 - 注:后续需要对外访问,还是需要绑定外网,在云主机详情页即可绑定操作 163yun-vm-create

2) 安装 docker:需SSH登录到云主机之上,安装 docker可参考官网安装方式,或参考这篇文章,还有一键安装方式,如下:
- curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -

2、在线部署

在线部署在本地部署的基础上做了简化,省去了从代码层面执行的过程,相应的步骤如下:

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.buildDockerfile.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容器(参见上篇的Nginx示例),要想访问该端口,还要添加如下类似的绑定: - 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在线实验室了,是不是很酷呢!

四、小结

总的来说,Docker在线实验室,提供了一个让你轻快的体验在云上构建和运行Docker容器的环境。每个云上的环境都是一个独立的沙盒(Docker容器),沙盒中再套容器,即 DIND(Docker-in-Docker)技术,沙盒基于 Alpine Linux 操作系统,配备最新 Docker 社区版本,最终,让你随时玩转 Docker。

五、参考链接

分享