1. 程式人生 > >具有中國特色的docker折騰記(下)

具有中國特色的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

就是這樣。