Doker 神器

zhangdeTalk發表於2020-06-02

Docker是什麼?

定義

Docker是一款開源的應用容器引擎。

簡單來說,就是以容器虛擬化技術為基礎的軟體。可以把應用程式和所依賴的包一起打包到一個可移植的映象中,釋出到Linux或者Windows上執行。(程式碼+執行環境)

虛擬機器與容器技術對比

虛擬機器

虛擬機器可以高效使用計算機資源(比如可以解決同一種服務埠衝突、程式依賴版本庫不同、程式受限制等問題),常見的虛擬機器有:vmware、virtualbox。

虛擬機器的底層原理是基於hypervisor(硬體抽象層),也叫虛擬機器監視器(VMM)。

容器技術

是一種沙盒技術,相互之間不會有任何介面。將應用執行在容器中,容器之間隔離的。

容器技術更關注應用本身,應用和所依賴環境的共享和複用。

Linux Container(簡稱LXC),是一種核心輕量級的作業系統層虛擬化技術,容器化技術就是基於LXC實現的。

四個維度對比

由此可見,為什麼容器技術會出現,為什麼容器技術會那麼流行,是因為虛擬機器有痛點的,容器技術就是為了解決這些痛點而生的。而Docker就是容器化技術的代表。

Docker的應用場景

Docker的實現原理與優勢

Docker的技術架構

Docker是由dotCloud於2013年推出的產品,用GO語言編寫的。

Docker有兩種發行版本,分別是CE(Community Edition,社群版)和EE(Enterprise Edition,企業版)。

Docker是C/S架構。客戶端(docker cli,執行程式),通過命令列和API形式與守護程式(docker daemon,提供Docker服務)進行通訊。

舉個具體的例子,在常見的虛擬機器實現中,我們要搭建一套 LNMP 結構的服務,我們通常會建立一個虛擬機器,在虛擬機器中安裝上 Linux 系統,之後分別安裝 Nginx、MySQL 和 PHP。

而在 Docker 裡,最佳的實踐是分別基於 Nginx、MySQL 和 PHP 的映象建立三個容器,分別執行 Nginx、MySQL 和 PHP ,而它們所在的虛擬作業系統也直接共享於宿主機的作業系統。

Docker的實現原理

Linux三大技術

Docker的實現,主要歸結於Linux的三大技術:名稱空間(Namespaces)、控制組(Control Groups)和聯合檔案系統(Union FIle System)。

Namespaces

在程式語言中,名稱空間的主要目的就是為了集合相同模組的類,區分不同模組間的同名類。
Linux 核心的名稱空間,就是能夠將計算機資源進行切割劃分,形成各自獨立的空間。
如 User Namespace、Net Namespace、PID Namespace、Mount Namespace 等等。

利用 PID Namespace,Docker 就實現了容器中隔離程式執行中程式隔離這一目標。

Control Groups

資源控制組的作用就是控制計算機資源。CGroups主要做的是硬體資源的隔離。除了資源的隔離,還有資源分配這個關鍵性的作用。

通過 CGroups,我們可以指定任意一個隔離環境對任意資源的佔用值或佔用率,這對於很多分散式使用場景來說是非常有用的功能。

Union FIle System

一種能夠同時掛載不同實際檔案或資料夾到同一目錄,形成一種聯合檔案結構的檔案系統。

Docker用它解決虛擬環境對檔案系統佔用過量,實現虛擬環境快速啟停等問題。

Docker 大幅減少了虛擬檔案系統對物理儲存空間的佔用。(例子:git,Git 中每進行一次提交,Git 並不是將我們所有的內容打包成一個版本,而只是將修改的部分進行記錄,這樣即使我們提交很多次後,程式碼庫的空間佔用也不會倍數增加。)

Docker的優勢

