1. 程式人生 > >Docker 入門基礎

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菜鳥教程