<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Soul Of Free Loop &#187; 云平台</title>
	<atom:link href="https://zohead.com/archives/tag/cloud-platform/feed/" rel="self" type="application/rss+xml" />
	<link>https://zohead.com</link>
	<description>Uranus Zhou&#039;s Blog</description>
	<lastBuildDate>Sat, 19 Jul 2025 15:42:46 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.8</generator>
	<item>
		<title>使用 Lade 云开发平台部署容器应用</title>
		<link>https://zohead.com/archives/lade-cloud/</link>
		<comments>https://zohead.com/archives/lade-cloud/#comments</comments>
		<pubDate>Mon, 28 Apr 2025 15:35:39 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[Lade]]></category>
		<category><![CDATA[Miniflux]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[云平台]]></category>
		<category><![CDATA[容器]]></category>
		<category><![CDATA[数据库]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1948</guid>
		<description><![CDATA[关于 Lade 云开发平台 最近了解到一个比较新的 Lade 云开发平台，Lade 是专为开发者设计的云端平台，可以帮助开发者在云端部署测试应用，并提供基础的免费应用额度，还有多处数据中心服务器可供选择，还默认直接支持 HTTPS 域名以方便连接访问容器应用。 Lade 开发平台默认支持以下编程语言： Go Node.js PHP Python Ruby 以及以下这些常用的数据库： MariaDB Memcached MongoDB MySQL PostgreSQL Redis 对于其它编程语言，Lade 还支持以 Dockerfile 形式运行测试应用容器。 首先可以在 Lade 官方网站注 [&#8230;]]]></description>
				<content:encoded><![CDATA[<h2 id="about-lade-cloud">关于 Lade 云开发平台</h2>
<p>最近了解到一个比较新的 <a href="https://www.lade.io/">Lade</a> 云开发平台，Lade 是专为开发者设计的云端平台，可以帮助开发者在云端部署测试应用，并提供基础的免费应用额度，还有多处数据中心服务器可供选择，还默认直接支持 HTTPS 域名以方便连接访问容器应用。</p>
<p>Lade 开发平台默认支持以下编程语言：</p>
<ul>
<li>Go</li>
<li>Node.js</li>
<li>PHP</li>
<li>Python</li>
<li>Ruby</li>
</ul>
<p>以及以下这些常用的数据库：</p>
<ul>
<li>MariaDB</li>
<li>Memcached</li>
<li>MongoDB</li>
<li>MySQL</li>
<li>PostgreSQL</li>
<li>Redis</li>
</ul>
<p>对于其它编程语言，Lade 还支持以 Dockerfile 形式运行测试应用容器。</p>
<p>首先可以在 Lade 官方网站注册账户，然后需要绑定并验证 GitHub 账号后才能创建部署容器应用。</p>
<h2 id="lade-cli">Lade CLI 部署应用</h2>
<p>Lade 网站目前没有提供任何容器应用的部署和管理的功能，容器应用的部署和管理都需要使用 <a href="https://www.lade.io/docs/platform/cli">Lade CLI</a> 工具来完成。</p>
<p>这里以 Linux 系统为例进行简单的介绍，按照页面介绍来安装 Lade CLI：</p>
<pre class="brush: bash; title: ; notranslate">
~# curl -L https://github.com/lade-io/lade/releases/latest/download/lade-linux-amd64.tar.gz | tar xz
~# sudo mv lade /usr/local/bin
</pre>
<p>首先使用 CLI 登录 Lade 账户：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade login
Enter your Lade credentials:
? Username or email: zohead
? Password: 
Logged in as zohead*
</pre>
<p>输入用户名和密码登录成功之后就可以进行创建部署容器应用了，这次我准备先部署一个 <a href="https://miniflux.app/">Miniflux</a> 应用来试试效果。</p>
<p>Miniflux 是一个极简的 RSS 阅读器应用，基于 Go 语言开发，使用 Postgres 数据库保存数据，与其它 RSS 阅读器应用相比功能和界面都很简洁，不过关键还支持抓取 RSS 文章全文、全文检索等功能。</p>
<p>Lade 的收费方式可以参考官网 <a href="https://www.lade.io/pricing">Pricing</a> 页面，并有基础的免费额度，当然免费的额度也是随时有可能取消的：</p>
<ul>
<li>应用：
<ul>
<li>128 MB 内存；</li>
<li>1 CPU；</li>
</ul>
</li>
<li>数据库：
<ul>
<li>128 MB 内存；</li>
<li>1 GB 存储空间；</li>
</ul>
</li>
<li>磁盘：
<ul>
<li>1 GB 磁盘。</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>备注：</strong></p>
<p>2025-06-07 开始 Lade 平台正式取消了免费额度，目前最便宜的 128 MB 内存 / 1 CPU 的应用价格为每月 $1.25，大家自行酌情选择合适的容器收费配置计划。</p>
</blockquote>
<h3 id="app-container">应用容器</h3>
<p>我们首先使用 <code>lade apps create</code> 命令创建新的应用容器，按照提示输入应用容器名称，并选择容器配置和区域即可完成创建，这里就选择免费配置计划和日本东京区域：</p>
<blockquote>
<p><strong>提示：</strong></p>
<ul>
<li>容器名称非常关键，后面很多命令都需要用到，请谨慎输入；</li>
<li>请根据实际应用程序对内存和 CPU 的要求，选择合适的应用配置计划；</li>
<li>免费额度随时有可能取消，如果使用免费配置计划，请注意备份应用数据。</li>
</ul>
</blockquote>
<pre class="brush: bash; title: ; notranslate">
~# lade apps create
? App Name: miniflux
? Plan: 128mb
? Region: Tokyo
</pre>
<p>创建成功之后，可以运行 <code>lade apps list</code> 命令查看容器列表：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade apps list
NAME        PLAN     CREATED           STATUS
miniflux    128mb    43 minutes ago    running
</pre>
<p>另外使用 <code>lade apps show</code> 命令可以查看具体某个应用容器的详细信息和状态，下方输出数据最后的 <code>Web URL</code> 就是 Lade 云开发平台为容器应用自动分配的 HTTPS 访问域名：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade apps show miniflux
Owner:        XXX@XXX.com
Processes:    web: 0/1
Plan:         128mb
Region:       Tokyo
Status:       running
Web URL:      miniflux-zohead.ladeapp.com
</pre>
<p>接着我们就需要在容器上部署实际的应用了，对于 Miniflux 可以从 GitHub 检出最新 v2 版本的代码：</p>
<pre class="brush: bash; title: ; notranslate">
~# mkdir miniflux
~# cd miniflux
~/miniflux# git clone --depth 1 https://github.com/miniflux/v2.git
</pre>
<p>然后使用 <code>lade deploy</code> 命令进行容器应用部署：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade deploy --app miniflux
time=&quot;2025-04-24T20:28:59+08:00&quot; level=error msg=&quot;Can't add file internal/reader/readability/testdata to tar: archive/tar: unknown file mode ?rw-rw-rw-&quot;
Sending build context to Docker daemon  4.563MB
Step 1/11 : FROM golang:1.23.0
1.23.0: Pulling from library/golang
Successfully built e7ae4ac3677b
Successfully tagged registry.lade.io/zohead/miniflux:build-1njzwaheu4
Pushing miniflux build to registry
Build finished use &quot;lade logs -a miniflux -f&quot; to view app logs
</pre>
<p>容器应用部署成功之后，我们可以使用 <code>lade ps</code> 命令确认容器内的进程是否运行正常，可以看到 Lade 部署生成的 <code>miniflux.app</code> 应用程序进程正在运行：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade ps -a miniflux
NAME     PLAN     STARTED         COMMAND
web.1    128mb    14 hours ago    miniflux.app
</pre>
<p>我们还可以使用 <code>lade run</code> 命令实现在应用容器中运行需要的命令，这里就直接运行一个 Bash Shell，运行自定义命令也需要指定一个配置计划，这里还是使用免费配置计划：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade run &quot;bash&quot; -a miniflux -p 128mb
</pre>
<p>容器内的 Bash Shell 启动成功之后，我们可以查看并确认 Miniflux 应用信息，对于 Miniflux 这种 Go 语言应用，Lade 默认部署生成的应用程序在 <code>/go/bin</code> 目录下：</p>
<pre class="brush: bash; title: ; notranslate">
~$ ls -l /go/bin/miniflux.app
-rwxr-xr-x 1 web web 19411204 Apr 24 12:30 /go/bin/miniflux.app
~$ miniflux.app -i
Version: dev
Commit: HEAD
Build Date: undefined
Go Version: go1.23.0
Compiler: gc
Arch: amd64
OS: linux
</pre>
<p>另外根据上面部署命令输出中的提示信息，使用 <code>lade logs -a miniflux -f</code> 命令可以跟踪显示容器应用的运行日志，实际上就是显示容器内应用程序的标准输出和错误输出：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade logs -a miniflux -f
web.1 | level=INFO msg=&quot;The default value for DATABASE_URL is used&quot;
web.1 | dial tcp [::1]:5432: connect: connection refused
</pre>
<p>由于还没有为 Miniflux 应用配置数据库，会出现类似上面的报错信息。</p>
<h3 id="database-addon">数据库扩展</h3>
<p>接着我们需要使用 <code>lade addons create</code> 命令为容器应用配置数据库扩展，下面的 <code>lade addons create postgres</code> 命令即为创建 PostgreSQL 数据库，我仍然使用免费配置计划，并选择和应用相同位置的日本东京区域，以加快数据库访问速度：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade addons create postgres
? Addon Name: miniflux-postgres
? Plan: 128mb
? Region: Tokyo
? Version: 17
? Public: No
</pre>
<p>简单说明一下命令参数：</p>
<ul>
<li><code>Addon Name</code> 为数据库扩展名称，后续扩展管理相关命令也会用到；</li>
<li><code>Version</code> 为数据库版本，<code>lade</code> 命令会列出支持的数据库版本；</li>
<li><code>Public</code> 表示数据库是否允许外部公共访问，我只需要 PostgreSQL 数据库被 Miniflux 应用访问，并不需要公共访问，这里就选 <strong>No</strong> 了。</li>
</ul>
<p>创建成功之后，就可以使用 <code>lade addons show</code> 命令查看数据库扩展的详细信息和状态了：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade addons show miniflux-postgres
Owner:        XXX@XXX.com
Service:      PostgreSQL
Plan:         128mb
Region:       Tokyo
Version:      17
Public:       No
Status:       running
Addon URI:    postgresql://USERNAME:PASSWORD@tyo-sw1.lade.io:30066/XXXX?sslmode=require
</pre>
<p>最后的 <code>Addon URI</code> 就是最关键的数据库连接地址，我们需要为应用容器配置数据库连接地址，地址中包含数据库服务器地址、用户名、密码、数据库名称等数据。</p>
<p>确认数据库运行正常之后，就可以将 PostgreSQL 数据库扩展附加到 Miniflux 应用容器：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade addons attach miniflux-postgres --app miniflux
? Env Name: POSTGRES_URL
</pre>
<p>然后使用 <code>lade env list</code> 命令检查应用容器的环境变量：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade env list -a miniflux
DATABASE_URL=postgresql://USERNAME:PASSWORD@tyo-sw1.lade.io:30066/XXXX?sslmode=require
POSTGRES_URL=postgresql://USERNAME:PASSWORD@tyo-sw1.lade.io:30066/XXXX?sslmode=require
</pre>
<p>可以看到数据库扩展附加之后，会自动为应用容器配置数据库环境变量，包含通用的 <code>DATABASE_URL</code> 和 PostgreSQL 专用的 <code>POSTGRES_URL</code> 环境变量。</p>
<h2 id="miniflux-app-issue">Miniflux 应用容器问题</h2>
<p>我原以为按照上面的步骤为 Miniflux 应用容器配置好 PostgreSQL 数据库扩展之后，Miniflux 应用就可以正常运行了，而实际上容器仍然有报错：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade logs -a miniflux -f
web.1 | the database schema is not up to date: current=v0 expected=v108
</pre>
<p>参考 Miniflux 项目 <a href="https://github.com/miniflux/v2/issues/1680">You must run the SQL migrations, the database schema is not up to date: current=v0 expected=v62</a> Issue 的说明，对于类似 Docker 容器的环境 Miniflux 需要开启 <code>RUN_MIGRATIONS</code> 环境变量。</p>
<p>我们可以使用 <code>lade env set</code> 命令为容器配置或修改环境变量：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade env set RUN_MIGRATIONS=1 -a miniflux
</pre>
<p>稍等一会容器应用自动重启后，就可以看到 Miniflux 应用已经正常运行了：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade logs -a miniflux -f
web.1 | level=INFO msg=&quot;Running database migrations&quot; current_version=0 latest_version=108 driver=postgresql
web.1 | level=INFO msg=&quot;Starting HTTP server&quot; listen_address=:3000
</pre>
<p>现在我们其实就已经可以通过 Lade 云平台为容器应用分配的域名访问 Miniflux Web 管理界面了，当然还是需要用 HTTPS 访问的：</p>
<p><img src="https://images.weserv.nl/?url=https://res.cloudinary.com/digwht2y0/image/upload/v1752420850/lade-miniflux.png" alt="Miniflux Web 管理界面"></p>
<p>不过由于我们还没有为 Miniflux 配置管理员账户，还不能直接登录。</p>
<p>这个时候就需要借助 <code>lade run</code> 命令在应用容器中运行命令创建管理员账户了，下面输出中的 <code>miniflux.app</code> 程序是在容器内运行的：</p>
<pre class="brush: bash; title: ; notranslate">
~$ miniflux.app -create-admin
Enter Username: admin
Enter Password:
level=INFO msg=&quot;Created new admin user&quot; username=admin user_id=1
</pre>
<p>管理员账户创建成功之后，我们就可以通过容器域名访问 Miniflux Web 管理界面进行 RSS 源的配置和订阅管理了。</p>
<p>当然我们也可以开始就通过指定环境变量让 Miniflux 容器自动创建管理员账户，与上面的 <code>RUN_MIGRATIONS</code> 环境变量配合起来就类似：</p>
<pre class="brush: bash; title: ; notranslate">
~# lade env set RUN_MIGRATIONS=1 CREATE_ADMIN=1 ADMIN_USERNAME=admin ADMIN_PASSWORD=password -a miniflux
</pre>
<p>这样通过环境变量指定管理员账户名称和密码也很方便。</p>
<h2 id="summary ">总结</h2>
<p>本文简单介绍了如何使用 Lade 云开发平台的 <code>lade</code> CLI 命令部署配置容器应用，我部署的 Miniflux RSS 阅读器容器应用也运行了一段时间，Lade 云平台还是比较稳定的，只是没有国内的数据中心，访问速度倒是一般。</p>
<p>最后 Lade 云平台的开发者已经确认，目前提供的免费额度仅供开发人员测试使用，免费额度后续随时有可能取消，希望大家不要滥用，如果觉得 Lade 好用也可以考虑付费使用哦，祝大家玩的开心。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/lade-cloud/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IBM Bluemix Docker容器初步体验</title>
		<link>https://zohead.com/archives/ibm-bluemix-docker/</link>
		<comments>https://zohead.com/archives/ibm-bluemix-docker/#comments</comments>
		<pubDate>Thu, 14 Apr 2016 19:20:13 +0000</pubDate>
		<dc:creator><![CDATA[Uranus Zhou]]></dc:creator>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[技术]]></category>
		<category><![CDATA[Baseimage-docker]]></category>
		<category><![CDATA[Bluemix]]></category>
		<category><![CDATA[cf ic]]></category>
		<category><![CDATA[Cloud Foundry]]></category>
		<category><![CDATA[IBM]]></category>
		<category><![CDATA[云平台]]></category>
		<category><![CDATA[容器]]></category>
		<category><![CDATA[端口]]></category>

		<guid isPermaLink="false">https://zohead.com/?p=1213</guid>
		<description><![CDATA[现在国内外流行的云平台越来越多，且不谈像国外的 Amazon ECS、AWS 以及 国内的阿里云、BAE、SAE 这些老牌的云服务，目前提供 Docker 容器服务的平台也多起来，国外有 StackEngine、Tutum、IBM Bluemix 等云平台，国内也有 DaoCloud、时速云、灵雀云之类提供 Docker 容器服务的平台。最近对 Docker 也稍微有了点兴趣，比较之下准备拿 IBM Bluemix 来捣鼓 Docker 容器练练手。 本文不打算对 Docker 容器技术本身对什么介绍了，选择 IBM Bluemix 开发平台的主要原因是： 同时支持运行时（基于 Cloud F [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>现在国内外流行的云平台越来越多，且不谈像国外的 Amazon ECS、AWS 以及 国内的阿里云、BAE、SAE 这些老牌的云服务，目前提供 Docker 容器服务的平台也多起来，国外有 StackEngine、Tutum、IBM Bluemix 等云平台，国内也有 DaoCloud、时速云、灵雀云之类提供 Docker 容器服务的平台。最近对 Docker 也稍微有了点兴趣，比较之下准备拿 IBM Bluemix 来捣鼓 Docker 容器练练手。</p>
<p>本文不打算对 Docker 容器技术本身对什么介绍了，选择 IBM Bluemix 开发平台的主要原因是：</p>
<ul>
<li>同时支持运行时（基于 Cloud Foundry）、容器和虚拟机（基于 openstack）；</li>
<li>服务器在国外，绑定域名不需要备案，这个优势我也挺无奈；</li>
<li>免费账户提供两个公网 IP、每个月有 365 GB-小时的运行内存额度（相当于一个 512MB 内存的容器运行一个月），能基本满足需求；</li>
<li>容器可以开启多个自己指定的 TCP 端口；</li>
<li>IBM 出的货应该还比较稳定。</li>
</ul>
<p>有关 IBM Bluemix 的详情请参考官网：</p>
<p><a href="http://www.ibm.com/cloud-computing/bluemix/cn-zh/">http://www.ibm.com/cloud-computing/bluemix/cn-zh/</a></p>
<p>注册账户什么的这里就不说了，Bluemix 的免费账户有 30 天的试用期，30 天之后添加有效的信用卡就可以继续使用免费额度内的运行时和容器。</p>
<p>Bluemix 提供了 Cloud Foundry 命令行界面 (cf) 来修改应用程序、服务实例和服务绑定，Cloud Foundry CLI 也可以安装 IBM Containers 插件以实现命令行方式管理 Docker 容器。考虑为了熟悉 Docker 命令行的目的，而且 Bluemix 容器中有一些高级功能使用 IBM Containers 插件（cf ic）可以很方便的完成，本文就主要介绍以 IBM Containers 插件（cf ic） CLI 命令的方式管理你的 Bluemix 容器。</p>
<p>IBM Containers 插件 (cf ic) 的官方文档请参考这里：</p>
<p><a href="https://console.ng.bluemix.net/docs/containers/container_cli_cfic.html">https://console.ng.bluemix.net/docs/containers/container_cli_cfic.html</a></p>
<h2 id="安装-cf-ic-插件">安装 cf ic 插件</h2>
<p>cf ic 插件的具体安装步骤可以参考 <a href="https://console.ng.bluemix.net/docs/containers/container_cli_ov.html#container_cli_cfic_install">IBM 官方文档</a>，这里我做个简单的说明。</p>
<p>IBM Containers 插件 (cf ic) 需要依赖 Docker 1.6 以上版本，而 Docker 官方推荐在 Linux 3.8 以上版本的 64 位系统中运行，我使用的 Chromebook 刚好能满足要求，在 Crouton 的 Ubuntu 14.04 环境中安装 Docker 非常简单：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~$ sudo apt-get install docker.io
</pre>
<p>接着需要从 <a href="https://github.com/cloudfoundry/cli/releases">https://github.com/cloudfoundry/cli/releases</a> 下载安装 Cloud Foundry 命令行界面 (cf)。</p>
<p>按照 IBM 官方文档介绍的使用 cf 命令安装容器插件时遇到报错：</p>
<pre class="brush: bash; title: ; notranslate">
(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)&gt; y

Attempting to download binary file from internet address...
10138400 bytes downloaded...
Installing plugin /tmp/ibm-containers-linux_x64...
FAILED
exit status 2
</pre>
<p>插件已经下载成功，但运行时直接报错，没办法我使用上面的地址手工下载 <code>ibm-containers-linux_x64</code> 之后运行，看具体是什么导致的运行出错：</p>
<pre class="brush: bash; title: ; notranslate">
(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
</pre>
<p>看起来是加载中文语言信息（我的 Ubuntu 默认语言就是中文）时出错然后直接退出了，试试直接把语言设为英文运行看看：</p>
<pre class="brush: bash; title: ; notranslate">
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
</pre>
<p>这下果然就没有报错了，cf ic 插件安装成功，使用 <code>cf plugins</code> 命令可以列出所有安装的 Cloud Foundry 插件。</p>
<h2 id="初步使用-cf-ic-插件">初步使用 cf ic 插件</h2>
<p>首先使用 <code>cf login</code> 命令登录到区域服务器，目前 Bluemix 有美国南部、悉尼、英国这 3 个区域，这里我使用美国南部(其它区域更换 login 后面的地址即可)，输入邮箱和密码登录之后就可以看到区域信息:</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~$ cf login -a https://api.ng.bluemix.net
API endpoint: https://api.ng.bluemix.net

Email&gt; xxx@gmail.com
Password&gt; 
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
</pre>
<p>然后需要初始化 CLI：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~$ cf ic init
</pre>
<p>初始化完成之后可以运行 <code>cf ic info</code> 获取容器云服务的状态：</p>
<pre class="brush: bash; title: ; notranslate">
(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
</pre>
<p>可以看到试用账户的内存使用限制是 2GB，可以使用两个 IP 地址。</p>
<h2 id="使用-cf-ic-构建-docker-容器">使用 cf ic 构建 Docker 容器</h2>
<p>一般情况下你都可以使用 Bluemix 官方提供的 Docker 镜像进行快速构建，由于通常的 Docker 镜像只是为了运行特定的程序或服务设计的会有不少限制，无法满足我要调试运行多个程序的需求，而且为了后续 SSH 登录之类的考虑，我准备使用 <a href="https://github.com/phusion/baseimage-docker">Baseimage-docker</a> 这个比较特殊的 Docker 镜像来构建容器。</p>
<p>首先在当前目录下生成 Dockerfile 文件：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/bluemix$ cat &gt; 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 [&quot;/sbin/my_init&quot;]

# ...put your own build instructions here...

# Clean up APT when done.
RUN apt-get clean &amp;&amp; rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
</pre>
<p>Dockerfile 文件简单说明如下：</p>
<ul>
<li>FROM 后面的 <code>phusion/baseimage:0.9.18</code> 表示 Docker 镜像的地址和版本，具体使用哪个版本请参考上面注释里的 Changelog.md 文档；</li>
<li>EXPOSE 表示此 Docker 容器要导出哪些 TCP 端口以使外部能访问到容器。</li>
</ul>
<blockquote>
<p><strong>提示</strong></p>
<p>IBM Bluemix 目前对容器导出的端口有严格的限制，只有常用端口才能导出，官方论坛里列出的可用端口为： <br />
  <em>22,80,443,9080,9443</em></p>
<p>不属于上面列出的其它端口就算通过 Dockerfile 导出也无法访问。</p>
<p>同时需要注意的是使用 Dockerfile 构建容器完成之后就不能再修改导出的端口了，想再换别的端口只能删除旧容器重新构建，因此开始的端口选择需要谨慎。</p>
</blockquote>
<p>总之我的 Dockerfile 文件将可用的 5 个端口都导出了，下面使用 <code>cf ic build</code> 命令构建容器：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/bluemix$ cf ic build -t zohead-server:v1 .
</pre>
<p>上面的 <code>zohead-server</code> 为新的容器名字，最后的 <code>.</code> 参数表示 Dockerfile 文件所在的目录（<code>.</code> 即当前目录）。</p>
<p>容器构建完成之后如果没有什么问题就可以用 <code>cf ic run</code> 命令启动新容器了：</p>
<pre class="brush: bash; title: ; notranslate">
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
</pre>
<p><code>cf ic run</code> 命令的 <code>--name</code> 参数指定容器名字；<code>-m</code> 参数则是为新容器分配的内存大小，为了不超过免费额度我分配了 512MB；<code>-p</code> 参数指定公开用于 TCP 流量的端口,可以指定多个，这里我指定的 5 个端口和 Dockerfile 文件中的一致。</p>
<p>启动容器成功之后等待一段时间就可以使用 <code>cf ic ip list</code> 命令查看 IBM Bluemix 为你的容器分配的公网 IP 地址，公网 IP 地址分配成功之后才可以直接访问容器中的服务：</p>
<pre class="brush: bash; title: ; notranslate">
(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
</pre>
<p>上面列出的 IP Address 就是为容器分配的公网 IP 地址，由于我使用的是美国南部区域，分配的公网 IP 地址 ping 值不是特别理想。</p>
<h2 id="访问-docker-容器">访问 Docker 容器</h2>
<p>即使容器没有分配正确的公网 IP 地址，我们也可以使用 <code>cf ic exec</code> 命令直接访问容器执行命令：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/bluemix$ cf ic exec zohead-server echo &quot;Hello Bluemix&quot;
Hello Bluemix
</pre>
<p>当然也可以使用 <code>cf ic exec</code> 命令直接开启一个连接到容器的 Bash Shell 终端：</p>
<pre class="brush: bash; title: ; notranslate">
(trusty)zzm@localhost:~/bluemix$ cf ic exec -t -i zohead-server bash -l
</pre>
<p>有了公网 IP 地址之后，你就可以参考 <a href="https://github.com/phusion/baseimage-docker#enabling_ssh">Baseimage-docker开启 SSH</a> 的说明启用 SSH 证书登录了，这里也比较简单我就不做介绍了。</p>
<p>Bluemix Docker 容器能够 SSH 登录之后就比较方便了，Baseimage-docker 镜像里自带了 Python 3 支持，我们可以直接使用 Python 3 运行一个最简单的 Web 服务器验证导出的 TCP 端口能否正常访问：</p>
<pre class="brush: bash; title: ; notranslate">
root@instance-001afe36:/home/wwwroot# python3 -m http.server 80
</pre>
<p>由于 Bluemix 容器用的是 IBM Containers，我们可以用 <code>capsh</code> 命令看看 Bluemix 是否和其它 Docker 容器服务一样存在权限限制：</p>
<pre class="brush: bash; title: ; notranslate">
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)
</pre>
<p>看起来限制和常见的 Docker 平台也差不多，没有一些特别的系统管理权限，例如我想测试的基于 tun 驱动的开源 VPN 服务也无法使用了。</p>
<h2 id="监控-bluemix-容器运行状态">监控 Bluemix 容器运行状态</h2>
<p>一番使用下来你会发现参考 Bluemix 官方的文档就可以基本只用 cf ic 命令实现完成创建、构建、运行和管理 Bluemix 容器这一整套操作了。如果你要监控容器的历史运行状态或者要查看账单之类的那可能还是需要访问 Bluemix Web 控制台的，这个是我的 Docker 容器运行时的内存使用情况：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737370583/bluemix-docker-status.png" alt="Bluemix 容器内存使用情况" title="Bluemix 容器内存使用情况"></p>
<p>基本的功能在 Bluemix Web 控制台里也是可以完成的，如果使用中遇到问题可以在 Web 控制台里创建技术支持工单（只是 IBM 的技术支持响应速度似乎很慢的）。</p>
<blockquote>
<p><strong>注意</strong></p>
<p>我在试用 Bluemix 容器的时候发现有一个不太容易被注意到的坑就是容器里使用 <code>free</code> 或者 <code>top</code> 等命令看到的内存非常大（远远超过我分配的 512MB，似乎显示的是实际服务器的总体内存，而且容器里的程序也能分配超过 512MB 的内存，因此容器里实际运行的程序内存占用需要注意不要超过限额。</p>
</blockquote>
<p><br/>
<p>你也可以在 Web 控制台中点击账户图标，然后进入「管理组织」设置，这里可以修改当前区域的运行时和容器使用配额：</p>
<p><img src="http://res.cloudinary.com/digwht2y0/image/upload/v1737370583/bluemix-quota.png" alt="Bluemix 管理区域配额" title="Bluemix 管理区域配额"></p>
<p>经过十几天对 IBM Bluemix Docker 容器的试用来看，虽然 IBM 的服务器不在国内，但 Bluemix 容器还算是比较稳定的，对于一般的开发者来说调试运行一些服务程序也是比较方便的。</p>
<p>一般用户使用这种容器服务最多的用途像跑博客之类的 Web 服务是没什么问题的，不过国内似乎不少人只是用 Bluemix 容器跑 Shadowsocks 代理了（真的算是国内用户的刚性需求了么 -_-#），对此我只能说 IBM Bluemix 目前还是比较良心的，大家且用且珍惜请不要滥用呢，最后祝玩的开心 ～～～。</p>
]]></content:encoded>
			<wfw:commentRss>https://zohead.com/archives/ibm-bluemix-docker/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
	</channel>
</rss>
