2015年2月4日 星期三

[記事] Trac on docker


屬於阿宅世界的技術文章,想看的再點開,切莫自誤 !

目前系統架構是 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

看一下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

測試,建立一個執行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


建立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


# 啟動 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

觀察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 內 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/

port listen 的狀況
shell> netstat -anltp | grep docker
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>

停下container
shell> docker stop 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)

刪除所有的 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 意見:

張貼留言