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 ubuntuRUN echo "deb http://cn.archive.ubuntu.com/ubuntu precise main" > /etc/apt/sources.listRUN apt-get updateRUN 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-stablepip install gevent# 回到docker-registry位置cd path_to/docker-registrypip install -r requirements.txt
不過以上都是針對FreeBSD而言,如果是ubuntu之類的就要簡單很多,apt安裝一下就完了,詳見官方文檔。
第三步是配置,最簡單的做法就是用預設配置,更詳細的說明則見官方文檔。預設配置的方法如下:
cd configcp 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
就是這樣。