DevOps利器之Docker入門篇

簡介

What?

Docker是基於Go語言實現的開源容器項目,誕生於2013年年初,由dotCloud公司發起,此公司後更名爲Docker Inc.Docker項目已加入Linux基金會,並遵循Apache2.0協議,代碼託管在Github:Docker源碼地址nginx

各大操做系統現都支持Docker,而且最新的Linux發行版RedHat、CentOS、Ubuntu中均已默認帶有Docker軟件包.git

Docker的構想是要實現「Build,Ship and Run Any App, Anywhere」,即經過對應用的封 裝( Packaging)、分發( Distribution)、部署( Deployment)、運行( Runtime)生命週期進行管 理,達到應用組件級別的「 一次封裝 ,處處運行」 。 這裏的應用組件, 既能夠 是一個 Web 應 用、一個編譯環境,也能夠是一套數據庫平臺服務,甚至是一個操做系統或集羣。github

基於 Linux 平 臺上的多項開源技術, Docker 提供了高效、敏捷和輕量級的容器方案,並 支持部署到本地環境和多種主流雲平臺 。 能夠說 , Docker首次爲應用 的開發 、運行和部署提 供了「一站式」的實用解決方案。web

早期Docker代碼實現是基於LXC(Linux Containers,即Linux容器),自0.9版本開始,Docker開發了libcontainer項目做爲更普遍的容器驅動實現.docker

簡單地講,讀者能夠將 Docker 容器理解爲一種輕量級的沙盒( sandbox)。 每一個容器內 運行着一個應用,不一樣的容器相互隔離,容器之間也能夠經過網絡互相通訊。 容器的建立和 中止十分快速,幾乎跟建立和終止原生應用 -致;另外,容器自身對系統資源的額外需求也十分有限,遠遠低於傳統虛擬機 。 不少時候,甚至直接把容器看成應用自己也沒有任何 問題。shell

Why?

  • 新型的建立分佈式應用程序的方式,快速分發和部署
  • 經過容器來打包應用、解藕應用和運行平臺
  • 更快速的交付和部署,啓動快速,啓動和中止能夠在妙計實現,節約開發、測試、部署的大量時間
  • 更高效的資源利用,一臺主機上能夠運行上千個Docker容器,運行Docker不須要額外的虛擬化管理程序(virtual machine manager,以及Hypervisor)的支持,Docker是內核級的虛擬化,能夠實現更高級的性能
  • 更輕鬆的遷移和擴展,Docker容器幾乎能夠在任意的平臺上運行,包括物理機、虛
    擬機、公有云、私有云 、 我的電腦 、 服務器等
  • 更簡單的更新管理,使用Dockerfile,只須要小小的配置修改就能夠實現之前繁瑣的更新,提升工做效率,並標準 化流程
  • Docker經過相似 Git設計理念的操做來方便用戶獲取、分發和更新應用鏡像,存儲復 用,增量更新
  • Docker與傳統虛擬機的比較以下圖

Docker與傳統虛擬機

How?

Docker 運行基本命令和模式:
Docker 運行基本命令和模式數據庫

Docker Engine:
Docker Engineubuntu

Docker architecture:
Docker architecture瀏覽器

Docker與虛擬化

虛擬化 (virtualization)技術是一個通用的概念,在不一樣領域有不一樣的理解。 在計算領 域,通常指的是計算虛擬化 (computingvirtualization),或一般說的服務器虛擬化。 維基百科 上的定義以下:安全

「在計 算機技 術中,虛擬化 是 一種資 源管理技術,是將 計 算機 的各類實 體資 源,如服務器 、 網絡、 內存及存儲等,予以抽 象、轉換後呈現出來,打破實體 結 構間的不可切割的障礙,使用戶能夠用比本來的紐態更好的方式來應用這些資源 。」

可見,虛擬化的核心是對資源的抽象,目標每每是爲了在同一個主機上同時運行多個系
統或應用,從而提升系統資源的利用率,而且帶來下降成本、方便管理和容錯容災等好處 。

Docker 和常見的虛擬機方式的不一樣之處:
DevOps利器之Docker入門篇

安裝

用戶能夠訪問 Docker 官網的 Get Docker Docker 官網頁面,查看獲取 Docker 的方式,以及 Docker 支持的平臺類型目前 Docker 支持 Docker 引 擎、 Docker Hub、 Docker Cloud 等多種服務 。

  • Docker 引擎:包括支持在桌面系統或雲平臺安裝 Docker,以及爲企業提供簡單安全
    彈性的容器集羣編排和管理;
  • DockerHub:官方提供的雲託管服務,能夠提供公有或私有的鏡像倉庫;
  • DockerCloud :官方提供的容器雲服務,能夠完成容器的部署與管理,能夠完整地支
    持容器化項目,還有CI、 CD功能。

Linux安裝

$sudo apt-get update
$sudo apt-get install docker-ce docker-ce-cli containerd.io

Mac安裝

$brew cask install docker

或者:

手動下載安裝 :Docker Mac傳送門

運行:

安裝完成後啓動Docker服務,而後嘗試運行以下命名:

$docker run -d -p 80:80 --name webserver_test nginx

# 而後在瀏覽器訪問:http://127.0.0.1 看看效果,一個nginx服務器已經搭建完成了,是否是很香

Docker有三大核心概念:

  • 鏡像 (Image)
  • 容器( Container)
  • 倉庫( Repository)

鏡像 (Image)

鏡像是Docker三大核心概念中最重要的,是建立 Docker容器的基礎。本質上是一個文件,經過版本管理和增量的文件系統, Docker 提供了一套十分簡單的機制來建立和更新現有的鏡像,用戶甚至能夠從網上下載一個已經作好的應用鏡像,並直接使用.

Docker 運行容器前須要本地存在對應的鏡像, 若是鏡像不存在, Docker 會嘗試先從默 認鏡像倉庫下載(默認使用 Docker Hub 公共註冊服務器中的倉庫), 用戶也能夠經過配置, 使用自定義的鏡像倉庫。

獲取鏡像

$docker pull NAME [:TAG] 
$docker pull ubuntu:18.04
命令至關於
docker pull registry.hub.docker.com/ubuntu:18.04
若是從非官方的倉庫下載,則須要在倉庫名稱前指定完整的倉庫地址

NAME:鏡像倉庫名稱
TAG:鏡像標籤,若是不指定默認爲latest,即會下載倉庫中最新版本的鏡像

注意:
通常來講,鏡像的latest 標籤意味着該鏡像的內容會跟蹤最新版本的變動而變化,內容是不穩定的。所以,從穩定性上考慮,不要在生產環境中忽略鏡像的標籤信息或使 用默認的latest 標記的鏡像。

查看鏡像信息

  1. 查看本地主機上的鏡像列表:
$docker images
或者
$docker image ls

# 參數
> --digests=true|false: 列出鏡像的數字摘要值,默認爲否;
> -f, --filter=[] : 過濾列出的鏡像, 如dangling=true 只顯示沒有被使用的
鏡像;也可指定帶有特定標註的鏡像等;
> --format="TEMPLATE" : 控制輸出格式,如: .ID表明ID信息,.Repository
表明倉庫信息等;
> -q, --quiet=true|false: 僅輸出ID信息, 默認爲否

更多子命令選項還能夠經過man docker-images來查看

顯示如圖:

DevOps利器之Docker入門篇

  • REPOSITORY:來自於哪一個倉庫
  • TAG: 鏡像的標籤信息
  • IMAGE ID:鏡像的ID,這裏一樣的ID能夠是不一樣TAG,完整的ID是由64個十六進制字符,這裏默認展現前12位
  • CREATED: 鏡像的建立時間
  • SIZE: 鏡像大小,優秀的鏡像每每都比較小,鏡像大小信息只是表示了該鏡像的邏輯體積大小, 實際上因爲相同的鏡像層本地只會存儲一份, 物理上佔用的存儲空間會小於各鏡像邏輯體積之和
  1. 添加鏡像標籤

爲了方便在後續工做中使用特定鏡像,還可使用docker tag命令來爲本地鏡像任 意添加新的標籤。 例如,添加一個新的myubuntu: latest鏡像標籤:

$docker tag ubuntu:latest myubuntu:latest
  1. 查看鏡像詳細信息

使用 docker inspect 命令能夠獲取該鏡像的詳細信息,包括製做者、適應架構、各層的數字摘要等:

$docker inspect ubuntu:18.04

# 上面代碼返回的是一個JSON格式的消息,若是咱們只要其中一項內容時,可使用 -f 來指定,例如,獲取鏡像的ContainerConfig:

$docker inspect -f {{".ContainerConfig"}} ubuntu:18.04
  1. 使用history命令查看鏡像歷史
    既然鏡像文件由多個層組成,那麼怎麼知道各個層的內容具體是什麼呢?這時候可使用 history子命令,該命令將列出各層的建立信息。

DevOps利器之Docker入門篇

搜索鏡像

$ docker search nginx

參數:
-f, --filter filter: 過濾輸出內容
--format string: 格式化輸出內容
--limit int: 顯示個數,默認25
--no-trunc: 不截斷輸出結果

$ docker search --filter=is-official=true nginx

刪除和清理鏡像

使用 docker rmidocker image rm 命令能夠刪除鏡像, 命令格式爲 docker<br/>rmi IMAGE [IMAGE ... ], 其中 IMAGE 能夠爲標籤或 ID。

$docker rmi myubuntu:latest

參數:
-f, -force: 強制刪除鏡像, 即便有容器依賴它;
-no-prune: 不要清理未帶標籤的父鏡像。

注意:
當同 一 個鏡像擁有多個標籤的時候,docker rmi 命令只是刪除了該鏡像多個標籤中的指定 標籤而巳, 並不影響鏡像文件

# 刪除全部鏡像
$docker rmi $(docker ps -a)  # 慎用啊!!!!

使用Docker一段時間後, 系統中可能會遺留一些臨時的鏡像文件, 以及一些沒有被使 用的鏡像, 能夠經過docker image prune命令來進行清理。

建立鏡像

建立鏡像的方法主要有三種:

  • 基於已有鏡像的容器建立
  • 基千本地模板導入
  • 基於Dockerfile建立(比較經常使用)
利用Dockerfile建立鏡像

Dockerfile是一個文本格式的配置文件,用戶可使用Dockerfile來快速建立自定義的鏡像。由一行行命令語句組成,而且支持以#開頭的註釋行。通常而言,Dockerfile主體內容分爲四部分:

  • 基礎鏡像信息
  • 維護者信息
  • 鏡像操做指令
  • 容器啓動時執行指令

未完待續......

相關文章
相關標籤/搜索