优秀的web console之codetainer的搭建与使用

优秀的 web console PasS 服务商 codepicnic https://codepicnic.com 有了开源的克隆版. 搜索了一些codetainer搭建的相关文档, 都引用了 github 的官方介绍, 但是官方说明比较简单, 安装过程中的一些报错严重影响了用户对codetainer的体验, 本篇文章介绍 codetainer 的部署与使用

环境依赖

安装 docker 环境

1
2
3
4
5
6
7
8
tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF
1
2
3
4
yum install docker-engine
systemctl enable docker.service
systemctl start docker
systemctl status docker

安装 golang 环境

根据自己的平台选择对应的安装包, 这里我使用的环境为 CentOS7.2 所以选择了如下安装包下载

go1.7.4.linux-amd64.tar.gz Archive Linux 64-bit 80MB 47fda42e46b4c3ec93fa5d4d4cc6a748aa3f9411a2a2b7e08e3a6d80d753ec8b

1
2
3
4
cd /usr/local/src
wget https://storage.googleapis.com/golang/go1.7.4.linux-amd64.tar.gz
tar -xvzf go1.7.4.linux-amd64.tar.gz
mv go /usr/local/
1
2
3
4
5
echo "export GOROOT=/usr/local/go" >> /etc/profile
echo "export PATH=$PATH:$GOROOT/bin" >> /etc/profile
echo "export GOPATH=$HOME/work" >> /etc/profile
mkdir $HOME/work
source /etc/profile

安装 go-bindata

go get -u github.com/jteeuwen/go-bindata/...

安装了 go-bindata 后如果还是报: go-bindata command not found 的话, 就进行如下操作

ln -s $GOPATH/bin/go-bindata $GOROOT/bin

可以用 cp 也可以用 ln, 当然也可以把这个路径添加到 PATH中, 总之只要环境变量 PATH 能找到就行

安装 godep

go get github.com/tools/godep

安装 codetainer

1
2
3
go get github.com/codetainerapp/codetainer
cd $GOPATH/src/github.com/codetainerapp/codetainer
make

make 成功后会生成这个文件 $GOPATH/src/github.com/codetainerapp/codetainer/bin/codetainer

docker 配置

1
2
3
4
vim /usr/lib/systemd/system/docker.service
# 将 ExecStart=/usr/bin/docker daemon -H fd:// 这行修改为下面这行
ExecStart=/usr/bin/docker daemon -H fd:// -H tcp://127.0.0.1:4500 -H unix:///var/run/docker.sock
# 修改完毕后保存退出

codetainer 配置

codetainer 的默认配置文件只有在 codetainer命令第一次执行之后才会自动创建, 自动创建的配置文件在 $HOME/.codetainer/config.toml

默认只有两行, 如果上面你没有修改过 docker API 监听的端口, 那这一步骤你是不需要关心的

1
2
DockerServer = "localhost"
DockerPort = 4500

官方给出的配置说明如下:

1
2
3
4
5
6
7
8
9
10
11
12
# Docker API server and port
DockerServer = "localhost"
DockerPort = 4500

# Enable TLS support (optional, if you access to Docker API over HTTPS)
# DockerServerUseHttps = true
# Certificate directory path (optional)
# e.g. if you use Docker Machine: "~/.docker/machine/certs"
# DockerCertPath = "/path/to/certs"

# Database path (optional, default is ~/.codetainer/codetainer.db)
# DatabasePath = "/path/to/codetainer.db"

启动 codetainer

以下是官方案例, 这里我不做修改, 只说明一下

1
2
3
4
5
6
$ cd $GOPATH/src/github.com/codetainerapp/codetainer/bin/
$ docker pull ubuntu:14.04 # 你可以下载任意一个你需要的镜像
$ ./codetainer image register ubuntu:14.04 # 把你需要托管到codetainer的镜像注册给codetainer
$ ./codetainer create ubuntu:14.04 my-codetainer-name # 启动你托管给codetainer的镜像
$ ./codetainer server # to start the API server on port 3000
# 最后一步是启动 codetainer 服务

codetainer 服务启动后默认会卡在前台, 提示你已经监听了 127.0.0.1:3000 这个地址

