具有中國特色的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 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
就是這樣。