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 容器内存使用情况

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

注意

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


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

Bluemix 管理区域配额

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

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

IBM Bluemix Docker容器初步体验》上的评论

    1. 我的使用情况仪表盘里也是一直计费的,关注总的容器运行时每月不要超过 365 GB-hour;
      另外贴上我之前提交的工单的回复:
      We show that so far in April you have used 164.6 GB hours and have 1 IP. Free allowance credits for runtime and some services are shown only in the All Organizations view. The view you are seeing does not include the free allotments.
      你也可以问问,不过 IBM 工单回复的很慢,有时甚至不回复。

    1. 我之前在管理控制台页面里重启没问题,可以在 Web 控制台里停止再启动看看,不行可以运行 cf ic info 和 cf ic ps 检查容器状态;
      另外运行 “cf ic logs 容器名” 可以看看容器运行日志。

      1. 在web控制台也启动不了,用cf ic ps查看是没有运行中的容器,看logs最后一条就是
        **** Shutting down runit daemon (PID 9)…
        *** Killing all processes…

        看来只有重建了…
        另外web控制台的Vulnerability Advisor那些安全警告是否有影响?

  1. 的确,3月份并没有扣我的使用费。另外,超过512M的内存,貌似也没有增加内存使用的计数。
    我就运行了nginx+php+mysql,在控制台就显示我占用了750m….

  2. 我是win7 64位系统的,如何安装cf ic插件,docker已经安装好并且可以使用,
    https://static-ice.ng.bluemix.net/ibm-containers-linux_x64这里的是cf ic插件的linux 64版本吧,我用了这个命令提示C:\Users\Hui\.cf\plugins\temp238351127\987269473.exe: This version of %1 is not compatible with the version of Windows you’re running.Check your computer’s system information to see whether you need a x86 (32-bit) or x64 (64-bit) version of the program, and then contact the software publisher.
    意思是我是win7系统的不能用这个linux的cf ic插件吧,我把上面网址中的linux-x64改成了windows-x64之后显示错误,打开那个网址确实也没有,是cf ic插件并没有windows版本的么?
    我使用的docker是一个叫boot2 docker的可以在windows中使用,而且下载安装的时候还自带Oracle VM VirtualBox虚拟机,打开后里面有linux虚拟系统,开启虚拟系统之后再使用LANG=en_US.UTF-8 cf install-plugin https://static-ice.ng.bluemix.net/ibm-containers-linux_x64命令仍然无法安装cf ic插件,是哪里出了问题,小白一枚,望大神解惑

    1. 不好意思,被误判为垃圾评论了导致才看到。我这篇文章里介绍的都是在 Linux 系统下用 cf 工具哦。

      Cloud Foundry CLI 是有 Windows 版本的,从 GitHub 页面 上下载安装程序就可以;
      对应的 Windows 版本容器插件地址也不一样了:

      https://static-ice.ng.bluemix.net/ibm-containers-windows_x64.exe

      另外 Windows 上的 Boot2Docker 其实还是基于 Linux 虚拟机实现的;
      如果想在 Linux 下体验也可以登录到 Linux 虚拟机系统里安装 cf CLI 和容器插件哦。

      1. 又重新下了个正规点的linux系统成功创建了容器,现在的问题是居然没有给我公共ip,说着应该可以给我两个ip的,但是容器已经在运行了还是没有公共ip,问了下IBM客服说大陆地区还无法使用那两个公共ip,这也太假了吧,我说网上有大神教程人家都用的很欢了呢,客服就没话说了

        1. 你可以进 Bluemix 后台,进入容器配置界面,在公共 IP 那手工申请看看。

          或者通过 cf 命令申请:
          cf ic ip request
          申请之后同样用 cf 命令查看:
          cf ic ip list
          如果没有绑定到容器上,也能手工绑定:
          cf ic ip bind _ip_ _容器id_

  3. 容器启用ssh证书那一步,怎么把那些语句添加到dockerfile呢,说起来不怕大神笑话,我之前下了个linux镜像一路按照步骤下来把容器创建好了,那会儿没启用ssh证书,后来不小心把linux镜像删了,之前linux添加的功能全不见了,现在用cat是无效的,无法创建dockerfile(之前在一个学it的同学指点下成功用出了cat命令,现在再烦人家都不好意思了),实在没办法只能又来烦扰大神了,现在就差这ssh,否则无法连接容器啥都干不成

    1. Bluemix 容器我没有在 Dockerfile 里设置 SSH 证书,直接用 cf ic exec -t -i container-name-xxx bash -l 命令就可以直接连接容器;
      用 cf 命令连接之后你就可以随便自己改 SSH 证书了。

      1. 试了下用cf ic exec -it 容器名 bash这个语句也可以,一般情况下也不必要设置SSH证书吧,没有加密的VPS很容易被攻击吗,小白不是很了解

          1. 没启用 SSH 应该更安全呢;
            如果为了防止 Bluemix 账户问题可以设置复杂密码(我是用 KeePass 生成的随机密码),IBM Bluemix 接口登录的看起来也做了防范。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*