具有中国特色的docker折腾记(下)

Dockerfile

弄明白docker是怎么回事以后,当然是要来做几个自己的image。而要自建image,有两个方法:

一是下载一个官方image,然后在里面run一些你需要的东西,然后commit成一个image。

另一个方法则是用Dockerfile。

但本质上两个方法是一样的——因为Dockerfile的内容不过是一堆的RUN命令而已……

Dockerfile的文件名一般就叫做Dockerfile,这样比较方便,因为可以直接用来生成image:

docker build -t yourname/imagename:yourtagname .

如果不是用这个文件名的话,就需要用这样的命令了:

docker build -t yourname/imagename:yourtagname - < yourdockerfilename

其中yourtagname是可以省略的,默认是latest。build完成以后会按Dockerfile的内容生成一个新的image,image的名字就是:yourname/imagename。

Dockerfile最基本的内容主要有两个:一个是FROM指令,一个是RUN指令。

FROM用于指定用哪个image作为基础,RUN则是在基础image上新建一个container并运行命令。一个简单的例子如下:

FROM ubuntu
RUN echo "deb http://cn.archive.ubuntu.com/ubuntu precise main" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y vim

其它可选和进阶的指令有:MAINTAINER, ENTRYPOINT, USER, EXPOSE等。简单说明如下:

MAINTAINER:维护者说明
ENTRYPOINT:作为container运行时的启动程序
USER:作为container运行时,启动程序使用的用户身份
EXPOSE:作为container运行时需要监听的端口号

更具体的说明请参见官方文档。

需要注意的是,使用docker build建立image时会依次运行Dockerfile里的每一句run,而每运行一句就会生成一个单独的container。

分享image

自建的image可以上传到官方仓库与大家分享,也方便以后自己重用。

但在上传之前,需要先到官方仓库注册一个用户。注意:注册完要先去收一下邮件,通过邮箱验证以后才可以从docker登录。

然后从本地docker登录官方仓库:

docker login

之后就可以上传自己创建的image了:

docker push yourname/imagename

docker-registry

老是穿墙用官方仓库也不方便,而且总会有一些东西是不方便放到官方仓库去公开的,所以自建仓库很有必要。

我的仓库是建在一台FreeBSD服务器上的,以下步骤供参考:

第一步当然是装一个git。说实话,我是非常不喜欢git的,远没有hg用起来简单方便,而且刚才在FreeBSD上用ports安装完成以后居然还运行出错,clone的时候core dump了。最后还是升级了openssl和curl才解决。

第二步就是clone docker-registry的代码:

git clone https://github.com/dotcloud/docker-registry.git

第三步是准备docker-registry的运行环境,因为它是用python写的,所以我还是专门给它开了一个virtualenv。不过因为它用到了gevent,而在FreeBSD的virtualenv里安装gevent会有点小麻烦,详见我以前的文章。所以要先装gevent,而要装这个,又要先装一个libevent。

cd /usr/ports/devel/libevent
# 注意,这里不要clean,因为编译gevent还要用到
make install
# 用了virtualenvwrapper的命令进入指定的virtualenv环境
workon your_virtualenv
# 下载gevent并不安装
pip install --no-install gevent==0.13.8
# 进入已下载的gevent位置
cdvirtualenv build/gevent
# libevent参见你的实际环境
python setup.py install --libevent /usr/ports/devel/libevent/work/libevent-1.4.14b-stable
pip install gevent
# 回到docker-registry位置
cd path_to/docker-registry
pip install -r requirements.txt

不过以上都是针对FreeBSD而言,如果是ubuntu之类的就要简单很多,apt安装一下就完了,详见官方文档

第三步是配置,最简单的做法就是用默认配置,更详细的说明则见官方文档。默认配置的方法如下:

cd config
cp config_sample.yml config.yml

第四步就可以运行了:

gunicorn --access-logfile - --debug -k gevent -b 0.0.0.0:5000 -w 1 wsgi:application

注意:以上默认配置和运行命令都是以测试/调试模式工作的,实际应用请自己修改配置和命令。

如果需要,还可以再加上一层Apache/Nginx做代理发布到外网跟你的小伙伴们分享,这个就不再赘述了。

docker-registry的使用

自建的docker-registry如何使用呢?

最先要做的一件事情就是:

停掉那个加了代理的docker daemon,重启默认的服务:

ps aux | grep "sudo docker"
sudo kill [docker-daemon-pid]
sudo service docker start

因为自建的registry显然不再需要代理,加了代理反而会连不通。

然后看看本地image的ID,准备挑一个拿来上传:

docker images | grep ubuntu | grep latest

接着设置其repository名:

docker tag [image_id] [your-registry-host]:5000/ubuntu

OK,现在可以push了:

docker push [your-registry-host]:5000/ubuntu

之后就可以在别的机器上从这个registry上下载了:

docker pull [your-registry-host]:5000/ubuntu

就是这样。

推送到[go4pro.org]