IBM Bluemix Docker容器初步体验

现在国内外流行的云平台越来越多,且不谈像国外的 Amazon ECS、AWS 以及 国内的阿里云、BAE、SAE 这些老牌的云服务,目前提供 Docker 容器服务的平台也多起来,国外有 StackEngine、Tutum、IBM Bluemix 等云平台,国内也有 DaoCloud、时速云、灵雀云之类提供 Docker 容器服务的平台。最近对 Docker 也稍微有了点兴趣,比较之下准备拿 IBM Bluemix 来捣鼓 Docker 容器练练手。

本文不打算对 Docker 容器技术本身对什么介绍了,选择 IBM Bluemix 开发平台的主要原因是:

  • 同时支持运行时(基于 Cloud Foundry)、容器和虚拟机(基于 openstack);
  • 服务器在国外,绑定域名不需要备案,这个优势我也挺无奈;
  • 免费账户提供两个公网 IP、每个月有 365 GB-小时的运行内存额度(相当于一个 512MB 内存的容器运行一个月),能基本满足需求;
  • 容器可以开启多个自己指定的 TCP 端口;
  • IBM 出的货应该还比较稳定。

有关 IBM Bluemix 的详情请参考官网:

http://www.ibm.com/cloud-computing/bluemix/cn-zh/

注册账户什么的这里就不说了,Bluemix 的免费账户有 30 天的试用期,30 天之后添加有效的信用卡就可以继续使用免费额度内的运行时和容器。

Bluemix 提供了 Cloud Foundry 命令行界面 (cf) 来修改应用程序、服务实例和服务绑定,Cloud Foundry CLI 也可以安装 IBM Containers 插件以实现命令行方式管理 Docker 容器。考虑为了熟悉 Docker 命令行的目的,而且 Bluemix 容器中有一些高级功能使用 IBM Containers 插件(cf ic)可以很方便的完成,本文就主要介绍以 IBM Containers 插件(cf ic) CLI 命令的方式管理你的 Bluemix 容器。

IBM Containers 插件 (cf ic) 的官方文档请参考这里:

https://console.ng.bluemix.net/docs/containers/container_cli_cfic.html

安装 cf ic 插件

cf ic 插件的具体安装步骤可以参考 IBM 官方文档,这里我做个简单的说明。

IBM Containers 插件 (cf ic) 需要依赖 Docker 1.6 以上版本,而 Docker 官方推荐在 Linux 3.8 以上版本的 64 位系统中运行,我使用的 Chromebook 刚好能满足要求,在 Crouton 的 Ubuntu 14.04 环境中安装 Docker 非常简单:

(trusty)zzm@localhost:~$ sudo apt-get install docker.io

接着需要从 https://github.com/cloudfoundry/cli/releases 下载安装 Cloud Foundry 命令行界面 (cf)。

按照 IBM 官方文档介绍的使用 cf 命令安装容器插件时遇到报错:

(trusty)zzm@localhost:~$ cf install-plugin https://static-ice.ng.bluemix.net/ibm-containers-linux_x64

**Attention: Plugins are binaries written by potentially untrusted authors. Install and use plugins at your own risk.**

Do you want to install the plugin https://static-ice.ng.bluemix.net/ibm-containers-linux_x64? (y or n)> y

Attempting to download binary file from internet address...
10138400 bytes downloaded...
Installing plugin /tmp/ibm-containers-linux_x64...
FAILED
exit status 2

插件已经下载成功,但运行时直接报错,没办法我使用上面的地址手工下载 ibm-containers-linux_x64 之后运行,看具体是什么导致的运行出错:

(trusty)zzm@localhost:~$ ./ibm-containers-linux_x64
panic: Asset i18n/resources/zh_Hans.all.json not found

goroutine 1 [running]:
github.com/ibm-containers/i18n.initWithLocale(0x8899d0, 0x7, 0x8899d0)
        /home/jenkins/workspace/Containers-CCSCLI/containers-dcscli/plugins/src/github.com/ibm-containers/i18n/i18n.go:61 +0x72
github.com/ibm-containers/i18n.Init(0x7fa7674a3558, 0xc20802eaf0, 0x7fa7674a3658, 0xac8a10, 0xe)
        /home/jenkins/workspace/Containers-CCSCLI/containers-dcscli/plugins/src/github.com/ibm-containers/i18n/i18n.go:55 +0x124
github.com/ibm-containers/i18n.init()
        /home/jenkins/workspace/Containers-CCSCLI/containers-dcscli/plugins/src/github.com/ibm-containers/i18n/i18n.go:41 +0x199
main.init()
        /home/jenkins/workspace/Containers-CCSCLI/containers-dcscli/plugins/src/github.com/ibm-containers/wrapper_docker.go:55 +0x78

