[Synology NAS] 實作可在 Synology NAS 上執行的 SVN Docker Image

簡介 Docker

img_56a5b3dd208fdDocker 允許開發者可以封裝 (package) 應用程式與其所有相依軟體成為一個映象檔 (Image),映象檔中包含了完整的檔案系統與執行所需要的軟體元件、應用程式,這可以保證映象檔在任何 Docker 伺服器 (也稱為 Docker Engine) 上都能有相同的執行結果。

Docker 能進行快速部署,提供獨立運作的作業環境,支援許多平台,包括實體機器、虛擬機、公有雲、私有雲、個人電腦、伺服器等。

Docker 是一個輕羽量級的虛擬引擎,是在作業系統層面上實作虛擬化,直接使用本地主機的作業系統,而傳統虛擬化方式則是在硬體層面實作。

img_56a5b5c72e6ee

img_56a5b5dcd8ef3

Docker 映象檔是採用一種分層堆疊 (layer) 的運作方式,採用了 aufs 的檔案架構。

aufs是一種 UnionFS, 是一種分層、輕量級並且高效能的檔案系統,它支援同時就是支持將不同目錄掛載到同一個虛擬檔案系統下,並實現一種 layer 的概念。

要建立一個可提供應用程式完整執行環境的映象檔,要先從一個基礎映象檔 (Base Image) 開始疊起,一層層將不同的映象檔疊加上去,最後組合成一個應用程式所需執行環境的映象檔。

映象檔是唯讀  (Read Only) 的,當使用 docker run 指令執行映象檔時,Docker Engine 會再疊上一層可讀寫層,這個可讀寫層則稱為容器 (container)。

img_569f00a8a8005

Docker 常見名詞

  • 映象檔 (Image) – 映象檔是唯讀檔,用來建立 Docker 容器 (Container),裏面包含完整的檔案系統與執行所需要的軟體元件。

    例如:一個映象檔可以包含一個完整的 ubuntu 作業系統環境,裡面安裝了 Apache 伺服器或使用者需要的其它應用程式。

    使用者可以使用 pull 從公開倉庫或私人倉庫下載映象檔,或 是使用 build  Dockerfile 方式自己建立映象檔。

  • 容器 (Container) – 容器是映象檔的執行實例,  當使用 run 啟動映象檔時, 會在映象檔最上層建立可讀寫層, 也就是容器。

    一個映象檔可以產生好幾個容器,每個容器都是相互隔離的,容器可以被啟動、開始、停止、刪除、暫停、恢復。

  • 倉庫 (Repository) – 倉庫是集中存放映象檔的地方。

    倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。

    有時候會把倉庫和倉庫註冊服務(Registry)混為一談,並不嚴格區分,Registry 是指用來儲存映象檔的服務,官方提供的映象檔 Registry 服務稱為 Docker HubDocker Hub 是最大的公開倉庫,存放了數量龐大的映象檔供使用者下載。當然,使用者也可以在本地網路內建立一個私有倉庫。

    當使用者建立了自己的映象檔之後就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一台機器上使用這個映象檔時候,只需要從倉庫上 pull 下來就可以了。

安裝 Docker 與更多 Docker 資料請參考:

使用 Dockerfile 建立 SVN Docker Image

Dockerfile 是建立映象檔的腳本檔,可以使用 docker build -t your-name/image-name . 來建立一個新的映象檔,以下是一個可建立 ubuntu + apache2 + subversion + svnadmin 映象檔的 Dockerfile。

FROM ubuntu:14.04

RUN apt-get update


RUN apt-get install -y apache2 subversion libapache2-svn libapache2-mod-php5

#RUN a2enmod dav_svn

# Redirect to the SVN from APACHE root
RUN echo '<html><head><meta http-equiv="refresh" content="0; URL=svn/"></head><body></body></html>' > /var/www/html/index.html

# APACHE environment variables
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_LOCK_DIR /var/lock
ENV APACHE_PID_FILE /var/run/apache2.pid

# Create a repository directory
RUN mkdir -p /var/svn
RUN mkdir -p /var/svn/subversion
RUN mkdir -p /var/svn/repoz
RUN mkdir -p /var/svn/svnadmin

# Set permissions
RUN addgroup subversion
RUN usermod -a -G subversion www-data
RUN chown -R www-data:subversion /var/svn
RUN chmod -R g+rws /var/svn


# Configure Apache to serve up Subversion
ADD dav_svn.conf /etc/apache2/mods-available/dav_svn2.conf
RUN rm /etc/apache2/mods-available/dav_svn.conf

## Create password & authentication file
#RUN touch /var/svn/subversion/passwd
#RUN touch /var/svn/subversion/authz
#RUN chmod -R 666 /var/svn/subversion/passwd
#RUN chmod -R 666 /var/svn/subversion/authz

# Install iF.SVNAdmin - Web-based GUI to manage Subversion
ADD svnadmin-1.6.2-raykuo.tar /var/www/html

#########################################
ADD sudoers /etc/sudoers
RUN chmod 440 /etc/sudoers
#########################################

WORKDIR /var/svn

EXPOSE 80 
EXPOSE 3690

ADD startup.sh /startup.sh
RUN chmod 755 /startup.sh

CMD ["/startup.sh"]

