一分鐘內形成docker的模糊概念
網上很多文章避免將docker與虛擬機混為一談,但對于初學者來說,完全可以將docker當做一種虛擬機技術先匪,只需要牢牢記住一點最重要的區(qū)別:docker依賴于物理機的內核,所以在linux下“生成的docker”,一般不能直接在windows下運行考传。(虛擬機是完完全全模擬了一臺物理機,這是一個很大的區(qū)別)证鸥。
當你有了這樣的一個模糊概念僚楞,接下來只需要快速了解docker的三個基礎組成部分,倉庫枉层、鏡像泉褐、容器,就可以快速的應用起來鸟蜡。類比虛擬機膜赃,鏡像就相當于安裝虛擬機時用的iso文件,倉庫自然就是一個官方存放鏡像的地方矩欠,方便用戶直接“下載”财剖,當你的虛擬機運行起來后,就相當于一個容器癌淮。
我為什么使用docker躺坟,需求是什么
在很多項目中,我們需要對一些url進行定時撥測乳蓄,獲取這些url的各種指標咪橙,例如響應時間、渲染時間等等虚倒,網上有許多開源的工具供我們挑選使用美侦,sitespeed就是其中之一。sitespeed可以對訪問過程進行度量魂奥,形成各種指標菠剩。訪問過程進行錄相、截圖耻煤。指標分為瀏覽(體驗)類指標具壮、評分指標、DNS指標等幾個維度哈蝇。關于sitespeed更為詳細的介紹可自行搜索棺妓。
然后由于其使用圖形界面的瀏覽器,不太適合做為服務端程序運行炮赦,同時其各種依賴庫的安裝配置較為麻煩怜跑,故以docker的方式運行是比較合適的。https://www.sitespeed.io/在sitespeed.io的官方介紹上也指出所提供的docker鏡像部署了所有的運行環(huán)境吠勘,對于用戶只需直接使用即可性芬。
離線安裝docker:部署yum源或者rpm/deb包安裝
對于某些特定環(huán)境峡眶,服務器是不允許訪問互聯(lián)網的,因此不能直接從軟件源下載docker進行安裝植锉,這就造成了很多依賴包安裝的麻煩幌陕。在此可以有幾種不同的離線安裝方式可供選擇:
- 對于ubuntu系統(tǒng),你只需一臺聯(lián)網的同環(huán)境的虛擬機就可以得到deb安裝包和所有的依賴包汽煮。
apt-get install --download-only docker
這條命令的具體用法可以自行搜索,解決令人頭疼的依賴問題簡直舒服棚唆。 - 對于centos系統(tǒng)暇赤,同樣可以搜索所有的依賴包,通過rpm包的方法安裝宵凌。但更加推薦部署本地yum源的方式鞋囊,簡單高效一勞永逸,部署步驟可自行搜索瞎惫。
鏡像文件的導入導出
不能訪問互聯(lián)網溜腐,意味著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命令查看伞辛,驚奇的發(fā)現(xiàn)REPOSITORY和TAG列均為<none>烂翰,所以save命令保存的并不是所有的信息,具體的區(qū)別自行搜索即可蚤氏。不過不影響使用甘耿,我們只要修改一下就可以正常使用了。
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啟動時的運行命令,關于二者的區(qū)別曙砂,在此不細說头谜,推薦使用ENTRYPOINT。
編寫完成后鸠澈,運行命令:docker build -t my_name:my_tag
通過docker images
命令就可以看到本地已經有了剛剛創(chuàng)建的鏡像柱告,通過
docker run my_name:my_tag
就可以啟動并運行截驮。
不得不提的是,Dockerfile中的每一條命令都會創(chuàng)建一個臨時層际度,(類似于套娃的感覺)所以要注意命令的書寫方式葵袭,比如多條RUN命令合為一條書寫。同時乖菱,減少不必要的操作坡锡。例如,新建一個文件窒所,在后面步驟又刪除了鹉勒,這樣兩次操作都會存儲在最終的docker鏡像中,生成鏡像的體積也會增大吵取,這就是網上一些不成熟的鏡像體積很大的原因禽额。
關于docker啟動時的很多參數(shù)都可以自己按需查找,個人覺得-v和--entrypoint參數(shù)結合使用皮官,會對大家測試一些小東西很有幫助脯倒。
-v 指定一個本地目錄掛載到容器中指定位置
--entrypoint 指定docker運行入口,覆蓋Dockerfile中的CMD和ENTRYPOINT
例如:
docker run --entrypoint /app/start.sh -v /root/app:/app docker_img.io
首先通過-v將本地的/root/app目錄掛載到鏡像中的/app目錄捺氢,之后再通過--entryponit指定運行入口為/app/start.sh藻丢。
有了這樣的用法,我們可以通過Dockerfile建立一個包含各種運行環(huán)境的基礎鏡像讯沈,通過這樣的方式郁岩,測試我們自己的小程序(雖然應用場景有限)。當然還是要牢記文章開頭所說的缺狠,docker是需要基于物理機的內核问慎。
補充:關于docker的垃圾回收問題
在某次意外操作后,發(fā)現(xiàn)依賴docker的應用無法正常運行挤茄,排查原因發(fā)現(xiàn)竟然是磁盤空間不足如叼,docker無法啟動。發(fā)現(xiàn)在/var/lib/docker/目錄下存在大量文件穷劈,原來docker每次運行時會在/var/lib/docker/containers以及/var/lib/docker/overlay下生成一些相關文件笼恰,具體作用可自行查閱。但問題在于docker運行結束并不會自動回收產生的這些記錄文件歇终,隨著時間的積累社证,導致歷史文件會越來越多。如何解決评凝,docker官方提供了相關的垃圾回收功能追葡,需手動運行,當然也可以自己編寫垃圾回收守護進程,或者在github上有許多好的開源程序可供使用宜肉。
本文主要敘述了一些簡單的docker使用場景匀钧,若果個別地方有錯誤,請不吝指出谬返。