1、docker是什麼
Docker使用go基於linux lxc(linux containers)技術實現的開源容器,誕生於2013年年初,最開始叫dotcloud公司,13年年底改名為docker inc。
2017年下載次數達到了百億次,估值達13億美元,透過對應用封裝(Packaging)、分發(Distribution)、部署(Deployment)、執行(Runtime)全生命週期管理,達到“一次封裝,到處執行”
為何使用docker?
Docker直譯碼頭工人,將各種大小和形狀的物品裝進船裡。這對從事軟體行業的人來說,聽起來很熟悉,花了大量時間和精力把一個應用放在另一個應用裡。
docker出現之前,對不同環境的安裝、配置、維護工作量很多,如部署,配置檔案,crontab,依賴等等。使用docker,無需關心環境,只需要一些配置就能構建映象,而部署則用一條run命令。
虛擬機器VS容器
虛擬機器需要有額外的虛擬機器管理應用和虛擬機器作業系統層,作業系統層不僅佔用空間而且執行速度也相對慢。docker容器是在本機作業系統層面上實現虛擬化,因此很輕量,速度接近原生系統速度。
虛擬機器啟動速度是分鐘級別,效能較弱、記憶體和硬碟佔用大,一個物理機最多跑幾十個虛擬機器,但它的隔離性比較好。docker啟停都是秒級實現,記憶體和硬碟佔用非常小,單機支援上千個容器,在ibm伺服器上可執行上萬個容器。容器跟虛機相比,有著巨大的優勢。
docker優點
只關心應用:以往我們需要關心作業系統、軟體、專案,有了docker我們可以只關心應用而不是作業系統,docker發展迅速,基於docker的paas平臺也層出不窮,使得我們能更方便的使用docker;
快速交付:docker可在秒級提供沙箱環境,開發,測試,運維使用完全相同的環境來部署程式碼
微服務:docker有助於將一個複雜系統分解,讓使用者用更離散的方式思考服務
離線開發:將服務編排在筆記本中移動辦公,使用docker可在本機秒級別啟動一個本地開發環境;
降低除錯成本:在測試和上線時產生無效的類、有問題的依賴、缺少的配置等問題,docker可讓一個問題除錯和環境重現變得更簡單;
CD:docker讓持續交付實現變得更容易,特別是對於藍綠部署就更簡單。
第一版上線時,需要上第二版新功能,兩個版本功能會有衝突,這時用docker實現藍綠部署就非常方便了;
如:可以部署兩個版本同時線上,新版本測試沒問題了把老版本流量切到新版本就可以了
遷移:可以很快的遷移到其他雲或伺服器
與傳統虛擬機器方式相比,容器化方式在很多場景下都是存在極為明顯的優勢。無論是開發、測試、運維都應該儘快掌握docker,儘早享受其帶來的巨大便利;
容器化方式在很多場景下都有極大的優勢。無論是開發、測試、運維都應該儘快掌握docker,儘早享受其帶來的巨大便利。
概念
再來了解docker非常關鍵的概念,這樣才能理解docker容器整個生命週期。
概念-映象
映象(類)=檔案系統+資料,我常常用開發語言中的類比作映象,物件比作容器映象由多個層加上一些docker元資料組成,容器執行著由映象定義的系統。
概念-容器
容器(物件)=映象執行例項
容器是映象的執行例項,可以使用同一個映象執行多個例項。如圖所示,一個ubuntu docker映象產生了三個ubuntu容器,docker利用容器執行和隔離應用。
從讀寫角度來說,映象是隻讀的,容器是在映象上添加了一層可讀寫的檔案系統。
概念-層
層=檔案變更集合
像傳統虛機應用,每個應用都需要複製一份檔案副本,執行成百上千上磁碟空間會迅速耗光,而docker採用寫時複製來減少磁碟空間,當一個執行中的容器要寫入一個檔案時,它會把該檔案複製到新區域來記錄這次的修改,在執行docker提交時將這次修改記錄下併產生一個新的層。docker分層解決大規模使用容器時碰到的磁碟和效率問題。
概念-倉庫
docker借鑑了大量git優秀的經驗。docker倉庫分公有庫和私有庫,最大的公開倉庫是docker hub,國內也有很多倉庫源。
透過建立一個docker應用來看看docker是怎麼方便使用的。
建立docker映象方式
建立docker有四種方式
但最常用的docker命令+手工提交和Dockerfile的方式
對於我們來說Dockerfile是最常用也是最有用的。
那建立一個docker應用只需要三步:編寫dockerfile、構建映象、執行容器
編寫dockerfile
那我們就開始用dockerfile來建立一個應用
Dockerfile是包含一系列命令的文字檔案,這個檔案包含6條命令
1、FROM是使用php官方映象,左邊是映象名字,右邊是標籤名字,標籤名字不寫預設是latest
2、宣告維護人員
3、RUN執行一條linux命令,我們把php程式碼重定向到/tmp/index.php
4、EXPOSE宣告要開放的埠
5、WORKDIR啟動容器後預設目錄
6、CMD容器啟動後,預設執行的命令,相當於應用的入口,用php自帶的webserver監聽8000
構建映象
使用docker build命令生成映象,—tag指定映象的名字,左邊是名字,右邊是標籤,最後有個.表示在當前目錄查詢Dockerfile。可以看到,每個命令都會有個輸入輸出,輸入是命令,輸出是給到層的id,所以,基本上每個命令都會產生一個層。最後提示映象構建成功,並打上映象標籤。
執行容器
第三,使用docker run命令執行映象,-p將容器的8000埠對映到本機8000埠,—name給容器起個名字。用curl對本機8000埠請求,伺服器返回當前時間,說明我們構建的容器執行成功了。
請求本地8000埠,伺服器返回當前時間
dockerfile常用命令
其實Dockerfile常用命令就5個:from、add、run、workdir、cmd
建立docker應用步驟
•編寫dockerfile
•構建映象
•執行容器
使用docker應用步驟
•拉取映象
dockerfile最佳實踐
•精簡映象用途
儘量讓每個映象的用途單一
•選擇合適基礎映象
選擇以alpine、busybox等基礎的映象
busybox:號稱作業系統裡的瑞士軍刀,只有……這麼大,但卻有一百多常用命令
如果你的目標是小而精,busybox是首選,因為它已經精簡到沒有bash,使用的是ash,一個相容posix的shell
Alpine:你的目標是小但是又有一些工具的話,可以選擇alpine,它是一個面向安全的輕量linux發行版,它關注安全、效能和資源效能,比busybox功能更完善,還提供apk查詢和安裝軟體包,大小隻有2-3兆。
很多官方的映象都有alpine的映象,像剛剛使用的php映象。
•提供維護者資訊
•正確使用版本
使用明確的版本號,而非依賴於預設的latest,避免環境不一致導致的問題
如安裝軟體後的安裝包,如上圖2、3步驟
•提高生成速度
如內容不變的指令儘量放在前面,這樣可以複用
•減少映象層數
多條命令寫在一起,使生成的映象層數少,如上圖2、3步驟
•恰當使用multi-stage
保證最終生成映象最小化
想使用一個映象,用這個命令就可以了,預設按評分排序。official如果是ok表示是官方鏡,Auto標示它是否用dickerfile進行自動化映象構建。
pull
一旦確定一個映象,透過對其名稱執行docker pull來下載。標籤預設是latest,嚴格來講,映象的倉庫名還應該新增倉庫地址的,預設是registry.hub.docker.com Docker images命令查詢下載的映象。
run
使用docker run執行一個容器,it表示用互動式方式執行,最後表示要執行的命令。
其實更常用的方式是以後臺方式來執行,這時用d引數在後臺執行,執行後用exec命令進去到容器。
tag
Docker tag給映象一個新tag名字。
Docker images檢視centos映象,把centos:latest打上centos:yeedomliu,這時再看會有3個centos,latest和yeedomliu的映象id是相同的。把centos:yeedomliu刪除,再檢視latest還會存在,最後用rmi命令刪除latest就會真正把latest映象刪除掉。如果相同映象存在多個標籤,只有最後一次的rmi命令會真正刪除映象。
ps
Ps可以檢視執行中的容器
rmi
rm
diff
容器啟動後文件變化情況
logs
檢視容器執行後的日誌
cp
我們想從容器裡面複製檔案到宿主機,或相反的過程就可以用到cp命令
container prune
隨著使用docker時間越長,停止狀態下的容器會越來越多,這些都會佔據磁碟空間
image prune
未被打標籤的映象可以用image prune命令清理
system prune/df
如果你覺得剛剛兩條命令執行起來麻煩,可以用docker system prune一條命令搞定
另外用system df檢視docker磁碟空間
瞭解了docker基礎知識後,可進入相對實戰的環節
•本地開發
我們的專案使用了很多服務,如redis/mysql/mongodb等等,如果一個個執行起來,還加上配置,容易出手,也比較麻煩
kitematic:與使用命令列管理本地容器相比,你更想使用圖形工具對容器管理,官方推出的容器管理工具,透過它可以查詢映象、建立容器、配置、啟停容器等管理。
這是配置容器埠和宿主機埠,目錄,網路等對映介面
docker-compose
compose定位是“定義和執行多個docker容器的應用”,前身fig,目前仍然相容fig格式的模板檔案。
一條命令可以把一個複雜的應用啟動起來
日常工作中,經常碰到多個容器相互完成某項任務
docker-compose示例1
預設模板檔名叫docker-
compose.yml
docker-compose示例2
如果在本地開發,每個專案都可以像之前說的那樣配置,這裡提供了另外一種做法。我把公共的資源在一開始就啟動,每個專案裡只啟動nginx映象並關聯其它的服務即可。
公共服務compose
專案compose
•常見問題
主程序:docker啟動第一個程序稱主程序,就是id為1的程序,這個程序退出就意味著容器退出,所以想要使docker作為服務使用,這個程序是不能退出的。expose命令是宣告暴露的埠,執行時用-P才會生效。一般ports命令是做真正的埠對映,比較常用。
•架構
安裝了docker的主機,一般在一個私有網路上
1、呼叫docker客戶端可以從守護程序獲取資訊或傳送指令
2、docker守護程序使用http協議接收來自docker客戶端的請求
3、私有docker註冊中心儲存docker映象
4、docker hub是由docker公司運營的最大的公共註冊中心
網際網路上也存在其他公共的註冊中心
呼叫 Docker客戶端可以從守護程序獲取資訊或給它傳送指令。守護程序是一個伺服器,它使用 HTTP協議接收來自客戶端的請求並返回響應。相應地,它會向其他服務發起請求來發送和接收映象,使用的同樣是 HTTP協議。該伺服器將接收來自命令列客戶端或被授權連線的任何人的請求。守護程序還負責在幕後處理使用者的映象和容器,而客戶端充當的是使用者與 REST風格 API之間的媒介。
理解這張圖的關鍵在於,當用戶在自己的機器上執行 Docker時,與其進行互動的可能是自己機器上的另一個程序,或者甚至是執行在內部網路或網際網路上的服務。
•最佳化
使用小映象:一般來說,使用小的映象都相對比較優秀,如官方的映象基本上都有基於alpine的映象
命令寫一行:多個命令儘量寫在一起有助於減少層數,也會減少映象的大小
指令碼安裝:使用指令碼進行初始化時,可以有效減少dockerfile的命令,同時帶來另外的問題,可讀性不好並且構建映象時快取不了
扁平化映象:構建映象過程中,可能會涉及到一些敏感資訊,或者用了上面的辦法映象依然很大,可以試試這個辦法
docker export 容器名或容器id | docker import - 映象標籤
multi-stage:從docker 17.05版本開始,docker支援multi-stage(多階段構建),特別適合編譯型語言,如我在一個映象下編譯,在另外一個很小的系統執行,如下圖,go專案在golang環境下編譯,在alpine環境下執行。
1、docker是什麼
Docker使用go基於linux lxc(linux containers)技術實現的開源容器,誕生於2013年年初,最開始叫dotcloud公司,13年年底改名為docker inc。
2017年下載次數達到了百億次,估值達13億美元,透過對應用封裝(Packaging)、分發(Distribution)、部署(Deployment)、執行(Runtime)全生命週期管理,達到“一次封裝,到處執行”
為何使用docker?
Docker直譯碼頭工人,將各種大小和形狀的物品裝進船裡。這對從事軟體行業的人來說,聽起來很熟悉,花了大量時間和精力把一個應用放在另一個應用裡。
docker出現之前,對不同環境的安裝、配置、維護工作量很多,如部署,配置檔案,crontab,依賴等等。使用docker,無需關心環境,只需要一些配置就能構建映象,而部署則用一條run命令。
虛擬機器VS容器
虛擬機器需要有額外的虛擬機器管理應用和虛擬機器作業系統層,作業系統層不僅佔用空間而且執行速度也相對慢。docker容器是在本機作業系統層面上實現虛擬化,因此很輕量,速度接近原生系統速度。
虛擬機器啟動速度是分鐘級別,效能較弱、記憶體和硬碟佔用大,一個物理機最多跑幾十個虛擬機器,但它的隔離性比較好。docker啟停都是秒級實現,記憶體和硬碟佔用非常小,單機支援上千個容器,在ibm伺服器上可執行上萬個容器。容器跟虛機相比,有著巨大的優勢。
docker優點
只關心應用:以往我們需要關心作業系統、軟體、專案,有了docker我們可以只關心應用而不是作業系統,docker發展迅速,基於docker的paas平臺也層出不窮,使得我們能更方便的使用docker;
快速交付:docker可在秒級提供沙箱環境,開發,測試,運維使用完全相同的環境來部署程式碼
微服務:docker有助於將一個複雜系統分解,讓使用者用更離散的方式思考服務
離線開發:將服務編排在筆記本中移動辦公,使用docker可在本機秒級別啟動一個本地開發環境;
降低除錯成本:在測試和上線時產生無效的類、有問題的依賴、缺少的配置等問題,docker可讓一個問題除錯和環境重現變得更簡單;
CD:docker讓持續交付實現變得更容易,特別是對於藍綠部署就更簡單。
第一版上線時,需要上第二版新功能,兩個版本功能會有衝突,這時用docker實現藍綠部署就非常方便了;
如:可以部署兩個版本同時線上,新版本測試沒問題了把老版本流量切到新版本就可以了
遷移:可以很快的遷移到其他雲或伺服器
與傳統虛擬機器方式相比,容器化方式在很多場景下都是存在極為明顯的優勢。無論是開發、測試、運維都應該儘快掌握docker,儘早享受其帶來的巨大便利;
容器化方式在很多場景下都有極大的優勢。無論是開發、測試、運維都應該儘快掌握docker,儘早享受其帶來的巨大便利。
概念
再來了解docker非常關鍵的概念,這樣才能理解docker容器整個生命週期。
概念-映象
映象(類)=檔案系統+資料,我常常用開發語言中的類比作映象,物件比作容器映象由多個層加上一些docker元資料組成,容器執行著由映象定義的系統。
概念-容器
容器(物件)=映象執行例項
容器是映象的執行例項,可以使用同一個映象執行多個例項。如圖所示,一個ubuntu docker映象產生了三個ubuntu容器,docker利用容器執行和隔離應用。
從讀寫角度來說,映象是隻讀的,容器是在映象上添加了一層可讀寫的檔案系統。
概念-層
層=檔案變更集合
像傳統虛機應用,每個應用都需要複製一份檔案副本,執行成百上千上磁碟空間會迅速耗光,而docker採用寫時複製來減少磁碟空間,當一個執行中的容器要寫入一個檔案時,它會把該檔案複製到新區域來記錄這次的修改,在執行docker提交時將這次修改記錄下併產生一個新的層。docker分層解決大規模使用容器時碰到的磁碟和效率問題。
概念-倉庫
docker借鑑了大量git優秀的經驗。docker倉庫分公有庫和私有庫,最大的公開倉庫是docker hub,國內也有很多倉庫源。
2、建立第一個docker應用透過建立一個docker應用來看看docker是怎麼方便使用的。
建立docker映象方式
建立docker有四種方式
但最常用的docker命令+手工提交和Dockerfile的方式
對於我們來說Dockerfile是最常用也是最有用的。
那建立一個docker應用只需要三步:編寫dockerfile、構建映象、執行容器
編寫dockerfile
那我們就開始用dockerfile來建立一個應用
Dockerfile是包含一系列命令的文字檔案,這個檔案包含6條命令
1、FROM是使用php官方映象,左邊是映象名字,右邊是標籤名字,標籤名字不寫預設是latest
2、宣告維護人員
3、RUN執行一條linux命令,我們把php程式碼重定向到/tmp/index.php
4、EXPOSE宣告要開放的埠
5、WORKDIR啟動容器後預設目錄
6、CMD容器啟動後,預設執行的命令,相當於應用的入口,用php自帶的webserver監聽8000
構建映象
使用docker build命令生成映象,—tag指定映象的名字,左邊是名字,右邊是標籤,最後有個.表示在當前目錄查詢Dockerfile。可以看到,每個命令都會有個輸入輸出,輸入是命令,輸出是給到層的id,所以,基本上每個命令都會產生一個層。最後提示映象構建成功,並打上映象標籤。
執行容器
第三,使用docker run命令執行映象,-p將容器的8000埠對映到本機8000埠,—name給容器起個名字。用curl對本機8000埠請求,伺服器返回當前時間,說明我們構建的容器執行成功了。
請求本地8000埠,伺服器返回當前時間
dockerfile常用命令
其實Dockerfile常用命令就5個:from、add、run、workdir、cmd
建立docker應用步驟
•編寫dockerfile
•構建映象
•執行容器
使用docker應用步驟
•拉取映象
•執行容器
dockerfile最佳實踐
•精簡映象用途
儘量讓每個映象的用途單一
•選擇合適基礎映象
選擇以alpine、busybox等基礎的映象
busybox:號稱作業系統裡的瑞士軍刀,只有……這麼大,但卻有一百多常用命令
如果你的目標是小而精,busybox是首選,因為它已經精簡到沒有bash,使用的是ash,一個相容posix的shell
Alpine:你的目標是小但是又有一些工具的話,可以選擇alpine,它是一個面向安全的輕量linux發行版,它關注安全、效能和資源效能,比busybox功能更完善,還提供apk查詢和安裝軟體包,大小隻有2-3兆。
很多官方的映象都有alpine的映象,像剛剛使用的php映象。
•提供維護者資訊
•正確使用版本
使用明確的版本號,而非依賴於預設的latest,避免環境不一致導致的問題
如安裝軟體後的安裝包,如上圖2、3步驟
•提高生成速度
如內容不變的指令儘量放在前面,這樣可以複用
•減少映象層數
多條命令寫在一起,使生成的映象層數少,如上圖2、3步驟
•恰當使用multi-stage
保證最終生成映象最小化
3、常用命令想使用一個映象,用這個命令就可以了,預設按評分排序。official如果是ok表示是官方鏡,Auto標示它是否用dickerfile進行自動化映象構建。
pull
一旦確定一個映象,透過對其名稱執行docker pull來下載。標籤預設是latest,嚴格來講,映象的倉庫名還應該新增倉庫地址的,預設是registry.hub.docker.com Docker images命令查詢下載的映象。
run
使用docker run執行一個容器,it表示用互動式方式執行,最後表示要執行的命令。
其實更常用的方式是以後臺方式來執行,這時用d引數在後臺執行,執行後用exec命令進去到容器。
tag
Docker tag給映象一個新tag名字。
Docker images檢視centos映象,把centos:latest打上centos:yeedomliu,這時再看會有3個centos,latest和yeedomliu的映象id是相同的。把centos:yeedomliu刪除,再檢視latest還會存在,最後用rmi命令刪除latest就會真正把latest映象刪除掉。如果相同映象存在多個標籤,只有最後一次的rmi命令會真正刪除映象。
ps
Ps可以檢視執行中的容器
rmi
rm
diff
容器啟動後文件變化情況
logs
檢視容器執行後的日誌
cp
我們想從容器裡面複製檔案到宿主機,或相反的過程就可以用到cp命令
container prune
隨著使用docker時間越長,停止狀態下的容器會越來越多,這些都會佔據磁碟空間
image prune
未被打標籤的映象可以用image prune命令清理
system prune/df
如果你覺得剛剛兩條命令執行起來麻煩,可以用docker system prune一條命令搞定
另外用system df檢視docker磁碟空間
實戰瞭解了docker基礎知識後,可進入相對實戰的環節
•本地開發
我們的專案使用了很多服務,如redis/mysql/mongodb等等,如果一個個執行起來,還加上配置,容易出手,也比較麻煩
kitematic:與使用命令列管理本地容器相比,你更想使用圖形工具對容器管理,官方推出的容器管理工具,透過它可以查詢映象、建立容器、配置、啟停容器等管理。
這是配置容器埠和宿主機埠,目錄,網路等對映介面
docker-compose
compose定位是“定義和執行多個docker容器的應用”,前身fig,目前仍然相容fig格式的模板檔案。
一條命令可以把一個複雜的應用啟動起來
日常工作中,經常碰到多個容器相互完成某項任務
docker-compose示例1
預設模板檔名叫docker-
compose.yml
,結構很簡單,每個頂級元素為服務名稱,次級資訊為配置資訊。這裡使用了redis/mongodb/mysql/nginx映象,分別給它們映射了本地目錄、埠、密碼等資訊,nginx映象需要使用redis/mysql等服務,用links命令連線進來。docker-compose示例2
如果在本地開發,每個專案都可以像之前說的那樣配置,這裡提供了另外一種做法。我把公共的資源在一開始就啟動,每個專案裡只啟動nginx映象並關聯其它的服務即可。
公共服務compose
專案compose
•常見問題
主程序:docker啟動第一個程序稱主程序,就是id為1的程序,這個程序退出就意味著容器退出,所以想要使docker作為服務使用,這個程序是不能退出的。expose命令是宣告暴露的埠,執行時用-P才會生效。一般ports命令是做真正的埠對映,比較常用。
•架構
安裝了docker的主機,一般在一個私有網路上
1、呼叫docker客戶端可以從守護程序獲取資訊或傳送指令
2、docker守護程序使用http協議接收來自docker客戶端的請求
3、私有docker註冊中心儲存docker映象
4、docker hub是由docker公司運營的最大的公共註冊中心
網際網路上也存在其他公共的註冊中心
呼叫 Docker客戶端可以從守護程序獲取資訊或給它傳送指令。守護程序是一個伺服器,它使用 HTTP協議接收來自客戶端的請求並返回響應。相應地,它會向其他服務發起請求來發送和接收映象,使用的同樣是 HTTP協議。該伺服器將接收來自命令列客戶端或被授權連線的任何人的請求。守護程序還負責在幕後處理使用者的映象和容器,而客戶端充當的是使用者與 REST風格 API之間的媒介。
理解這張圖的關鍵在於,當用戶在自己的機器上執行 Docker時,與其進行互動的可能是自己機器上的另一個程序,或者甚至是執行在內部網路或網際網路上的服務。
•最佳化
使用小映象:一般來說,使用小的映象都相對比較優秀,如官方的映象基本上都有基於alpine的映象
命令寫一行:多個命令儘量寫在一起有助於減少層數,也會減少映象的大小
指令碼安裝:使用指令碼進行初始化時,可以有效減少dockerfile的命令,同時帶來另外的問題,可讀性不好並且構建映象時快取不了
扁平化映象:構建映象過程中,可能會涉及到一些敏感資訊,或者用了上面的辦法映象依然很大,可以試試這個辦法
docker export 容器名或容器id | docker import - 映象標籤
multi-stage:從docker 17.05版本開始,docker支援multi-stage(多階段構建),特別適合編譯型語言,如我在一個映象下編譯,在另外一個很小的系統執行,如下圖,go專案在golang環境下編譯,在alpine環境下執行。