屬於阿宅世界的技術文章,想看的再點開,切莫自誤 !
目前系統架構是 VM 上安裝伺服務,執行目錄跟資料目錄、log目錄、甚至是設定檔目錄分開,搭配上 puppet 進行佈署感覺就很夠用了,所以對現在很紅的 docker 其實有點興致缺缺、不知該用在那。
一直到最近在進行改寫 Trac 時碰到一個問題 : Trac 設計上沒有 mulitple project / sub-project 的機制,所以如果要同時開多個 Trac 的專案就是開多個 Trac 的Process。而由於 Trac 負載很輕,所以可以放在同一個 OS 內,聽在不同的 port 做區隔,前端再透過 proxy 轉就好了。但是,這幾個 process 若是在同個 os 內的話,當初在安裝時,為了方便,讀的都是同一個 Trac 的蛋 (通常位於 /usr/lib/python/sitepackage/下,你如果蛋疼的話當然也可以分開放,啟動時分開指定,但我想不會有人這麼做),若是想對程式主體做異動修改時,動一個也肯定會影響到所有運作的專案 Process。於是腦筋就動到 docker 上來,改改看,當做練功。
目標 : 一個 OS 內維持啟動多個 Trac 的程序,共用相同的檔案(css/images/js..etc) 但每個程序執行時互相獨立
檔案目錄說明 :
/home/trac/ Trac 共用的檔案資料夾
/home/trac/templates : 共用的web 模版
/home/trac/htdocs : 共用的 css / js / images 檔案
/home/trac-proj/testing 測試的 Trac 專案資料夾,每個專案的設定改動時會寫入 conf/trac.ini
以下是 Trac on dock 設定的流程
docker詳細的安裝步驟可參考 : https://docs.docker.com/installation/centos
安裝必要套件, docker 的repository 是在 EPEL 裡,先裝EPEL
shell> yum install epel-release
然後就可以用 yum 安裝docker
shell> yum install docker-io
啟動 / 停止 docker
shell> /etc/init.d/docker start
設為常駐服務
shell> chkconfig docker on
下載一個預設的centos image作為 Trac 執行的 container
shell> docker pull centos
Pulling repository centos
8efe422e6104: Download complete
511136ea3c5a: Download complete
5b12ef8fd570: Download complete
Status: Downloaded newer image for centos:latest
Pulling repository centos
8efe422e6104: Download complete
511136ea3c5a: Download complete
5b12ef8fd570: Download complete
Status: Downloaded newer image for centos:latest
看一下image的狀況
shell> docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos latest 8efe422e6104 4 weeks ago 224 MB
centos centos7 8efe422e6104 4 weeks ago 224 MB
centos 7 8efe422e6104 4 weeks ago 224 MB
<none> <none> 5b12ef8fd570 4 months ago 0 B
<none> <none> 511136ea3c5a 20 months ago 0 B
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
centos latest 8efe422e6104 4 weeks ago 224 MB
centos centos7 8efe422e6104 4 weeks ago 224 MB
centos 7 8efe422e6104 4 weeks ago 224 MB
<none> <none> 5b12ef8fd570 4 months ago 0 B
<none> <none> 511136ea3c5a 20 months ago 0 B
測試,建立一個執行bash的 contaner,不指定 name 的話, hostname = container id
shell> docker run -t -i /bin/bash
[root@7bc2d405be2d /]#exit
shell> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
shell> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7bc2d405be2d centos:7 "bash" 31 seconds ago Exited (0) 12 seconds ago tender_almeida
[root@7bc2d405be2d /]#exit
shell> docker ps
shell> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7bc2d405be2d centos:7 "bash" 31 seconds ago Exited (0) 12 seconds ago tender_almeida
建立Trac 執行所需的環境,Dockerfile 中的指令其實就是在 OS 中裝 trac 的流程的指令集,再加上 docker 本身需要的指令而已,相當簡單
然後因為這次的目的就是要改Trac,所以 Trac 要下載 Source code 回來 build
shell> cd /home/trac/
shell> vi Dockerfile
FROM centos
MAINTAINER YOUR NAME <your@email>
ENV TRAC_VER 1.0.3
ENV TRAC_HOME /home/trac
RUN yum install tar wget git svn python-devel gcc -y
RUN mkdir -p $TRAC_HOME/src
WORKDIR $TRAC_HOME/src
RUN wget http://download.edgewall.org/trac/Trac-$TRAC_VER.tar.gz
RUN wget https://pypi.python.org/packages/source/s/setuptools/setuptools-12.0.5.tar.gz
RUN tar zxvf Trac-$TRAC_VER.tar.gz
RUN tar zxvf setuptools-12.0.5.tar.gz
RUN python $TRAC_HOME/src/setuptools-12.0.5/setup.py build
RUN python $TRAC_HOME/src/setuptools-12.0.5/setup.py install
# Required packages
# Genshi
RUN easy_install Genshi
# plug-ins
# TracAccountManager
RUN easy_install https://trac-hacks.org/svn/accountmanagerplugin/trunk
# TracDownloads
RUN easy_install --find-links http://www.pythonware.com/products/pil/ Imaging
RUN svn co http://svn.navi.cx/misc/trunk/pycaptcha/
WORKDIR $TRAC_HOME/src/pycaptcha/
RUN python setup.py install
# TracPrivateTickets
WORKDIR $TRAC_HOME/src
RUN svn co http://trac-hacks.org/svn/privateticketsplugin/trunk/ privateticketsplugin
WORKDIR $TRAC_HOME/src/privateticketsplugin/
RUN python setup.py install
# TRAC
WORKDIR $TRAC_HOME/src/Trac-$TRAC_VER/
RUN python setup.py install
# post-install plugins
RUN mkdir -p $TRAC_HOME/plugins
WORKDIR $TRAC_HOME/plugins
RUN svn export http://trac-hacks.org/svn/showpathplugin/0.11/ShowPath.py
shell> docker build -t centos .
Sending build context to Docker daemon 38.55 MB
Sending build context to Docker daemon
Step 0 : FROM centos
---> 8efe422e6104
<Skip>
Removing intermediate container 84e9cdb3ae5e
Successfully built 2d413ddfcb3c
shell> vi Dockerfile
FROM centos
MAINTAINER YOUR NAME <your@email>
ENV TRAC_VER 1.0.3
ENV TRAC_HOME /home/trac
RUN yum install tar wget git svn python-devel gcc -y
RUN mkdir -p $TRAC_HOME/src
WORKDIR $TRAC_HOME/src
RUN wget http://download.edgewall.org/trac/Trac-$TRAC_VER.tar.gz
RUN wget https://pypi.python.org/packages/source/s/setuptools/setuptools-12.0.5.tar.gz
RUN tar zxvf Trac-$TRAC_VER.tar.gz
RUN tar zxvf setuptools-12.0.5.tar.gz
RUN python $TRAC_HOME/src/setuptools-12.0.5/setup.py build
RUN python $TRAC_HOME/src/setuptools-12.0.5/setup.py install
# Required packages
# Genshi
RUN easy_install Genshi
# plug-ins
# TracAccountManager
RUN easy_install https://trac-hacks.org/svn/accountmanagerplugin/trunk
# TracDownloads
RUN easy_install --find-links http://www.pythonware.com/products/pil/ Imaging
RUN svn co http://svn.navi.cx/misc/trunk/pycaptcha/
WORKDIR $TRAC_HOME/src/pycaptcha/
RUN python setup.py install
# TracPrivateTickets
WORKDIR $TRAC_HOME/src
RUN svn co http://trac-hacks.org/svn/privateticketsplugin/trunk/ privateticketsplugin
WORKDIR $TRAC_HOME/src/privateticketsplugin/
RUN python setup.py install
# TRAC
WORKDIR $TRAC_HOME/src/Trac-$TRAC_VER/
RUN python setup.py install
# post-install plugins
RUN mkdir -p $TRAC_HOME/plugins
WORKDIR $TRAC_HOME/plugins
RUN svn export http://trac-hacks.org/svn/showpathplugin/0.11/ShowPath.py
shell> docker build -t centos .
Sending build context to Docker daemon 38.55 MB
Sending build context to Docker daemon
Step 0 : FROM centos
---> 8efe422e6104
<Skip>
Removing intermediate container 84e9cdb3ae5e
Successfully built 2d413ddfcb3c
# 啟動 trac ,指定聽在 container 的 6001 並與本機的6001 port 連結,並將本機上 trac 需要的檔案掛進 trac container 中 (紅色部份為container 啟動 trac 的指令)
shell> docker run -d -p 6001:6001 -v /home/trac-proj/testing:/home/trac-proj/testing -v /home/trac/templates/:/home/trac/templates/ -v /home/trac/htdocs/:/home/trac/htdocs/ --name="trac-testing" -t centos /usr/bin/tracd -p 6001 --pidfile=/var/log/trac.pid /home/trac-proj/testing/
5b2d56751c70ef9b812c07a59f7b8879305f5f68085126047f8d275395ba0bf1
5b2d56751c70ef9b812c07a59f7b8879305f5f68085126047f8d275395ba0bf1
觀察container執行的狀況
shell> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5b2d56751c70 centos:latest "/usr/bin/tracd -p 6 3 seconds ago Up 3 seconds 0.0.0.0:6001->6001/tcp trac-testing
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5b2d56751c70 centos:latest "/usr/bin/tracd -p 6 3 seconds ago Up 3 seconds 0.0.0.0:6001->6001/tcp trac-testing
觀察container 內 process 執行的狀況
shell> docker top trac-testing
UID PID PPID C STIME TTY TIME CMD
root 29200 28888 1 15:00 pts/0 00:00:00 /usr/bin/python /usr/bin/tracd -p 6001 --pidfile=/var/log/trac.pid /home/trac-proj/testing/
UID PID PPID C STIME TTY TIME CMD
root 29200 28888 1 15:00 pts/0 00:00:00 /usr/bin/python /usr/bin/tracd -p 6001 --pidfile=/var/log/trac.pid /home/trac-proj/testing/
port listen 的狀況
shell> netstat -anltp | grep docker
tcp 0 0 :::6001 :::* LISTEN 844/docker-proxy
tcp 0 0 :::6001 :::* LISTEN 844/docker-proxy
如果執行的程式沒有將輸出的 log 導到特定的檔案,直接 output 到 console 上的話,可以用下面的方式看
shell> docker logs trac-testing
Server starting in PID 1.
Serving on 0.0.0.0:6001 view at http://127.0.0.1:6001/
Using HTTP/1.1 protocol version
1.1.1.1 - - [05/Feb/2015 07:16:37] "GET /yw-testing HTTP/1.0" 200 -
<skip>
Server starting in PID 1.
Serving on 0.0.0.0:6001 view at http://127.0.0.1:6001/
Using HTTP/1.1 protocol version
1.1.1.1 - - [05/Feb/2015 07:16:37] "GET /yw-testing HTTP/1.0" 200 -
<skip>
停下container
shell> docker stop trac-testing
trac-testing
trac-testing
網路的部份不太需要設定,但因為我們的環境是透過 proxy 把web request 再轉給 trac, os 上有 iptables有嚴格的出入管理 ,要打開往 docker0 這個interface
shell> iptables -A OUTPUT -o docker0 -j ACCEPT -m comment --comment "docker interface"
另外要是 container 內的網路該通而沒通,試著重啟 docker 試試 (eg. 打通連外的iptables 後,必須重啟 container )
這樣就有一個聽在 6001 port 的 trac instance ,且container內有它執行所需要的檔案及源始碼。依法砲製就可以啟動多個 trac instance ,每個有每個的執行環境,可以針對你需要的instance 進行異動,而不會影響到其他 instance。但另一方面共用 /home/trac下的通用檔案,減少各專案重覆設定一樣的東西的工作。最後專案最終的資料寫到的資料夾為掛載上去的本機資料夾,要是 trac instance 死翹翹了或是要migrate,只要再開一個新的去讀專案資料夾就好,備份也只需要備專案資料夾即可。
小技巧
刪除所有的 container
shell> docker stop $(docker ps -a -q)
shell> docker rm $(docker ps -a -q)
shell> docker rm $(docker ps -a -q)
刪除所有的 images 也可以用類似的方式
shell> docker rmi $(docker images -a -q)
p.s 每個 container 在 build 的時候都去download source code 感覺太耗時間,其實可以先download 好,再在 Dockerfile 中透過 VOLUME 掛進來,不過沒試過
p.s 感覺可以在 linux 內弄個 windows 的container run IRMAS/SEP 來達今在OA用 linux 上班的夢想 ? 不過windows 好像沒有有快速download required libraries 的方法 ?xd
0 意見:
張貼留言