一、Docker入門系列--Docker 簡介
一、Docker簡介
一、Docker入門系列--Docker 簡介
二、Docker入門系列--Docker安裝
三、Docker入門系列--Docker常用命令
四、Docker入門系列--Docker映象
五、Docker入門系列--Docker容器資料卷
六、Docker入門系列--DockerFlie解析
七、Docker入門系列--使用DockerFlie自定義Tomcat映象
八、Docker入門系列--Docker常用安裝
九、Docker入門系列--本地映象釋出到阿里雲
十、Docker入門系列--Docker-Compose簡介和安裝
十一、Docker入門系列--Docker-Compose模板命令
十二、Docker入門系列--Docker-Compose常用命令
十三、Docker入門系列--Portainer視覺化Docker
十四、Docker入門系列--Docker搭建部署SpringCloud微服務專案Demo
1.1 是什麼
1.1.1 為什麼會有docker的出現
一款產品從開發到上線,從作業系統,到執行環境,再到應用配置。作為開發+運維之間的協作我們需要關心很多東西,這也是很多網際網路公司都不得不面對的問題,特別是各種版本的迭代之後,不同版本環境的相容,對運維人員都是考驗
Docker之所以發展如此迅速,也是因為它對此給出了一個標準化的解決方案。
環境配置如此麻煩,換一臺機器,就要重來一次,費力費時。很多人想到,能不能從根本上解決問題,軟體可以帶環境安裝?也就是說,安裝的時候,把原始環境一模一樣地複製過來。開發人員利用 Docker 可以消除協作編碼時"在我的機器上可正常工作"的問題。
之前在伺服器配置一個應用的執行環境,要安裝各種軟體,Java/Tomcat/MySQL/JDBC驅動包等。安裝和配置這些東西有多麻煩就不說了,它還不能跨平臺。假如我們是在 Windows 上安裝的這些環境,到了 Linux 又得重新裝。況且就算不跨作業系統,換另一臺同樣作業系統的伺服器,要移植應用也是非常麻煩的。
傳統上認為,軟體編碼開發/測試結束後,所產出的成果即是程式或是能夠編譯執行的二進位制位元組碼等(java為例)。而為了讓這些程式可以順利執行,開發團隊也得準備完整的部署檔案,讓維運團隊得以部署應用程式,開發需要清楚的告訴運維部署團隊,用的全部配置檔案+所有軟體環境。不過,即便如此,仍然常常發生部署失敗的狀況。Docker映象的設計,使得Docker得以打破過去「程式即應用」的觀念。透過映象(images)將作業系統核心除外,運作應用程式所需要的系統環境,由下而上打包,達到應用程式跨平臺間的無縫接軌運作。
1.1.2 docker理念
Docker是基於Go語言實現的雲開源專案。
Docker的主要目標是"Build,Ship and Run Any App,Anywhere",也就是通過對應用元件的封裝、分發、部署、執行等生命週期的管理,使使用者的APP(可以是一個WEB應用或資料庫應用等等)及其執行環境能夠做到"一次封裝,到處執行"。
Linux 容器技術的出現就解決了這樣一個問題,而 Docker 就是在它的基礎上發展過來的。將應用執行在 Docker 容器上面,而 Docker 容器在任何作業系統上都是一致的,這就實現了跨平臺、跨伺服器。只需要一次配置好環境,換到別的機子上就可以一鍵部署好,大大簡化了操作。
一句話:解決了執行環境和配置問題軟體容器,方便做持續整合並有助於整體釋出的容器虛擬化技術。
docker三要素:倉庫、映象、容器
1.2 能幹嘛
1.2.1 之前的虛擬機器技術
虛擬機器(virtual machine)就是帶環境安裝的一種解決方案。
它可以在一種作業系統裡面執行另一種作業系統,比如在Windows 系統裡面執行Linux 系統。應用程式對此毫無感知,因為虛擬機器看上去跟真實系統一模一樣,而對於底層系統來說,虛擬機器就是一個普通檔案,不需要了就刪掉,對其他部分毫無影響。這類虛擬機器完美的運行了另一套系統,能夠使應用程式,作業系統和硬體三者之間的邏輯不變。
虛擬機器的缺點:佔用資源多、冗餘步驟多、啟動慢
1.2.2 容器虛擬化技術
由於前面虛擬機器存在這些缺點,Linux 發展出了另一種虛擬化技術:Linux 容器(Linux Containers,縮寫為 LXC)。
Linux 容器不是模擬一個完整的作業系統,而是對程序進行隔離。有了容器,就可以將軟體執行所需的所有資源打包到一個隔離的容器中。容器與虛擬機器不同,不需要捆綁一整套作業系統,只需要軟體工作所需的庫資源和設定。系統因此而變得高效輕量並保證部署在任何環境中的軟體都能始終如一地執行。
比較了 Docker 和傳統虛擬化方式的不同之處:
-
傳統虛擬機器技術是虛擬出一套硬體後,在其上執行一個完整作業系統,在該系統上再執行所需應用程序;
-
而容器內的應用程序直接運行於宿主的核心,容器內沒有自己的核心,而且也沒有進行硬體虛擬。因此容器要比傳統虛擬機器更為輕便。
-
每個容器之間互相隔離,每個容器有自己的檔案系統 ,容器之間程序不會相互影響,能區分計算資源。
1.2.3 開發/運維(DevOps)
Development(開發)和Operations(運維)的組合詞。開發自運維
1.3 去哪下
官網:https://docs.docker.com/engine/install/centos/
倉庫:https://hub.docker.com/
二、Docker安裝
CentOS Docker 安裝
Docker支援以下的CentOS版本:
CentOS 7 (64-bit)
CentOS 6.5 (64-bit) 或更高的版本
前提條件
目前,CentOS 僅發行版本中的核心支援 Docker。
Docker 執行在 CentOS 7 上,要求系統為64位、系統核心版本為 3.10 以上。
Docker 執行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系統為64位、系統核心版本為 2.6.32-431 或者更高版本。
檢視核心版本:uname -r
2.1 Docker的基本組成
2.1.1 映象、容器&倉庫
- 映象(image):Docker 映象(Image)就是一個只讀的模板。映象可以用來建立 Docker 容器,一個映象可以建立很多容器。
-
容器(container):Docker 利用容器(Container)獨立執行的一個或一組應用。容器是用映象建立的執行例項。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。可以把容器看做是一個簡易版的 Linux 環境(包括root使用者許可權、程序空間、使用者空間和網路空間等)和執行在其中的應用程式。容器的定義和映象幾乎一模一樣,也是一堆層的統一視角,唯一區別在於容器的最上面那一層是可讀可寫的。
-
倉庫(repository):倉庫(Repository)是集中存放映象檔案的場所。倉庫(Repository)和倉庫註冊伺服器(Registry)是有區別的。倉庫註冊伺服器上往往存放著多個倉庫,每個倉庫中又包含了多個映象,每個映象有不同的標籤(tag)。
2.1.2 總結
需要正確的理解倉儲/映象/容器這幾個概念:
Docker 本身是一個容器執行載體或稱之為管理引擎。我們把應用程式和配置依賴打包好形成一個可交付的執行環境,這個打包好的執行環境就似乎 image映象檔案。只有通過這個映象檔案才能生成 Docker 容器。image 檔案可以看作是容器的模板。Docker 根據 image 檔案生成容器的例項。同一個 image 檔案,可以生成多個同時執行的容器例項。
-
image 檔案生成的容器例項,本身也是一個檔案,稱為映象檔案;
-
一個容器執行一種服務,當我們需要的時候,就可以通過docker客戶端建立一個對應的執行例項,也就是我們的容器;
-
至於倉儲,就是放了一堆映象的地方,我們可以把映象釋出到倉儲中,需要的時候從倉儲中拉下來就可以了。
2.2 Docker的安裝
2.2.1 CentOS6.8安裝Docker
yum install -y epel-release # docker依賴庫
yum install -y docker-io
安裝後的配置檔案:/etc/sysconfig/docker
啟動docker後臺服務:service docker start
檢視docker版本資訊:docker version
2.2.2 CentOS7安裝Docker
安裝官方文件:https://docs.docker.com/install/linux/docker-ce/centos/
安裝docker:
yum -y install gcc gcc-c++ #安裝gcc相關依賴
# 解除安裝舊版本 沒有裝的可以直接跳過
sudo yum remove docker docker-client docker-client-latest docker-common \
docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 安裝yum-utils包並設定穩定儲存庫
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 安裝docker
sudo yum install docker-ce docker-ce-cli containerd.io
# 啟動docker
systemctl start docker
配置國內映象加速:
docker預設是從docker hub中下載映象的,但是速度很慢,所以我們需要將映象倉庫切換到國內。這裡我們使用阿里雲的映象加速
登陸阿里雲,進入控制檯-產品與服務-容器映象服務,複製對應系統的映象加速語句即可。
阿里雲映象加速器 : https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
# 在etc下建立docker資料夾
sudo mkdir -p /etc/docker
# 修改配置,設定映象
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://yjqjq9ag.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
2.2.3 解除安裝
systemctl stop docker
sudo yum remove docker docker-client docker-client-latest docker-common \
docker-latest docker-latest-logrotate docker-logrotate docker-engine
rm -rf /var/lib/docker
2.2.4 測試執行hello-world
由於本地沒有hello-world映象,所以會下載一個hello-world映象,並在容器中執行。
run幹了什麼:
2.3 底層原理
2.3.1 docker是怎麼工作的
Docker是一個Client-Server結構的系統,Docker守護程序執行在主機上, 然後通過Socket連線從客戶端訪問,守護程序從客戶端接受命令並管理執行在主機上的容器。 容器,是一個執行時環境,就是我們前面說到的集裝箱。
2.3.2 為什麼Docker比VM快
-
docker有著比虛擬機器更少的抽象層。由亍docker不需要Hypervisor實現硬體資源虛擬化,執行在docker容器上的程式直接使用的都是實際物理機的硬體資源。因此在CPU、記憶體利用率上docker將會在效率上有明顯優勢。
-
docker利用的是宿主機的核心,而不需要Guest OS。因此,當新建一個容器時,docker不需要和虛擬機器一樣重新載入一個作業系統核心。仍而避免引尋、載入作業系統核心返個比較費時費資源的過程,當新建一個虛擬機器時,虛擬機器軟體需要載入Guest OS,返個新建過程是分鐘級別的。而docker由於直接利用宿主機的作業系統,則省略了返個過程,因此新建一個docker容器只需要幾秒鐘。
Docker容器 | 虛擬機器 | |
---|---|---|
作業系統 | 與宿主機共享OS | 宿主機OS上執行虛擬機器OS |
儲存大小 | 映象小,便於儲存與傳輸 | 映象龐大(vmdk、vdi等) |
執行新跟你給 | 幾乎無額外效能損失 | 作業系統額外的CPU、記憶體消耗 |
移植性 | 輕便、靈活、適應於Linux | 笨重,與虛擬化技術耦合度高 |
硬體親和性 | 面向軟體開發者 | 面向硬體運維者 |
部署速度 | 快速,秒級 | 較慢,10s以上 |