goroutine 6 [runnable]:
os/signal.loop()
        /usr/local/go/src/os/signal/signal_unix.go:19
created by os/signal.init·1
        /usr/local/go/src/os/signal/signal_unix.go:27 +0x35

看起来是加载中文语言信息(我的 Ubuntu 默认语言就是中文)时出错然后直接退出了,试试直接把语言设为英文运行看看:

LANG=en_US.UTF-8 cf install-plugin https://static-ice.ng.bluemix.net/ibm-containers-linux_x64
......
(trusty)zzm@localhost:~$ cf plugins
Listing Installed Plugins...
OK

Plugin Name      Version   Command Name   Command Help   
IBM-Containers   0.8.826   ic             IBM Containers plug-in

这下果然就没有报错了,cf ic 插件安装成功,使用 cf plugins 命令可以列出所有安装的 Cloud Foundry 插件。

初步使用 cf ic 插件

首先使用 cf login 命令登录到区域服务器,目前 Bluemix 有美国南部、悉尼、英国这 3 个区域,这里我使用美国南部(其它区域更换 login 后面的地址即可),输入邮箱和密码登录之后就可以看到区域信息:

(trusty)zzm@localhost:~$ cf login -a https://api.ng.bluemix.net
API endpoint: https://api.ng.bluemix.net

Email> xxx@gmail.com
Password> 
Authenticating...
OK

Targeted org xxx@gmail.com
Targeted space zohead

API endpoint:   https://api.ng.bluemix.net (API version: 2.40.0)
User:           xxx@gmail.com
Org:            xxx@gmail.com
Space:          zohead

然后需要初始化 CLI:

(trusty)zzm@localhost:~$ cf ic init

初始化完成之后可以运行 cf ic info 获取容器云服务的状态:

(trusty)zzm@localhost:~/bluemix$ cf ic info
Date/Time                : 2016-03-18 03:02:01.808641119 +0800 CST
Debug Mode               : false
Host/URL                 : https://containers-api.ng.bluemix.net
Registry Host            : registry.ng.bluemix.net
Bluemix API Host/URL     : https://api.ng.bluemix.net
Bluemix Org              : xxx@gmail.com(xxx-xxx-xxx-xxx-xxx)
Bluemix Space            : zohead(xxx-xxx-xxx-xxx-xxx)
CLI Version              : 0.8.826
API Version              : 3.0 2028 2016-03-16T19:34:24
Namespace                : zohead
Environment Name         : prod-dal09-vizio3
Containers Limit         : Unlimited
Containers Usage         : 0
Containers Running       : 0
CPU Limit (cores)        : Unlimited
CPU Usage (cores)        : 0
Memory Limit (MB)        : 2048
Memory Usage (MB)        : 0
Floating IPs Limit       : 2
Floating IPs Allocated   : 0
Public IPs Bound         : 0

可以看到试用账户的内存使用限制是 2GB,可以使用两个 IP 地址。

使用 cf ic 构建 Docker 容器

一般情况下你都可以使用 Bluemix 官方提供的 Docker 镜像进行快速构建,由于通常的 Docker 镜像只是为了运行特定的程序或服务设计的会有不少限制,无法满足我要调试运行多个程序的需求,而且为了后续 SSH 登录之类的考虑,我准备使用 Baseimage-docker 这个比较特殊的 Docker 镜像来构建容器。

首先在当前目录下生成 Dockerfile 文件:

(trusty)zzm@localhost:~/bluemix$ cat > Dockerfile 
# Use phusion/baseimage as base image.
# See https://github.com/phusion/baseimage-docker/blob/master/Changelog.md for a list of version numbers.
FROM phusion/baseimage:0.9.18

EXPOSE 22 80 443 9080 9443

# Use baseimage-docker's init system.
CMD ["/sbin/my_init"]

# ...put your own build instructions here...

# Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

Dockerfile 文件简单说明如下:

  • FROM 后面的 phusion/baseimage:0.9.18 表示 Docker 镜像的地址和版本,具体使用哪个版本请参考上面注释里的 Changelog.md 文档;
  • EXPOSE 表示此 Docker 容器要导出哪些 TCP 端口以使外部能访问到容器。

提示

IBM Bluemix 目前对容器导出的端口有严格的限制,只有常用端口才能导出,官方论坛里列出的可用端口为:
22,80,443,9080,9443

不属于上面列出的其它端口就算通过 Dockerfile 导出也无法访问。

同时需要注意的是使用 Dockerfile 构建容器完成之后就不能再修改导出的端口了,想再换别的端口只能删除旧容器重新构建,因此开始的端口选择需要谨慎。

总之我的 Dockerfile 文件将可用的 5 个端口都导出了,下面使用 cf ic build 命令构建容器:

(trusty)zzm@localhost:~/bluemix$ cf ic build -t zohead-server:v1 .