1. 應用的安全性、可移植性和節約成本;
2. 讓自動化部署更簡單(持續整合CI和持續部署CD,快速交付;
3. 加速應用架構現代化程式(如微服務架構);
4. 充分利用伺服器資源;
5. 跨平臺部署和動態伸縮(如使用K8s編排工具管理)。

Docker的安裝

macos安裝

安裝教程:https://www.runoob.com/docker/macos-docker-install.html

windows安裝

安裝教程:https://www.runoob.com/docker/windows-docker-install.html

Linux安裝

centos:https://www.runoob.com/docker/centos-docker-install.html
ubuntu:https://www.runoob.com/docker/ubuntu-docker-install.html

Docker的四大核心組成

映象(Image)

可以理解為一個只讀的檔案包,其中包含了虛擬環境執行最原始檔案系統的內容。

檢視映象列表:docker images

映象命名格式:開發者/映象名字:版本號

拉取: docker pull 映象名稱
搜尋: docker search 映象名稱 //從docker hub搜尋
映象詳細資訊: docker inspect 映象名稱/ID
刪除映象: docker rmi 映象名稱/ID
容器(Container)

在容器技術中,容器就是用來隔離虛擬環境的基礎設施,而在 docker 裡,它也被引申為隔離出來的虛擬環境。

容器包括:
- 一個 Docker 映象
- 一個程式執行環境
- 一個指令集合

容器的生命週期:
- Created:容器已經被建立,容器所需的相關資源已經準備就緒,但容器中的程式還未處於執行狀態
- Running:容器正在執行,也就是容器中的應用正在執行
- Paused:容器已暫停,表示容器中的所有程式都處於暫停 ( 不是停止 ) 狀態
- Stopped:容器處於停止狀態,佔用的資源和沙盒環境都依然存在,只是容器中的應用程式均已停止
- Deleted:容器已刪除,相關佔用的資源及儲存在 Docker 中的管理資訊也都已釋放和移除
常用命令:
檢視正在執行的容器列表:docker ps
所有容器:docker ps -a
建立啟動容器:docker run --name redis -d redis:5.0.15
停止容器:docker stop 容器名字/ID
啟動/重啟容器:docker start/restart 容器名字/ID
刪除容器:docker rm [-f] //-f強制,可以刪除正在執行的容器
進入容器:docker exec -it redis bash //容器內部是虛擬出來的一個Linux
docker logs 容器ID //檢視容器報錯資訊檢視
網路(Network)

容器網路實質上也是由 Docker 為應用程式所創造的虛擬環境的一部分,它能讓應用從宿主機作業系統的網路環境中獨立出來,形成容器自有的網路裝置、IP 協議棧、埠套接字、IP 路由表、防火牆等等與網路相關的模組。

- 沙盒(Sandbox)提供了容器的虛擬網路棧,也就是之前所提到的埠套接字、IP 路由表、防火牆等的內容。其實現隔離了容器網路與宿主機網路,形成了完全獨立的容器網路環境

- 網路(Network)可以理解為 Docker 內部的虛擬子網,網路內的參與者相互可見並能夠進行通訊。Docker 的這種虛擬網路也是於宿主機網路存在隔離關係的,其目的主要是形成容器間的安全通訊環境

- 端點(Endpoint)是位於容器或網路隔離牆之上的洞,其主要目的是形成一個可以控制的突破封閉的網路環境的出入口。當容器的端點與網路的端點形成配對後,就如同在這兩者之間搭建了橋樑,便能夠進行資料傳輸了

Docker容器網路一共有5種網路驅動,網路驅動,分別是:Bridge Driver(網橋 預設)、Host Driver、Overlay Driver(叢集)、MacLan Driver、None Driver。

容器之間以及宿主機與容器之間可以通過埠來進行訪問。

常用命令:
檢視網路列表:docker network ls
容器加入網路:
docker run -d --name mysql -e MYSQL_RANDOM_ROOT_PASSWORD=yes --network network_name mysql:5.7
docker run -d --name php --link mysql --network network_name php:latest
埠對映:
docker run -d --name nginx -p 8080:80 nginx:1.12 //80為容器的埠,8080可為宿主機或別的容器的埠
資料卷(Volume)

在 Docker 中,通過bind mount、volume、tmpfs mount這幾種方式進行資料共享或持久化的檔案或目錄,我們都稱為資料卷 ( Volume )。

Docker的資料卷一共有3中掛載方式,分別是:Bind Mount、Volume、Tmpfs Mount

- Bind Mount 能夠直接將宿主作業系統中的目錄和檔案掛載到容器內的檔案系統中,通過指定容器外的路徑和容器內的路徑,就可以形成掛載對映關係,在容器內外對檔案的讀寫,都是相互可見的

- Volume 也是從宿主作業系統中掛載目錄到容器內,只不過這個掛載的目錄由 Docker 進行管理,我們只需要指定容器內的目錄,不需要關心具體掛載到了宿主作業系統中的哪裡

- Tmpfs Mount 支援掛載系統記憶體中的一部分到容器的檔案系統裡,不過由於記憶體和容器的特徵,它的儲存並不是持久的,其中的內容會隨著容器的停止而消失
bind mount方式:
docker run -d --name nginx_test -v /nginx/html:/usr/share/nginx/html nginx
檢視容器掛在檔案:
docker exec  nginx_test ls /usr/share/nginx/html

利器docker-compose

docker-compose 是用於定義和執行多容器 Docker 應用程式的工具(整合部署),使用docker-compose可以高效管理容器。

使用步驟:
1、Dockerfile 定義應用程式的環境(定製自己的映象源)
2、docker-compose.yml 定義構成應用程式的服務,多個容器一起執行
3、docker-compose up 啟動並執行整個應用程式
備註:Linux需單獨安裝docker-compose,macos和windows已經整合

實戰案例-搭建LNMP環境

原始碼下載:https://github.com/zhangdejian/docker_lnmp.git

請參考我的另外一篇部落格:Dockerfile 方式定製 lnmp 環境

Docker的不足

1. 必須在64位機器上執行,目前僅支援x86_64和AMD642. 系統的Linux核心必須是3.8或者更新;
3. 核心必須支援cgroups和名稱空間;
4. docker對disk的管理比較有限;
5. 網路管理相對簡單,主要是機遇namespace隔離;
6.container隨著使用者程式的停止而銷燬,container中的log等使用者資料不方便收集。

Docker的學習資源

官網:docs.docker.com/engine/reference/r...
中文手冊:https://docker_practice.gitee.io/zh-cn/basic_concept/image.html
菜鳥教程:www.runoob.com/docker/docker-tutor...
掘金社群:juejin.im/tag/Docker
開源中國:www.oschina.net/question/tag/docke...
SegmentFault:segmentfault.com/t/docker
推薦入門書籍:《Docker技術入門與實戰》、《Docker進階與實戰》華為團隊
優秀文章:
centos安裝docker:部落格:CentOS 安裝 docker
Dockerfile定製lnmp環境:部落格:Dockerfile 方式定製 lnmp 環境
Dokcer搭建Jenkins實現自動化部署:部落格:Docker 搭建 Jenkins 實現自動部署
Docker+LNMP+Jenkins+碼雲實現程式碼自動化部署:部落格:Docker+LNMP+Jenkins+ 碼雲實現 PHP 程式碼自動化部署
Docker命令筆記:note.youdao.com/noteshare?id=f57544...

版權

部分資料參考:掘金社群Docker專欄

本作品採用《CC 協議》,轉載必須註明作者和本文連結

阿德

相關文章