Get runC
在旧金山举行的DockerCon大会上, 开放容器项目
和一个运行容器的CLI工具runC同时和大家见面。runC是
libcontainer
的一层包装(wrapper )。
它是Docker捐献给开放容器项目用来作为参考实现的。这听起来很有意思,尤其是主要的供应商是OCI的一部分,就像rkt之于CoreOS。
让我们签出 runC
源码用它把Docker容器跑起来吧。
安装runC
runC目前不提供二进制源。需要先安装Go语言环境,然后签出runC代码才能编译runC:
mkdir -p ~/golang/src/github.com/opencontainers/
cd ~/golang/src/github.com/opencontainers/
git clone https://github.com/opencontainers/runc
cd ./runc
make
sudo make install
以上这些指令是在Ubuntu 14.04机器上运行的,并未在其它环境验证。
现在,你应该编译得到自己的二进制runC了。
运行一个容器
runC的运行级别比Docker更低,因此他只需要镜像文件在文件夹或者包文件中。我们使用正在运行的Docker容器导出一个打包文件并解压到文件夹中即可。
mkdir ./goapp
cd ./goapp
docker pull geku/go-app:0.1
CONTAINER_ID=$(docker run -d geku/go-app:0.1)
docker export -o go-app.tar $CONTAINER_ID
tar -xf go-app.tar
rm go-app.tar
现在我们的文件中都是容器文件。我们必须先创建
container.json
文件,然后运行它。
{ "version": "0.1",
"os": "linux",
"arch": "amd64",
"processes": [
{
"tty": true,
"user": "daemon",
"args": [
"/app/go-app"
],
"env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"TERM=xterm"
],
"cwd": ""
}
],
"root": {
"path": "./",
"readonly": true
},
"cpus": 1.1,
"memory": 128,
"namespaces": [
{
"type": "process"
},
{
"type": "mount"
},
{
"type": "ipc"
}
],
"capabilities": [
"AUDIT_WRITE",
"KILL",
"NET_BIND_SERVICE"
],
"devices": [
"null",
"random",
"full",
"tty",
"zero",
"urandom"
],
"mounts": [
{
"type": "proc",
"source": "proc",
"destination": "/proc",
"options": ""
},
{
"type": "tmpfs",
"source": "tmpfs",
"destination": "/dev",
"options": "nosuid,strictatime,mode=755,size=65536k"
},
{
"type": "devpts",
"source": "devpts",
"destination": "/dev/pts",
"options": "nosuid,noexec,newinstance,ptmxmode=0666,mode=0620,gid=5"
},
{
"type": "tmpfs",
"source": "shm",
"destination": "/dev/shm",
"options": "nosuid,noexec,nodev,mode=1777,size=65536k"
},
{
"type": "mqueue",
"source": "mqueue",
"destination": "/dev/mqueue",
"options": "nosuid,noexec,nodev"
},
{
"type": "sysfs",
"source": "sysfs",
"destination": "/sys",
"options": "nosuid,noexec,nodev"
}
]
}
当运行
runc spec
时,runC工具根据上面的一些配置生成容器。很显然,我们必须在
processes/args
中设置过程命令而且要移除
network
,再将
uts
命名空间分享到主机网络。基于以上原因,
我们也应该移除不必要的
hostname
。最后我们还应该设置一下
root
path为
./.
。
当准备启动一个容器时确保我们的
container.json
存在镜像的root根目录。
cd ./goapp
sudo runc
为了验证容器内部的应用程序是否正在运行,我们可以发送一个HTTP请求:
curl localhost:5000/json
{"hostname":"demo","env":["PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"TERM=xterm","HOME=/usr/sbin"],"num_cpu":4,"go_max_procs":1}
哇,我们的第一个容器使用runC开始运行了!这是一个简单的例子,但演示了如何使用runC运行Docker镜像。
原文链接: Getting Started with runC(翻译:张亚龙)