1. 程式人生 > >離線伺服器下docker的部署與應用

離線伺服器下docker的部署與應用

一分鐘內形成docker的模糊概念

網上很多文章避免將docker與虛擬機器混為一談,但對於初學者來說,完全可以將docker當做一種虛擬機器技術,只需要牢牢記住一點最重要的區別:docker依賴於物理機的核心,所以在linux下“生成的docker”,一般不能直接在windows下執行。(虛擬機器是完完全全模擬了一臺物理機,這是一個很大的區別)。
當你有了這樣的一個模糊概念,接下來只需要快速瞭解docker的三個基礎組成部分,倉庫、映象、容器,就可以快速的應用起來。類比虛擬機器,映象就相當於安裝虛擬機器時用的iso檔案,倉庫自然就是一個官方存放映象的地方,方便使用者直接“下載”,當你的虛擬機器執行起來後,就相當於一個容器


我為什麼使用docker,需求是什麼

在很多專案中,我們需要對一些url進行定時撥測,獲取這些url的各種指標,例如響應時間、渲染時間等等,網上有許多開源的工具供我們挑選使用,sitespeed就是其中之一。sitespeed可以對訪問過程進行度量,形成各種指標。訪問過程進行錄相、截圖。指標分為瀏覽(體驗)類指標、評分指標、DNS指標等幾個維度。關於sitespeed更為詳細的介紹可自行搜尋。
然後由於其使用圖形介面的瀏覽器,不太適合做為服務端程式執行,同時其各種依賴庫的安裝配置較為麻煩,故以docker的方式執行是比較合適的。https://www.sitespeed.io/在sitespeed.io的官方介紹上也指出所提供的docker映象部署了所有的執行環境,對於使用者只需直接使用即可。

離線安裝docker:部署yum源或者rpm/deb包安裝

對於某些特定環境,伺服器是不允許訪問網際網路的,因此不能直接從軟體源下載docker進行安裝,這就造成了很多依賴包安裝的麻煩。在此可以有幾種不同的離線安裝方式可供選擇:
* 對於ubuntu系統,你只需一臺聯網的同環境的虛擬機器就可以得到deb安裝包和所有的依賴包
apt-get install --download-only docker這條命令的具體用法可以自行搜尋,解決令人頭疼的依賴問題簡直舒服。
* 對於centos系統,同樣可以搜尋所有的依賴包,通過rpm包的方法安裝。但更加推薦部署本地yum源的方式,簡單高效一勞永逸,部署步驟可自行搜尋。

映象檔案的匯入匯出

不能訪問網際網路,意味著docker提供的官方倉庫也不可訪問,因此需要我們在本地虛擬機器docker pull sitespeed.io相應的映象,可以簡單測試是否可用。

[~]$ docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
docker.io/hello-world                latest              e38bc07ac18e        7 weeks ago         1.85 kB
docker.io/sitespeedio/sitespeed.io   latest              38463a656de8        8 weeks ago         1.77 GB
[~]$ docker run hello-world
Hello from Docker!

通過docker images看到本地存放了兩個映象,docker run *命令可以簡單的在某個映象檔案基礎上啟動一個容器。
接下來要做的就是將映象檔案使用save命令匯出為tar檔案:
docker save 38463a656de8> /root/sitespeed.tar
通過物理裝置傳輸至離線伺服器上,通過load命令匯入映象:
docker load < /root/sitespeed.tar
匯入完成後,用docker images命令檢視,驚奇的發現REPOSITORY和TAG列均為,所以save命令儲存的並不是所有的資訊,具體的區別自行搜尋即可。不過不影響使用,我們只要修改一下就可以正常使用了。
docker tag 38463a656de8 docker.io/sitespeedio/sitespeed.io:latest

docker映象是如何製作的

基於docker提供的服務,我們想要製作自己特定功能的docker映象,只需要按照格式編寫一個Dockerfile檔案即可。一個簡單的Dockerfile如下:

FROM ubuntu14.04
COPY start.sh /start.sh
RUN apt-get install -y gcc
CMD
ENTRYPOINT ["/start.sh"]

FROM命令用於指定一個基礎映象(當然可以指定一個空映象scratch),COPY和RUN都是字面意思,CMD和ENTRYPOINT 指定docker啟動時的執行命令,關於二者的區別,在此不細說,推薦使用ENTRYPOINT。
編寫完成後,執行命令:docker build -t my_name:my_tag
通過docker images命令就可以看到本地已經有了剛剛建立的映象,通過
docker run my_name:my_tag就可以啟動並執行。
不得不提的是,Dockerfile中的每一條命令都會建立一個臨時層,(類似於套娃的感覺)所以要注意命令的書寫方式,比如多條RUN命令合為一條書寫。同時,減少不必要的操作。例如,新建一個檔案,在後面步驟又刪除了,這樣兩次操作都會儲存在最終的docker映象中,生成映象的體積也會增大,這就是網上一些不成熟的映象體積很大的原因。
關於docker啟動時的很多引數都可以自己按需查詢,個人覺得-v和–entrypoint引數結合使用,會對大家測試一些小東西很有幫助。

-v 指定一個本地目錄掛載到容器中指定位置
--entrypoint 指定docker執行入口,覆蓋Dockerfile中的CMDENTRYPOINT

例如:

docker run --entrypoint /app/start.sh -v /root/app:/app docker_img.io

首先通過-v將本地的/root/app目錄掛載到映象中的/app目錄,之後再通過–entryponit指定執行入口為/app/start.sh。
有了這樣的用法,我們可以通過Dockerfile建立一個包含各種執行環境的基礎映象,通過這樣的方式,測試我們自己的小程式(雖然應用場景有限)。當然還是要牢記文章開頭所說的,docker是需要基於物理機的核心。

補充:關於docker的垃圾回收問題

在某次意外操作後,發現依賴docker的應用無法正常執行,排查原因發現竟然是磁碟空間不足,docker無法啟動。發現在/var/lib/docker/目錄下存在大量檔案,原來docker每次執行時會在/var/lib/docker/containers以及/var/lib/docker/overlay下生成一些相關檔案,具體作用可自行查閱。但問題在於docker執行結束並不會自動回收產生的這些記錄檔案,隨著時間的積累,導致歷史檔案會越來越多。如何解決,docker官方提供了相關的垃圾回收功能,需手動執行,當然也可以自己編寫垃圾回收守護程序,或者在github上有許多好的開源程式可供使用。

本文主要敘述了一些簡單的docker使用場景,若果個別地方有錯誤,請不吝指出。