Docker 入門基礎
Docker是一個能把開發的應用程式自動部署到容器的開源引擎。Docker是新的容器化技術,輕巧,易移植[Build Once, Configure Once And Run Anywhere]。Docker引擎的基礎是Linux容器[LXC]技術,我們可以簡單的將Docker容器理解為一種沙盒,每個容器內執行一個應用,不同容器相互隔離,容器間可以建立通訊機制。
Docker具有速度快、隔離框架優雅、物美價廉、CPU/記憶體消耗低、快速開關機、跨雲端計算基礎架構等特性,所以Docker具有以下幾方面優勢:
>> 縮短開發週期,實現快速的交付和部署
>> 高效的資源利用
>> 輕鬆的遷移和擴充套件
>> 簡單的更新管理
直觀引數對比傳統的虛擬機器,如下圖
Docker有三個元件和三個基本元素
三個元件分別是:
Docker Client是使用者介面,它支援使用者與Docker Daemon之間的通訊
Docker Daemon運行於主機上,處理服務請求。
Docker Index是中央registry[倉庫] Hub,支援擁有共有與私有訪問許可權的Docker容器映象的備份
三要素分別是:
Docker Containers負責應用程式的執行,包括作業系統、使用者新增的檔案以及元資料。
Docker Images是一個只讀模板,用來執行Docker容器
DockerFile是檔案指令集,用來說明如何自動建立Docker映象
Docker是一個C/S架構的程式。Docker客戶端只需向Docker伺服器或者守護執行緒發出請求。伺服器或守護程序將完成所有工作並返回結果。Docker提供了一個命令列工具以及一整套RESTful API。你可以在同一臺宿主機上執行Docker守護程序和客戶端,也可以用本地的Docker客戶端連線遠端Docker守護程序
Docker 映象是一個構建容器的只讀模板,它包含了容器啟動所需的所有資訊,包括執行程式和配置資料。Docker映象是由檔案系統疊加而成的。自低而上分別是:引導檔案系統[bootfs] -> root檔案系統[rootfs] -> 只讀檔案系統-> 讀寫檔案系統
root檔案系統+只讀檔案系統被稱為映象,映象是可以疊放的,最下層的稱為基礎映象[base image]、下面層的為父映象,當docker容器啟動時。docker會載入最頂層的讀寫檔案系統,我們程式就是在讀寫層中執行的
Docker 容器類似於一個輕量級的沙盒,Docker利用容器來執行和隔離應用[容器間是執行緒隔離的]。容器是映象建立的應用執行例項,容器中可以執行一個或多個程序。Docker容器可以將其啟動、開始、停止、刪除,而這些容器都是相互隔離、互不可見的。
Docker 倉庫是Docker映象檔案存放的場所。Docker倉庫分為共有和私有兩種。Docker倉庫和註冊伺服器[registry]的區別,如下圖:
Docker API 在Docker生態系統中一共有三種API[RESTful風格]
>> RegistryAPI 提供了與來儲存Docker映象的DockerRegistry整合功能
>> DockerHub API 提供了與Docker Hub整合的功能
>> DockerRemote API 提供與Docker守護程序進行整合的功能
Docker 安裝:
Docker 常用命令:
#####################################################################
Docker info -->檢視docker系統資訊
#####################################################################
Docker version--> 檢視docker版本號
#####################################################################
Docker images <引數> <倉庫>-->本地系統中有哪些映象
引數:
-a 列出本地所有的映象含中間映像層
--digests 顯示映象的摘要資訊
-f 顯示滿足條件的映象
例如:
顯示倉庫是nginx的映象:
#####################################################################
Docker rmi <引數> <映象>--> 刪除某個映象
引數:
-f 強制刪除
#####################################################################
Docker build <引數> <容器> -->利用DockerFile建立映象
引數:
-t 給映象新增一個標籤[tag]
-q 安裝模式,直接輸出結果
#####################################################################
Docker history <映象> --> 檢視docker 映象的歷史版本[或者說建立過程]
例如:
#####################################################################
Docker save -o<儲存檔名> <映象>--> 把映象儲存到打包文件中
引數:
-o = output 儲存的檔名
例如:
#####################################################################
Docker load [-i 檔案]|[< 檔案] --> 從打包檔案或者STDIN載入一個映象
例如:
#####################################################################
Docker import <容器> --> 匯入檔案並建立映象
#####################################################################
Docker pull <映象> --> 從遠端拉取一個映象
#####################################################################
Docker push <映象> --> 將映象推送到DockerRepository[映象倉庫],需要註冊賬戶才能上傳自制映象
#####################################################################
Docker search <引數> <映象> -->在Docker Registry中查詢映象
引數:
-s 列出收藏次數不小於指定次數的映象
#####################################################################
Docker login <引數> <倉庫>--> 登陸到一個Docker映象倉庫[預設Docker Hub]
引數:
-u 使用者名稱
-p 密碼
#####################################################################
Docker logout 登出Docker映象
#####################################################################
Docker commit <引數> <容器> -->提交一個新映象
引數:
-a = --author
-c = --change
-m 提交的資訊
-p 暫停容器在提交的時候
#####################################################################
Docker cp 宿主機目錄 容器目錄 --> 用於容器和宿主機之間的資料拷貝
例如:
#####################################################################
Docker diff <容器> --> 檢查容器裡檔案結構的更改
#####################################################################
Docker ps <引數> --> 列出所有的容器
-a:列出所有的正在執行和停止的容器
-n:後面跟顯示行數
-q:只輸出容器ID
例如:
docker ps -n 10 列出前十個容器
#####################################################################
Docker inspect<引數> <容器>--> 檢視容器資訊
#####################################################################
Docker top <容器> --> 檢視容器中執行的程序資訊
#####################################################################
Docker attach <容器> --> 進入某個容器[Ctrl+ D 退出容器]
#####################################################################
Docker events <引數> --> 從伺服器獲取實時事件
引數:
-f 根據條件過濾事件
--since 指定時間戳後的所有事件
--until 顯示到指定時間為止
#####################################################################
Docker logs <引數> <container name|container ID> --> 檢視容器日誌
引數:
-f 動態監控Docker日誌
-tail 列出最新N條容器日誌
#####################################################################
Docker export <引數> <容器>--> 匯出容器到STDOUT
引數:
-o 將輸入內容寫到檔案中
#####################################################################
Docker port <映象> <埠號>--> 檢視埠對映情況
#####################################################################
Docker run <引數> <映象> <初始命令> --> 基於映象建立啟動一個容器
TIPS:
Docker create 也可以建立一個映象,但是建立的容器是出於停止狀態,也就是說docker create + docker start = docker run
引數:
-i:以互動模式執行容器
-t:容器啟動後會進入其命令列[分配一個偽終端],Ctrl + d 退出容器
-v:需要將本地哪個目錄掛載到容器中 | -v <宿主機目錄>:<容器目錄>
比如docker.cn/docker/centos:centos7
-p:埠對映
-P:對外公開dockerfile中EXPOSE指定的埠
-d:以後臺方式執行容器[會建立一個守護執行緒]
-e:傳遞一個環境變數
--name 設定容器的名稱
--restart 設定容器重啟的標誌[有always、on-failure等]
例如:
-p 2222:3333 指定docker虛擬機器的2222埠,對映為container的3333 埠,要訪問就需要xxx.xxx.xxx.xxxx:3333
映象ID:可以用[倉庫名:標籤名]的形式代替
初始命令:一般進入命令列互動用 /bin/bash[bash shell 一般預設的linux預設的shell] shell是殼的意思,表明這個是作業系統和人的互動平臺,windows的桌面也是一個shell
例如:
#####################################################################
Docker start <容器> --> 啟動某個容器
Docker restart 的不同之處在與它會停止正在執行的某個容器並啟動它
#####################################################################
Docker stop <容器> --> 停止某容器
它會首先向容器傳送 SIGTREM 訊號,等待一段時間後再發送SIGKILL 訊號終止容器
Docker kill 是強制關閉容器沒有Docker stop那麼優雅
#####################################################################
Docker exec <引數> <容器> <命令> --> 在容器中執行命令
docker exec 的功能比docker attach強大很多,進入容器同時可以動態的加入新的命令執行
引數:
-d 分離模式:在後臺執行
-i 即使沒有附加也保持STDIN開啟
-t 分配一個偽終端
比如:
#####################################################################
Docker rm <引數> <映象> -->刪除某個容器
引數:
-f 強力刪除正在執行的容器
-l 移除容器間的連結
-v 移除與容器關聯的空間
#####################################################################
Docker port <容器> --> 檢視docker容器的埠對映
#####################################################################
Docker pause <容器> --> 暫停容器中所有程序
Docker unpause<容器> --> 恢復容器中所有程序
#####################################################################
Docker help -->檢視所有的docker命令
#####################################################################
Docker-machine sshdefault[虛擬機器名字] --> 進入toolbox中執行的虛擬機器[僅限於Windows中]
Dockfile 是由一行行命令語句組成,並且支援#開頭的註釋行。Dockerfile分為以下四分部:
四部分 |
指令 |
基礎映象資訊 |
FROM |
維護者資訊 |
MAINTAINER |
映象操作指令 |
RUN、COPY、ADD、EXPOSE等 |
容器啟動時執行命令 |
CMD、ENTRYPOINT |
FROM <imagename> --> 告訴Docker我們的映象是基於哪一個映象
MAINTAINER<author name> --> 設定映象的作者
RUN <commad>--> 在指定映象裡執行命令,預設的是使用 /bin/sh -c來執行[也可以使用exec格式的RUN指令]
ADD <原始檔> <目標路徑>--> 複製檔案 還有自動解壓歸檔檔案的功能
CMD --> 在容器執行時提供一些命令及引數[可被DockerRun覆蓋]
ENTRYPOINT --> 在容器執行時提供一些命令及引數[不可被DockerRun覆蓋]
EXPOSE --> 指定容器在執行時監聽的埠
WORKDIR --> 指定RUN、CMD、ENTRYPOINT命令的工作目錄
ENV <key><value> --> 設定環境變數[鍵值對]
USER --> 設定容器執行時的UID
VOLUME --> 用於讓你的容器訪問宿主主機上的目錄
ONBUILD --> 為映象新增觸發器觸發器會在build過程中插入新的指令
TIPS
>> 刪除所有Docker ID和Tag為none的映象
docker images | grep none | awk ‘{print $3}’| xargs docker rmi ==> 可以引申到刪除沒用或者停止的Docker Container
>> Dockerfile中WORKDIR與RUN cd的區別
WORKDIR是切換當前的工作目錄,所以對後面的語句也生效。RUN cd只是對當前這條語句生效,但是工作目錄還是沒有變[預設的工作目錄是根目錄/]
>> docker hub與docker registry的工作區別
docker hub: 複製儲存集中的資訊訪問:使用者賬戶、映象的校驗碼、共有和私有映象倉庫的區別等。docker hub有以下幾個元件:Web UI、Meta-data元資料儲存、訪問認證、token管理
參考資料:
《第一本Docker書》
《Docker技術入門與實戰》
DockerOne翻譯的Docker入門教程
runoob.com的Docker菜鳥教程