上面的 zohead-server 为新的容器名字,最后的 . 参数表示 Dockerfile 文件所在的目录(. 即当前目录)。

容器构建完成之后如果没有什么问题就可以用 cf ic run 命令启动新容器了:

cf ic run --name=zohead-server -m 512 -p 22 -p 80 -p 443 -p 9080 -p 9443 registry.ng.bluemix.net/`cf ic namespace get`/zohead-server:v1

cf ic run 命令的 --name 参数指定容器名字;-m 参数则是为新容器分配的内存大小,为了不超过免费额度我分配了 512MB;-p 参数指定公开用于 TCP 流量的端口,可以指定多个,这里我指定的 5 个端口和 Dockerfile 文件中的一致。

启动容器成功之后等待一段时间就可以使用 cf ic ip list 命令查看 IBM Bluemix 为你的容器分配的公网 IP 地址,公网 IP 地址分配成功之后才可以直接访问容器中的服务:

(trusty)zzm@localhost:~/bluemix$ cf ic ip list
Number of allocated public IP addresses: 1

Listing the IP addresses in this space...
IP Address       Container ID   
134.168.27.107   xxx-xxx-xxx-xxx-xxx

上面列出的 IP Address 就是为容器分配的公网 IP 地址,由于我使用的是美国南部区域,分配的公网 IP 地址 ping 值不是特别理想。

访问 Docker 容器

即使容器没有分配正确的公网 IP 地址,我们也可以使用 cf ic exec 命令直接访问容器执行命令:

(trusty)zzm@localhost:~/bluemix$ cf ic exec zohead-server echo "Hello Bluemix"
Hello Bluemix

当然也可以使用 cf ic exec 命令直接开启一个连接到容器的 Bash Shell 终端:

(trusty)zzm@localhost:~/bluemix$ cf ic exec -t -i zohead-server bash -l

有了公网 IP 地址之后,你就可以参考 Baseimage-docker开启 SSH 的说明启用 SSH 证书登录了,这里也比较简单我就不做介绍了。

Bluemix Docker 容器能够 SSH 登录之后就比较方便了,Baseimage-docker 镜像里自带了 Python 3 支持,我们可以直接使用 Python 3 运行一个最简单的 Web 服务器验证导出的 TCP 端口能否正常访问:

root@instance-001afe36:/home/wwwroot# python3 -m http.server 80

由于 Bluemix 容器用的是 IBM Containers,我们可以用 capsh 命令看看 Bluemix 是否和其它 Docker 容器服务一样存在权限限制:

root@instance-001afe36:~# capsh --print
Current: = cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap+eip
Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
Securebits: 00/0x0/1'b0
 secure-noroot: no (unlocked)
 secure-no-suid-fixup: no (unlocked)
 secure-keep-caps: no (unlocked)
uid=0(root)
gid=0(root)
groups=0(root)

看起来限制和常见的 Docker 平台也差不多,没有一些特别的系统管理权限,例如我想测试的基于 tun 驱动的开源 VPN 服务也无法使用了。

监控 Bluemix 容器运行状态

一番使用下来你会发现参考 Bluemix 官方的文档就可以基本只用 cf ic 命令实现完成创建、构建、运行和管理 Bluemix 容器这一整套操作了。如果你要监控容器的历史运行状态或者要查看账单之类的那可能还是需要访问 Bluemix Web 控制台的,这个是我的 Docker 容器运行时的内存使用情况:

基本的功能在 Bluemix Web 控制台里也是可以完成的,如果使用中遇到问题可以在 Web 控制台里创建技术支持工单(只是 IBM 的技术支持响应速度似乎很慢的)。

注意

我在试用 Bluemix 容器的时候发现有一个不太容易被注意到的坑就是容器里使用 free 或者 top 等命令看到的内存非常大(远远超过我分配的 512MB,似乎显示的是实际服务器的总体内存,而且容器里的程序也能分配超过 512MB 的内存,因此容器里实际运行的程序内存占用需要注意不要超过限额。


你也可以在 Web 控制台中点击账户图标,然后进入「管理组织」设置,这里可以修改当前区域的运行时和容器使用配额:

经过十几天对 IBM Bluemix Docker 容器的试用来看,虽然 IBM 的服务器不在国内,但 Bluemix 容器还算是比较稳定的,对于一般的开发者来说调试运行一些服务程序也是比较方便的。

一般用户使用这种容器服务最多的用途像跑博客之类的 Web 服务是没什么问题的,不过国内似乎不少人只是用 Bluemix 容器跑 Shadowsocks 代理了(真的算是国内用户的刚性需求了么 -_-#),对此我只能说 IBM Bluemix 目前还是比较良心的,大家且用且珍惜请不要滥用呢,最后祝玩的开心 ~~~。