什么是docker Docker入門教程第一篇
Docker是個新生的事物,概念類似虛擬化。網(wǎng)上關(guān)于Docker入門的東西已經(jīng)很多了。不過本文探討了Docker的特點、特性、原理,還介紹了具有中國特色的安裝測試過程,另外還談到了Docker的社區(qū)生態(tài)和Dockerfile,并使用Dockerfile構(gòu)建一個nginx環(huán)境。
緣起
在幾個月前聽說Docker,但是一直沒有時間去研究,前一段時間趁著azure免費試用,趕緊實驗一下,但是卡在了ubuntu基礎鏡像的下載上(由于國內(nèi)網(wǎng)絡的特殊原因),所以也就擱淺了,這里把經(jīng)驗和體會分享一下。
Docker簡介
我覺得簡單來說,Docker就是一個應用程序執(zhí)行容器,類似虛擬機的概念。但是與虛擬化技術(shù)的不同點在于下面幾點:
1.虛擬化技術(shù)依賴物理CPU和內(nèi)存,是硬件級別的;而docker構(gòu)建在操作系統(tǒng)上,利用操作系統(tǒng)的containerization技術(shù),所以docker甚至可以在虛擬機上運行。
2.虛擬化系統(tǒng)一般都是指操作系統(tǒng)鏡像,比較復雜,稱為“系統(tǒng)”;而docker開源而且輕量,稱為“容器”,單個容器適合部署少量應用,比如部署一個redis、一個memcached。
3.傳統(tǒng)的虛擬化技術(shù)使用快照來保存狀態(tài);而docker在保存狀態(tài)上不僅更為輕便和低成本,而且引入了類似源代碼管理機制,將容器的快照歷史版本一一記錄,切換成本很低。
4.傳統(tǒng)的虛擬化技術(shù)在構(gòu)建系統(tǒng)的時候較為復雜,需要大量的人力;而docker可以通過Dockfile來構(gòu)建整個容器,重啟和構(gòu)建速度很快。更重要的是Dockfile可以手動編寫,這樣應用程序開發(fā)人員可以通過發(fā)布Dockfile來指導系統(tǒng)環(huán)境和依賴,這樣對于持續(xù)交付十分有利。
5.Dockerfile可以基于已經(jīng)構(gòu)建好的容器鏡像,創(chuàng)建新容器。Dockerfile可以通過社區(qū)分享和下載,有利于該技術(shù)的推廣。
Docker的主要特性如下(摘自Docker:具備一致性的自動化軟件部署):
文件系統(tǒng)隔離:每個進程容器運行在完全獨立的根文件系統(tǒng)里。
資源隔離:可以使用cgroup為每個進程容器分配不同的系統(tǒng)資源,例如CPU和內(nèi)存。
網(wǎng)絡隔離:每個進程容器運行在自己的網(wǎng)絡命名空間里,擁有自己的虛擬接口和IP地址。
寫時復制:采用寫時復制方式創(chuàng)建根文件系統(tǒng),這讓部署變得極其快捷,并且節(jié)省內(nèi)存和硬盤空間。
日志記錄:Docker將會收集和記錄每個進程容器的標準流(stdout/stderr/stdin),用于實時檢索或批量檢索。
變更管理:容器文件系統(tǒng)的變更可以提交到新的映像中,并可重復使用以創(chuàng)建更多的容器。無需使用模板或手動配置。
交互式Shell:Docker可以分配一個虛擬終端并關(guān)聯(lián)到任何容器的標準輸入上,例如運行一個一次性交互shell。
目前Docker正處在開發(fā)階段,官方不建議用于生產(chǎn)環(huán)境。另外,Docker是基于Ubuntu開發(fā)的,所以官方推薦將其安裝在Ubuntu的操作系統(tǒng)上,目前只能安裝在linux系統(tǒng)上。
Docker的使用入門
Docker官方的安裝指導挺詳細的。但是由于國內(nèi)的特殊情況,我這里基于這個安裝指導,給出適用于國內(nèi)開發(fā)者的入門過程?;赨buntu Precise 12.04 (LTS) (64-bit),推薦這個版本,其他版本參考官方安裝手冊。
1、Docker的安裝
首先,Docker官方聲稱最好是運行在Linux內(nèi)核3.8以上,所以要先進行內(nèi)核升級
# install the backported kernel sudo apt-get update sudo apt-get install linux-image-generic-lts-raring linux-headers-generic-lts-raring # reboot sudo reboot
添加Docker倉庫的key:
添加鏡像,這里直接用俄羅斯的Yandex
sudo sh -c "echo deb http://mirror.yandex.ru/mirrors/docker/ docker main > /etc/apt/sources.list.d/docker.list" sudo apt-get update
安裝Docker
sudo apt-get install lxc-docker
一般上面的步驟不會有任何問題。
2、Docker鏡像下載
Docker運行至少需要一個ubuntu的基礎鏡像,這個鏡像會在你初次嘗試執(zhí)行時自動下載,不過從國內(nèi)直接用基本上就別想了,需要使用代理。這里用Docker中文社區(qū)提供的代理。出處1,出處2。
修改/etc/default/docker文件,取消注釋http_proxy的部分:
# If you need Docker to use an HTTP proxy, it can also be specified here.
export http_proxy=http://192.241.209.203:8384/
經(jīng)過筆者測試,上面這個代理也不是很穩(wěn)定,可能用的人比較多吧。
可用的代理地址(持續(xù)關(guān)注中)
http://192.241.209.203:8384
然后,你就可以執(zhí)行下面的命令,測試執(zhí)行了,由于代理不是很穩(wěn)定,可能需要多嘗試幾次(淡定):
sudo docker run -i -t ubuntu /bin/bash
下面這個截圖是我成功pull完成,并測試hello world成功(大概嘗試了3-4次):
Docker的社區(qū)和生態(tài)
倉庫和鏡像
評估一項開源技術(shù)很大程度上需要關(guān)注它的社區(qū)和生態(tài)。Docker的生態(tài)是通過推送和拉取特定的“鏡像(image)包”來展開的。你可以從docker index上搜索需要的鏡像。也可以通過下面的命令搜索:
sudo docker search
鏡像可以看作是包含有某些軟件的容器系統(tǒng),比如ubuntu就是一個官方的基礎鏡像,很多鏡像都是基于這個鏡像“衍生”,該鏡像包含基本的ubuntu系統(tǒng)。再比如,hipache是一個官方的鏡像容器,運行后可以支持http和websocket的代理服務,而這個鏡像本身又基于ubuntu。
通過pull來拉取鏡像,將鏡像下載到本地,比如
sudo docker pull hipache
通過images查看現(xiàn)在有哪些鏡像:
sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu 13.10 9f676bd305a4 6 weeks ago 178 MB ubuntu saucy 9f676bd305a4 6 weeks ago 178 MB ubuntu 13.04 eb601b8965b8 6 weeks ago 166.5 MB ubuntu raring eb601b8965b8 6 weeks ago 166.5 MB ubuntu 12.10 5ac751e8d623 6 weeks ago 161 MB ubuntu quantal 5ac751e8d623 6 weeks ago 161 MB ubuntu 10.04 9cc9ea5ea540 6 weeks ago 180.8 MB ubuntu lucid 9cc9ea5ea540 6 weeks ago 180.8 MB ubuntu 12.04 9cd978db300e 6 weeks ago 204.4 MB ubuntu latest 9cd978db300e 6 weeks ago 204.4 MB ubuntu precise 9cd978db300e 6 weeks ago 204.4 MB
上面的都是鏡像,都從屬于ubuntu倉庫(一般倉庫名應該是username/repository格式,如果是直接以repository作為倉庫名的,是指官方發(fā)布的倉庫)。我們拉取ubuntu的時候,實際上是把倉庫里的鏡像都拉下來了。每個鏡像都有一個唯一的IMAGE ID,和一個易于記憶的TAG,可以通過IMAGE ID的前幾位或者repository:TAG來標識一個鏡像。
Dockerfile和通過Dockerfile來構(gòu)建Nginx容器
除了pull,鏡像也可以通過"編譯"得到,這里的"編譯"是指一種構(gòu)建行為,通過手動編寫或者從github獲取Dockerfile來構(gòu)建一個鏡像。可以把Dockerfile看成是一個腳本,這個腳本會在容器每次啟動時執(zhí)行。一般在Dockerfile里面需要編寫基礎軟件的安裝腳本和配置腳本。下面這個Dockerfile是個例子:
# # Ubuntu Dockerfile # # https://github.com/dockerfile/ubuntu # # Pull base image. FROM ubuntu:12.10 # Update OS. RUN echo "deb http://archive.ubuntu.com/ubuntu quantal main universe multiverse" > /etc/apt/sources.list RUN apt-get update RUN apt-get upgrade -y # Install basic packages. RUN apt-get install -y software-properties-common RUN apt-get install -y curl git htop unzip vim wget # Add files. ADD root/.bashrc /root/.bashrc ADD root/.gitconfig /root/.gitconfig ADD root/scripts /root/scripts # Set working directory. ENV HOME /root WORKDIR /root
FROM指令表示這次構(gòu)建需要基于ubuntu倉庫的12.10這個TAG的鏡像,如果本地不存在這個鏡像的話,會自動下載鏡像。鏡像實際上就是編譯好的結(jié)果。向上面這個Dockerfile,在原始ubuntu的基礎上安裝了很多常用的軟件。
docker官方有Dockerfile的教程:https://www.docker.com/what-docker
實踐
首先確保你已經(jīng)完成上面的安裝步驟,并拉取到基礎鏡像ubuntu:12.10。
現(xiàn)在我們用上面的Dockerfile來構(gòu)建這個倉庫(上面的Dockerfile實際上是github dockerfile項目的基本倉庫dockerfile/ubuntu,所下面的命令直接從github下載Dockerfile來構(gòu)建)
下面是最后構(gòu)建成功時的輸出:
... Processing triggers for ureadahead ... ---> 0a4392cf8e2d Step 6 : ADD root/.bashrc /root/.bashrc ---> b0e86f348c09 Step 7 : ADD root/.gitconfig /root/.gitconfig ---> e2a9c001d457 Step 8 : ADD root/scripts /root/scripts ---> 678febabdbdc Step 9 : ENV HOME /root ---> Running in c4afef311cf1 ---> eaa3ae3277a8 Step 10 : WORKDIR /root ---> Running in d50c273c75b8 ---> c9ecf5bc3227 Successfully built c9ecf5bc3227 Removing intermediate container 1a3d1f794c49 Removing intermediate container 9f72df8abb63 Removing intermediate container 5694d1e3e77e Removing intermediate container 6a184821f89c Removing intermediate container 8195bd05fc36 Removing intermediate container d50c273c75b8 Removing intermediate container 70de07353ecf Removing intermediate container 73e3f6204613 Removing intermediate container 5dd948415981 Removing intermediate container c4afef311cf1
此時會多出一個倉庫:
sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE dockerfile/ubuntu latest c9ecf5bc3227 About a minute ago 294.2 MB ...
現(xiàn)在我們可以來構(gòu)建dockerfile/nginx了(當然,從一開始你就可以直接pull這個鏡像)
sudo docker build -t="dockerfile/nginx" github.com/dockerfile/nginx
完成后,會看到編譯好的鏡像:
sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE dockerfile/nginx latest 68508350c656 About a minute ago 308.3 MB dockerfile/ubuntu latest c9ecf5bc3227 16 minutes ago 294.2 MB ...
現(xiàn)在是時候看到真正的效果了!用下面這個命令運行容器:
sudo docker run -d -p 80:80 dockerfile/nginx
這個命令會以daemon的方式運行容器,通過下面命令查看正在運行的容器:
sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 98c474a7dd6a dockerfile/nginx:latest nginx 6 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp trusting_hawking
訪問你主機的80端口,可以看到nginx的歡迎頁面了!這時,我們來看看本機的進程sudo ps -ef:
root 1428 952 0 15:19 ? 00:00:00 nginx: master process nginx root 1429 417 0 15:19 ? 00:00:00 /sbin/udevd --daemon www-data 1441 1428 0 15:19 ? 00:00:00 nginx: worker process www-data 1442 1428 0 15:19 ? 00:00:00 nginx: worker process www-data 1443 1428 0 15:19 ? 00:00:00 nginx: worker process www-data 1444 1428 0 15:19 ? 00:00:00 nginx: worker process
似乎有些接近事物的本質(zhì)了!nginx的進程實際上是在本機上的,這意味著,容器中程序的執(zhí)行仍然是使用本機操作系統(tǒng)的,容器并不自己構(gòu)建操作系統(tǒng),而是以某種隔離的方式依賴本機操作系統(tǒng)工作。這就是Docker和虛擬機的本質(zhì)區(qū)別。
你可以像下面這樣,將本機的目錄映射給這個"nginx容器"。<sites-enabled-dir>目錄下應該有nginx的配置文件片段
PS:這步筆者沒有成功,日志路徑是可以map的,但是sites-enable-dir中的配置始終不行。繼續(xù)診斷中。
鏡像的共享與Dockfile的分發(fā)
可以共享你的鏡像和用來構(gòu)建的Dockfile分享給社區(qū):
Docker index是官方的鏡像目錄,可以從里面得到大量的預編譯好的鏡像
Dockerfile Project一個托管Dockerfile的倉庫集合
原理
總的來說Docker的核心技術(shù)如下:
命名空間
AUFS(advanced multi layered unification filesystem)
cgroup
由于本人才疏學淺,有興趣的朋友可以擴展閱讀一下,一定會對Docker有更深刻的認識的。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Docker部署MinIO對象存儲服務器結(jié)合Cpolar實現(xiàn)遠程訪問的操作方法
MinIO是一個開源的軟件,可以免費使用,還可以在普通硬件上運行,降低了存儲成本,本文介紹在本地Docker中部署MinIO服務,并實現(xiàn)遠程訪問管理界面,節(jié)約云服務器運行成本,感興趣的朋友一起看看吧2023-12-12docker運行PostgreSQL數(shù)據(jù)庫維護執(zhí)行腳本備份數(shù)據(jù)庫與更新表結(jié)構(gòu)的方法
這篇文章主要介紹了docker運行PostgreSQL數(shù)據(jù)庫維護,執(zhí)行腳本備份數(shù)據(jù)庫與更新表結(jié)構(gòu),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05docker-compose build使用參數(shù)args方式
這篇文章主要介紹了docker-compose build使用參數(shù)args方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01docker部署Prometheus+Cadvisor+Grafana實現(xiàn)服務器監(jiān)控
這篇文章主要為大家介紹了docker部署Prometheus+Cadvisor+Grafana實現(xiàn)服務器監(jiān)控,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11Docker容器監(jiān)控及日志管理實現(xiàn)過程解析
這篇文章主要介紹了Docker容器監(jiān)控及日志管理實現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-08-08