下載完整的 Dockerfile svn-server.zip,壓縮檔內有幾個檔案:

  Dockerfile 建立映象檔腳本檔
dav_svn.conf subversion with apache config
svnadmin-1.6.2-raykuo.tar  WEB SVN 介面管理系統 (iF.SVNAdmin) (raykuo修改版 – 修正在 Docker 中一些執行錯誤)。
startup.sh 啟動容器時初始化 apache、svn 腳本
sudoers ubuntu sudoers 權限修改
測試用 build.sh  build 映象檔
save.sh  將映象檔存成 svn-server.tar
run.sh  執行容器
clear.sh  刪除停止與無tag的容器與映象檔

解開壓縮檔並切換到該目錄,執行 build.sh 便可建立 tag 名為 “raykuo/svn-server” 的映象檔。執行 save.sh 會將映象檔存成 “svn-server.tar”。

在 Dockerfile 會建立三個資料夾用來存資料,分別是 

/var/svn/repoz SVN Repository
/var/svn/subversion subversion 設定檔
/var/svn/svnadmin svnadmin 設定檔

因為 Hyper Backup (DSM6 beta2) 不會備份容器,因此我希望讓容器的資料可以存放在 NAS 共用資料夾讓 Hyper Backup 可以備份,所以先在 NAS docker 共用資料夾下新增一個 svn 資料夾並設定權限,在佈署容器時再將該資料夾對應到容器中的 /var/svn。

新增 docker/svn 資料夾,按右鍵 -> 內容 -> 權限 -> 新增 -> 使用者或群組 -> Everyone,權限設為 讀取&寫入

Screenshot_030716_014656_PM_030716_031326_PM

 

安裝映像檔

將 svn-server.tar 上傳到 NAS,執行 Docker 套件 -> 映像檔 -> 新增 -> 從檔案加入 -> 選擇 svn-server.tar

Untitled_Clipping_030416_020922_PM_030416_022837_PM

Screenshot_030416_021429_PM_030416_022807_PM

 

佈署映像檔

映像檔 -> svn-server:latest -> 佈署 -> 修改本機連接埠

Screenshot_030416_022721_PM

Screenshot_030416_023035_PM

 

進階設定 -> 儲存空間 -> 新增資料夾 -> 選擇資料夾 -> 輸入掛載路徑 -> 確定 -> 套用

Screenshot_030416_023548_PM

Screenshot_030416_023929_PM

Screenshot_030416_024028_PM

 

啟動容器

容器 -> 啟動。

Screenshot_030416_024245_PM

 

使用 SVNAdmin 建立儲存庫

進入 SVNAdmin,在瀏覽器網址輸入 http://your_nas_ip:3691/svnadmin/, SVNAdmin 預設帳號密碼為: admin / admin

Screenshot_030716_012349_PM

建立 SVN 儲存庫:Repositories -> Add -> Repository name -> test1 -> Create

Untitled_Clipping_030716_012600_PM

Untitled_Clipping_030716_012821_PM

設定儲存庫權限:Access-Paths -> Permissions -> admin -> read & write -> test1:/ -> Assign

Untitled_Clipping_030716_012859_PM

Untitled_Clipping_030716_013039_PM

 

使用瀏覽器瀏覽儲存庫

在瀏覽器網址列輸入:http://your_nas_ip:3691/svn/ ,帳號密碼為 SVNAdmin 設定的帳號密碼。

Untitled_Clipping_030716_013139_PM

Untitled_Clipping_030716_013228_PM

 

使用 TortoiseSVN 存取儲存庫

Mouse 右鍵 -> SVN Checkout -> http://your_nas_ip:3691/svn/test1/ -> OK -> 輸入帳號密碼

Untitled_Clipping_030716_013422_PM

Untitled_Clipping_030716_013509_PM

Untitled_Clipping_030716_013918_PM

Untitled_Clipping_030716_013949_PM

 

容器執行後,共用資料夾 /docker/svn 下建立的儲存庫與設定檔資料夾。

Screenshot_030716_014457_PM

 

[Synology NAS] 實作可在 Synology NAS 上執行的 SVN Docker Image 有 “ 5 則迴響 ”

  1. 很感谢作者的文章,应该是最好的关于docker svn、svnamdin的文章,在我实际的运行中会遇到了些问题:
    ./run.sh
    AH00558: apache2: Could not reliably determine the server’s fully qualified domain name, using 172.17.0.54. Set the ‘ServerName’ directive globally to suppress this message
    在这里也找到了相关答案:http://askubuntu.com/questions/256013/could-not-reliably-determine-the-servers-fully-qualified-domain-name ,我想问一下,您那边不需要修改这些设置不会出现我出的问题吗?

    1. 確實會有這個警告訊息, apache2 在沒指定 ServerName 的情況下都會有這個訊息, 這是正常的。

  2. 您好!

    我依照您上述的方法操作,安裝成功,但是使用TortoiseSVN 存取儲存庫時出現以下問題:
    1.瀏覽儲存庫時沒有要求輸入帳號密碼(應該自動用匿名登錄了)
    2.執行commit時失敗,錯誤訊息是”Authorization failed”,也沒有要求輸入另外的帳號密碼,按”Retry as different user”後輸入有權限的user,一樣出現錯誤訊息”Authorization failed”
    請問一下排除這個問題? 謝謝!

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *