相關資源網站:
● docker官網:http://www.docker.com
● Docker Hub倉庫官網: https://hub.docker.com/
注意,如果只是想看Docker的安裝,可以直接往下拉跳轉到Docker架構與安裝章節下的Docker具體安裝步驟,一步步帶你安裝自己的Docker;
Docker簡介概述
Docker對我來說是一種全新技術,既然是全新的技術那么我就不禁要問了,Docker它到底是什么東西?它是基于什么場景下出現的,解決了什么問題呢?
Docker技術入門理解
首先什么是Docker?
Docker 是使用 Google 公司推出的 Go 語言 進行開發實現,基于 Linux 內核的 cgroup,namespace,以及 AUFS 類的 Union FS 等技術,對進程進行封裝隔離,屬于操作系統層面的虛擬化技術。由于隔離的進程獨立于宿主和其它的隔離的進程,因此也稱其為容器。最初實現是基于 LXC,從 0.7 版本以后開始去除 LXC,轉而使用自行開發的 libcontainer,從 1.11 開始,則進一步演進為使用 runC 和 containerd。Docker 在容器的基礎上,進行了進一步的封裝,從文件系統、網絡互聯到進程隔離等等,極大的簡化了容器的創建和維護,使得 Docker 虛擬技術比虛擬機技術更為輕便、快捷。
以上是我在網上搜刮出來的定義,很生硬,但可以簡單地將Docker理解為一種類似于Linux虛擬機的虛擬化技術;
那么為什么會出現Docker這種虛擬化技術呢?它解決了什么問題?
我們來看一下下面這個場景:
假如說在你入職一個公司后,在公司參與開發了公司的一個項目,你使用的電腦中具有特定配置的開發環境,也就是說跟公司的其他開發人員的環境配置各有不同;你正在開發的應用肯定是依賴于你當前的環境配置以及某些配置文件,除此之外,公司也有一套標準化的測試和生產環境、以及自身的配置和一系列的支持文件的;你是不是遇到過自己在本地跑項目的時候是沒有問題的,一推到線上或者代碼給到運維跑的時候就出現了奇奇怪怪的Bug各種令人頭疼;
這個時候一番扯皮推卸責任的免不了的;那么問題來了,你要如何確保你開發的應用能夠在這些環境中運行和通過質量檢測?并且在部署過程中不出現令人頭疼的版本、配置問題,也無需重新編寫代碼和進行故障修復呢?
這就是Docker所解決的問題,它對此給出了一個標準化的解決方案,即系統平滑移植,容器虛擬化技術。
在沒有Docker之前,開發人員將系統源代碼提交給運維之后,運維就需要拿著這份源代碼進行項目部署,但是在進行部署的時候就有可能會遇到一些問題,比如說環境不一致的問題,就像上面說的,開發環境跟運維環境不一致,這就需要運維人員根據開發人員給的版本清單,一步一步的進行手動安裝環境,異常麻煩;而且更致命的是,若果開發的項目是分布式集群項目,每個集群中的每臺機器都要安裝一下環境,要是此時有任何一臺機器在安裝過程中出現了差錯,都有可能導致項目部署失敗;
還有就是若果說開發的系統需要進行機器擴容,增加某個集群的機器,這對運維來說也是一個難題;
上面一系列下來可以看出,環境的配置過程相當麻煩,換一臺機器,就要重來一次,費力費時;而引入了Docker之后,假如說現在項目在開發環境下是完全百分百可以運行的,不管是源碼、配置、環境、版本等都沒有問題,這個時候Docker就可以將這一整套東西打包成一個鏡像文件,你可以將這個鏡像文件發送到任何平臺環境,運行這個鏡像文件時會開啟一個容器,不管你是在什么環境下運行都與你在開發時的環境一模一樣,相當于在開發環境中運行這個項目,達到應用平臺無縫銜接;
為什么要選擇Docker呢?用虛擬機技術不是也能達到類似效果嗎?
首先Docker 容器的本質可以理解為通過容器虛擬技術,利用宿主機的硬件資源來虛擬出的一臺主機,就像虛擬機一樣,可以將應用及其運行環境部署在這臺虛擬出的“主機”(容器)上運行。但容器與傳統的虛擬機技術(VMware、VirtualBox等運行的虛擬機技術)又有著本質的不同。
傳統的虛擬機技術
傳統的虛擬技術是在物理機的操作系統之上安裝一個虛擬機管理程序,例如 VMware、 VirtualBox 等,在虛擬機管理程序的管理下,使用者可以在同一個物理服務器上創建多個虛擬機,每個虛擬機需要安裝自己獨立的操作系統,而應用就是安裝在虛擬機的操作系統之上的程序,應用程序通過調用各種命令或庫函數來使用其需要的各種系統資源。
在這種情況下對于完全相同的兩個應用,若它們需要運行在兩個虛擬機中,就需要兩套完全相同的虛擬機操作系統與 bins/libs,如上圖左側所示,存在大量的資源占用冗余,形成資源浪費。
Docker容器虛擬化技術
因為Docker 容器運行在 Docker 引擎之上,是在宿主機服務器的操作系統層面實現的虛擬化,可以直接復用本地物理主機的操作系統;所有 Docker 容器都共享同一個 Docker 引擎,所以不需要像傳統虛擬機一樣需要另外的虛擬硬件及虛擬操作系統, 而是共享的宿主機的硬件與操作系統,但它們的運行環境又是相互隔離、互不干擾的。并且所有 Docker 容器對于系統硬件資源的使用都是由 Docker 引擎統一進行管理,所以對系統資源的占用很少,其僅包含 運行時必須的一些資源,利用率很高。無論是應用執行速度、內存損耗或者文件存儲速度, 都要比傳統虛擬機技術更高效。
小結Docker解決的問題
1、 提供統一的運行環境
在生產環境中,很多時候的開發、測試及上線環境都是不一樣的,從而導致項目(war 或 jar)在不同階段出現很多其它階段所不存在的奇怪的問題。 Docker 容器除了可以提供相同的應用外,還提供了該應用的統一運行環境,確保在任 何宿主機 HOST 上都可以跑出相同的結果。即 Docker = jar/war + 環境。
2、 便捷的應用遷移
由于 Docker 確保了統一的運行環境,使得應用的遷移更加便捷。無論是物理機、虛擬 機、公有云、私有云,Docker 鏡像的運行結果都是相同的。用戶可以很方便地將一個平臺 上運行的應用,遷移到另一個平臺上,而無需擔心運行環境的變化導致應用無法正常運行。
3、 超快的啟動時間
傳統的虛擬機技術啟動應用一般需要數分鐘:首先需要啟動虛擬機,然后再加載虛擬機 操作系統,最后還需要再手工啟動應用。而 Docker 容器應用,由于直接運行于宿主機系統 中,無需啟動操作系統,因此可以做到秒級、甚至毫秒級的啟動。
4、 更輕松的維護和擴展
Docker 公司及各個開源項目團隊一起維護了一大批高質量的官方鏡像,既可以直接在 生產環境使用,又可以作為基礎進一步定制,大大的降低了應用服務的鏡像制作成本。
Docker 使用的分層存儲以及鏡像的技術,使得應用重復部分的復用更為容易,也使得應 用的維護更新更加簡單,基于基礎鏡像進一步擴展鏡像也變得非常簡單。
Docker架構與安裝
閱讀docker官方的Guides文檔可以發現,Docker系統整體上主要包含客戶端Client、宿主機DOCKER_HOST(服務端)和倉庫Register三大部分。我們日常使用各種 docker 命令,其實就是在使用Client 客戶端工具 給 Docker 引擎(服務端守護進程Docker daemon) 提交請求進行交互,如下圖所示。
1、Client 客戶端
Docker 是一個客戶端-服務器(C/S)架構程序。Docker 客戶端只需要向 Docker 服務器或者守護進程發出請求,服務器或者守護進程將完成所有工作并返回結果。
Client 能夠幫助我們使用命令行與 Docker 服務端進行交互,包括本地服務端和遠程服務端:
通過-H參數可以指定客戶端連接的服務端:docker -H host
2、Registry 倉庫
鏡像構建完成后,可以很容易的在當前宿主機上運行,但是,如果需要在其它服務器上使用這個鏡像,我們就需要一個集中的存儲、分發鏡像的服務,Docker Registry 就是這樣的服務。
Docker 用 Registry 來保存用戶構建的鏡像。Registry 分為公共和私有兩種。一個 Docker Registry 中可以包含多個 倉庫(Repository);每個倉庫可以包含多個 標簽(Tag);每個標簽對應一個鏡像。Docker 公司運營公共的 Registry 叫做 Docker Hub。用戶可以在 Docker Hub 注冊賬號,分享并保存自己的鏡像。
3、Docker 引擎(服務器端)
服務端會啟動一個守護進程 Docker Daemon ,通過 socket 或者 RESTful API 監聽來自客戶端的請求,并且處理這些請求,實現對鏡像和容器的操作。 守護進程可以 管理 Docker 對象(例如鏡像、容器、網絡和卷);還可以與其他守護進程通信以管理 Docker 服 務。
Docker的安裝介紹
Docker 可以安裝在 Windows、Linux、Mac 等系統中,我們經常說的安裝Docker其實主要就是安裝Docker引擎,只是為了簡單直接說安裝Docker而已;在安裝 Docker 之前需要先了解 Docker 官方對其版本的分類。Docker 的版本分為大版本 與小版本。
Docker 從大版本來說,分為三類:Moby、社區版 Docker-CE(Community Edition)和企業版 Docker-EE(Enterprise Edition)。
從 v1.13.1 之后,Docker 的發布計劃發生了變更,每個大版本下都出現了兩個小版 本 Edge 月版與 Stable 季版。不過,現在的官網中一般只能看到 Stable 版本。
由于生產環境下,服務器使用 Linux 的居多,所以下面就以 Docker 在 CentOS7 中的安裝為例來學習 Docker 的安裝;
注意,雖然Docker可以安裝在 Windows、Linux、Mac 等系統中,但Docker并非是一個通用的容器工具,它需要依賴于已存在并運行的 Linux內核環境。Docker的實質上是在已經運行的Linux下制造了一個隔離的文件環境,因此它執行的效率幾乎等同于所部署的Linux主機。因此,Docker必須部署在Linux內核的系統上,如果其他系統想部署Docker就必須安裝一個虛擬Linux環境;
即在Windows上部署Docker的方法都是先安裝一個虛擬機,并在安裝Linux系統的的虛擬機中運行Docker。注意,目前,CentOS 僅發行版本中的內核支持 Docker。Docker 運行在CentOS 7 (64-bit)上,要求系統為64位、Linux系統內核版本為 3.8以上,這里選用Centos7.x 。
官網 https://docs.docker.com/engine/install/centos/中可以看到具體安裝方式與安裝步驟。
Docker的具體安裝步驟
前面啰嗦了一大堆,現在開始正式安裝Docker,這里我們選擇安裝的是19.03.14版本,當然你不指定版本就是最新版本;
1、首先第一步配置yum工具,
● sudo yum install -y yum-utils
2、卸載系統之前的 docker
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
3、安裝 Docker 運行所需的依賴軟件包
● sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4、配置docker的yum源為阿里云倉庫,告訴Linux從阿里云的鏡像地址獲取 Docker 相關軟件包和更新;
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5、選擇安裝docker的版本
● 默認安裝最新版:# sudo yum install -y docker-ce docker-ce-cli containerd.io
● 安裝19.03.14版本:sudo yum install -y docker-ce-19.03.14 docker-ce-cli-19.03.14 containerd.io-1.4.6
6、docker安裝好之后,需要給docker配置一下加速鏡像源,默認的鏡像源是Docker官網的,下載鏡像的時候可能速度不是很快,這個鏡像地址可以到自己的阿里云中獲取,當然也可以隨便找一個別人的:
控制臺—>鏡像容器服務---->鏡像中心:鏡像加速服務下獲取
注意,這里額外添加了docker的生產環境核心配置cgroup
# 創建一個docker的配置文件
sudo mkdir -p /etc/docker
# 添加阿里云的加速鏡像源,即registry-mirrors后面的地址
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOF
# 重啟
sudo systemctl daemon-reload
sudo systemctl restart docker#啟動 docker & 設置 docker 開機自啟
sudo systemctl enable docker
到這里Docker就安裝完成了,可以輸入docker -v 驗證一下;