簡介 Docker
Docker 允許開發者可以封裝 (package) 應用程式與其所有相依軟體成為一個映象檔 (Image),映象檔中包含了完整的檔案系統與執行所需要的軟體元件、應用程式,這可以保證映象檔在任何 Docker 伺服器 (也稱為 Docker Engine) 上都能有相同的執行結果。
Docker 能進行快速部署,提供獨立運作的作業環境,支援許多平台,包括實體機器、虛擬機、公有雲、私有雲、個人電腦、伺服器等。
Docker 是一個輕羽量級的虛擬引擎,是在作業系統層面上實作虛擬化,直接使用本地主機的作業系統,而傳統虛擬化方式則是在硬體層面實作。
Docker 映象檔是採用一種分層堆疊 (layer) 的運作方式,採用了 aufs 的檔案架構。
aufs是一種 UnionFS, 是一種分層、輕量級並且高效能的檔案系統,它支援同時就是支持將不同目錄掛載到同一個虛擬檔案系統下,並實現一種 layer 的概念。
要建立一個可提供應用程式完整執行環境的映象檔,要先從一個基礎映象檔 (Base Image) 開始疊起,一層層將不同的映象檔疊加上去,最後組合成一個應用程式所需執行環境的映象檔。
映象檔是唯讀 (Read Only) 的,當使用 docker run
指令執行映象檔時,Docker Engine 會再疊上一層可讀寫層,這個可讀寫層則稱為容器 (container)。
Docker 常見名詞
- 映象檔 (Image) – 映象檔是唯讀檔,用來建立 Docker 容器 (Container),裏面包含完整的檔案系統與執行所需要的軟體元件。
例如:一個映象檔可以包含一個完整的 ubuntu 作業系統環境,裡面安裝了 Apache 伺服器或使用者需要的其它應用程式。
使用者可以使用
pull
從公開倉庫或私人倉庫下載映象檔,或 是使用build
Dockerfile 方式自己建立映象檔。
- 容器 (Container) – 容器是映象檔的執行實例, 當使用
run
啟動映象檔時, 會在映象檔最上層建立可讀寫層, 也就是容器。一個映象檔可以產生好幾個容器,每個容器都是相互隔離的,容器可以被啟動、開始、停止、刪除、暫停、恢復。
- 倉庫 (Repository) – 倉庫是集中存放映象檔的地方。
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。
有時候會把倉庫和倉庫註冊服務(Registry)混為一談,並不嚴格區分,Registry 是指用來儲存映象檔的服務,官方提供的映象檔 Registry 服務稱為 Docker Hub。Docker 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
,權限設為 讀取&寫入
。
安裝映像檔
將 svn-server.tar 上傳到 NAS,執行 Docker
套件 -> 映像檔
-> 新增
-> 從檔案加入
-> 選擇 svn-server.tar
。
佈署映像檔
映像檔
-> svn-server:latest
-> 佈署
-> 修改本機連接埠
。
進階設定
-> 儲存空間
-> 新增資料夾
-> 選擇資料夾
-> 輸入掛載路徑
-> 確定
-> 套用
。
啟動容器
容器 -> 啟動。
使用 SVNAdmin 建立儲存庫
進入 SVNAdmin,在瀏覽器網址輸入 http://your_nas_ip:3691/svnadmin/
, SVNAdmin 預設帳號密碼為: admin
/ admin
。
建立 SVN 儲存庫:Repositories
-> Add
-> Repository name -> test1
-> Create
。
設定儲存庫權限:Access-Paths
-> Permissions
-> admin
-> read & write
-> test1:/
-> Assign
。
使用瀏覽器瀏覽儲存庫
在瀏覽器網址列輸入:http://your_nas_ip:3691/svn/
,帳號密碼為 SVNAdmin 設定的帳號密碼。
使用 TortoiseSVN 存取儲存庫
Mouse 右鍵
-> SVN Checkout
-> http://your_nas_ip:3691/svn/test1/
-> OK
-> 輸入帳號密碼
。
容器執行後,共用資料夾 /docker/svn 下建立的儲存庫與設定檔資料夾。
很感谢作者的文章,应该是最好的关于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 ,我想问一下,您那边不需要修改这些设置不会出现我出的问题吗?
確實會有這個警告訊息, apache2 在沒指定 ServerName 的情況下都會有這個訊息, 這是正常的。
创建docker image 一直没有成功,能不能给一个docker image下载地址?谢谢
可以用了,非常不错,
您好!
我依照您上述的方法操作,安裝成功,但是使用TortoiseSVN 存取儲存庫時出現以下問題:
1.瀏覽儲存庫時沒有要求輸入帳號密碼(應該自動用匿名登錄了)
2.執行commit時失敗,錯誤訊息是”Authorization failed”,也沒有要求輸入另外的帳號密碼,按”Retry as different user”後輸入有權限的user,一樣出現錯誤訊息”Authorization failed”
請問一下排除這個問題? 謝謝!