不用管这个监听了本地3000端口地址的提示, 你可以执行如下命令查看监听的端口

1
2
3
4
netstat -antupl
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::3000 :::* LISTEN 20597/./codetainer

这里可以看到 codetainer 的服务监听了所有 IP 的3000端口

登录你的 web console

我试了下, 直接打开 http://IP:3000 是有问题的, 如果需要登录到 console, 需要知道你刚刚使用 codetainer 启动的镜像 id, 可以通过以下方式查看

1
2
3
4
5
cd $GOPATH/src/github.com/codetainerapp/codetainer/bin/

./codetainer list
Found 1 codetainers.
-- [5ded5ca44ce1d9347a7d8556675b6a269b922660a27eef02df631bd323ed8057] mycode (Running)

通过 ./codetainer list 可以查看当前 codetainer 托管的镜像 id (这里我说的镜像
id 指的是在 codetainer 里管理的 id, 而不是 docker 管理 container 的 id )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 14.04 3f755ca42730 12 days ago 187.9 MB

docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5ded5ca44ce1 3f755ca42730 "/bin/bash" 6 hours ago Up 6 hours mycode

./codetainer image list
Found 1 images:
-- [sha256:3f755ca4273009a8b9d08aa156fbb5e601ed69dc698860938f36b2109c19cc39] [ubuntu:14.04]

./codetainer list
Found 1 codetainers.
-- [5ded5ca44ce1d9347a7d8556675b6a269b922660a27eef02df631bd323ed8057] mycode (Running)

自行感受他们的区别吧~

找到 ./codetainer list回显出来的 id 之后就可以访问我们的 web console 啦

访问这个地址: http://:3000/api/v1/codetainer//view

codetainer

到这里实现了在一台宿主机中启动一个容器来提供 terminal

下面我来介绍下如何在一台宿主机上启动多个 container 来提供过个 terminal

多 terminal

不难发现, web console 的服务是 codetainer 来提供的, 他提供了前端页面, 提供与 docker API 的交互, 所以, 只要我们使用 ./codetainer create 命令启动多个容器, 就可以在 ./codetainer list 上看到多个”主机”, 查到他们的 id, 就可以在 url 中通过更换 id 的值来访问不通的 terminal

1
2
3
4
5
6
7
8
9
10
➜  bin git:(master) ✗ ./codetainer list
Found 1 codetainers.
-- [5ded5ca44ce1d9347a7d8556675b6a269b922660a27eef02df631bd323ed8057] mycode (Running)
➜ bin git:(master) ✗ ./codetainer create ubuntu:14.04 mycode2
Codetainer mycode2 creation succeeded!
You can interact with it here: http://localhost:3000/api/v1/codetainer/c2d2fc896a60d37a7d1fd9d365850518d2ba7da853cc35563d68f4c32533912f/view
➜ bin git:(master) ✗ ./codetainer list
Found 2 codetainers.
-- [5ded5ca44ce1d9347a7d8556675b6a269b922660a27eef02df631bd323ed8057] mycode (Running)
-- [c2d2fc896a60d37a7d1fd9d365850518d2ba7da853cc35563d68f4c32533912f] mycode2 (Running)

可以看到我们在使用 ubuntu:14.04 镜像创建第二个容器的时候, 回显自动给出了访问的地址, 因为我现在的 server 已经启动, 在 server 没有启动的时候, 只能通过手动查找 id 的方式来访问

以上我依然使用了 ubuntu:14.04 镜像, 你可以在 pull 下来新的镜像注册到 codetainer服务中. 例如:

1
2
docker pull centos:latest
codetainer image register centos:latest

参考文档

docker 官方安装文档: https://docs.docker.com/engine/installation/linux/centos/
codetainer 项目 github 地址: https://github.com/codetainerapp/codetainer
go-bindata 项目 github 地址: https://github.com/jteeuwen/go-bindata
godep 项目 github 地址: https://github.com/tools/godep
golang 官方下载地址: https://golang.org/dl/
golang 官方安装文档: https://golang.org/doc/install
go-bindata 报错解决: http://blog.csdn.net/lampqiu/article/details/48649881