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
就是这样。