看完這篇,Docker你就入門了

2022-02-03 腳本之家

在計算機技術日新月異的今天, Docker在國內發展的如火如荼,特別是在一線網際網路公司,Docker的使用是十分普遍的,在理解docker之前,我們先熟悉兩個概念,容器和虛擬機。

傳統的虛擬機有VMware, VirtualBox ,它們需要模擬整臺機器包括硬體,每臺虛擬機都需要有自己的作業系統,虛擬機一旦開啟,預分配給它們的資源將全部被佔用。每一臺虛擬機包括應用,必要的二進位和庫,以及一個完整的用戶作業系統。

而容器技術是和我們的宿主機共享硬體資源及作業系統,可以實現資源的動態分配。容器包含應用和其所有的依賴包,但是與其他容器共享內核。容器在宿主機作業系統中,在用戶控制項以分離的進程運行。

容器技術是實現作業系統虛擬化的一種途徑,可以讓您在資源受到隔離的進程中運行應用程式及其依賴關係。通過使用容器,我們可以輕鬆打包應用程式的代碼、配置和依賴關係,將其編程容易使用的構建塊,從而實現環境一致性、運營效率、開發人員生產力和版本控制等諸多目標。容器幫助保證應用程式快速、可靠、一致性部署,其間不受部署環境的影響。容器還賦予我們對資源更多的精細化控制能力,讓我們的基礎設施效率更高、通過下面這張圖我們可以很直觀的反映出二者的區別。

Docker屬於Linux容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的Linux容器解決方案。

Linux容器不是模擬一個完整的作業系統,而是對進程進行隔離,相當於在正常進程的外面套了一個保護層。對於容器裡面的進程來說,它接觸到的各種資源都是虛擬的,從而實現與底層系統的隔離。

Docker將應用程式與該程序的依賴,打包在一個文件裡。運行這個文件,就會生成一個虛擬容器,程序在這個虛擬容器裡運行,就好像在真實的物理機上運行一樣,有了Docker,就不用擔心環境問題。

總體來說,Docker的接口相當簡單,用戶可以方便的創建和使用容器,把自己的應用放入容器,容器還可以進行版本管理,複製,分享,修改,就像管理代碼一樣。

1、Docker啟動快速,屬於秒級別。虛擬機通常需要幾分鐘去啟動。

2、Docker需要的資源更少,Docker在作業系統級別進行虛擬化,Docker容器和內核交互,幾乎沒有性能損耗,性能優於通過 Hypervisor 層與內核層的虛擬化

3、Docker更輕量,Docker的架構可以共用一個內核與共享應用程式庫,所佔內存極小。同樣的硬體環境,Docker運行的鏡像數遠低於虛擬機數量,對系統的利用率非常高

4、安全性, Docker的安全性也更弱。Docker的租戶root和宿主機root等同,一旦容器內的用戶從普通用戶權限提升為root權限,它就直接具備了宿主機的root權限,進而可進行無限制的操作。虛擬機租戶root權限和宿主機的root虛擬機權限是分離的,並且虛擬機利用如intel的vt-d和vt-x的ring-1硬體隔離技術,這種隔離技術可以防止虛擬機突破和彼此交互,而容器至今還沒有任何形式的硬體隔離,這使得容器容易受到攻擊

5、可管理性:Docker的集中化管理工具還不算成熟。各種虛擬化技術都有成熟的管理工具,例如VMware Vcentor提供完備的虛擬機管理能力

6、高可用和可恢復性:Docker對業務的高可用支持是通過快速重新部署實現的。虛擬化具備負載均衡,高可用,容錯,遷移和數據保護等經過生產實踐檢驗的成熟保障機制,VMware可承諾虛擬機99.9999%高可用,保證業務連續性

7、 交付、部署:虛擬機可以通過鏡像實現環境交付的一致性,但鏡像分發無法體系化。 Docker在Dockerfile中記錄了容器構建過程,可在集群中實現快速分發和快速部署

從上圖我們可以看到,Docker中包括三個基本的概念:

Image(鏡像)

Container(容器)

Repository(倉庫)

1、鏡像是Docker運行容器的前提,倉庫是存放鏡像的場所,可見鏡像是Docker的核心。

那麼鏡像到底是什麼呢?

Docker鏡像可以看作是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數。鏡像不包含任何動態數據,其內容在構建之後也不會被改變。

  

2、Container (容器)

容器的定義和鏡像幾乎一模一樣,也是一堆層的統一視角,唯一區別在於容器的最上面那一層是可讀可寫的。

由於容器的定義並沒有提及是否要運行容器,所以實際上,容器 = 鏡像 + 讀寫層。

3、Repository(倉庫)

Docker倉庫是集中存放鏡像文件的場所,鏡像構建完成後,可以很容易在當前宿主上運行,但是,如果需要在其他伺服器上使用這個鏡像,我們需要一個集中的存儲、分發鏡像的服務,Docker Registry(倉庫註冊伺服器)就是這樣的服務。 有時候會把倉庫(Repository)和倉庫註冊伺服器(Registry)混為一談,並不嚴格區分。 實際上,一個Docker Registry中可以包含多個倉庫(Repository),每個倉庫可以包含多個標籤 ,每個標籤對應著一個鏡像。所以說,鏡像倉庫是Docker用來集中存放鏡像文件的地方類似於我們之前常用的代碼倉庫。

倉庫又可以分為兩種形式:

(1)public(共有倉庫)

Docker Registry公有倉庫是開放給用戶使用、允許用戶管理鏡像的 Registry 服務。一般這類公開服務允許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像。

(2)private(私有倉庫)

Docker官方提供了Docker Registry鏡像,可以直接使用做為私有Registry服務。當用戶創建了自己的鏡像之後就可以使用push命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull下來就可以了。

Docker使用C/S架構,即客戶端/伺服器體系結構。Docker客戶端與Docker伺服器進行交互,Docker服務端負責構建、運行和分發Docker鏡像。Docker客戶端與服務端可以運行在一臺機器上,也可以通過RESTful、stock或網絡接口與遠程Docker服務端進行通信。

這張圖展示了Docker客戶端、服務端和Docker倉庫(即Docker Hub和Docker Cloud ),默認情況下Docker會在Docker中央倉庫尋找鏡像文件,這種利用倉庫管理鏡像的設計理念類似於Git,當然這個倉庫是可以通過修改配置來指定的,甚至我們可以創建我們自己的私有倉庫。

Docker採用的是C/S架構,客戶端向伺服器發送請求,伺服器負責構建、運行和分發容器。客戶端和伺服器可以運行在同一個Host上,客戶端也可以通過socket或REST API與遠程的伺服器通信。

1、Docker Client

Docker客戶端其實就是Docker提供命令行界面工具,是許多Docker 用戶與Docker 進行交互的主要方式。客戶端可以構建、運行和停止應用程式,還可以遠程與Docker_HOST進行交互。 最常用的Docker客戶端就是Docker命令,我們可以通過Docker命令很方便地在host上構建和運行Docker容器。

2、Docker Daemon

Docker Daemon是伺服器組件,以Linux後臺服務的方式運行,是Docker最核心的後臺進程,我們也把它稱為守護進程。它負責相應來自Docker Client的請求,然後將這些請求翻譯成系統調用完成容器管理操作。該進程會在後臺啟動一個API Server,負責接收由Docker Client發送的請求,接收到的請求將通過Docker Daemon內部的一個路由分發調用,由具體的函數來執行請求。

Docker Daemon的架構如下所示:

Docker Daemon可以認為是通過Docker Server模塊接受Docker Client的請求,並在Engine中處理請求,然後根據請求類型,創建出指定的Job並運行。Docker Daemon運行在Docker Host上,負責創建、運行、監控容器,構建、存儲鏡像。

運行過程的作用有以下幾種可能:

向Docker Registry獲取鏡像

通過grapthdriver執行容器鏡像的本地化操作

通過networkdriver執行容器網絡環境的配置

通過execdriver執行容器內部運行的執行工作

由於Docker Daemon和Docker Client的啟動都是通過可執行文件Docker來完成的,因此兩者的啟動流程非常相似。Docker可執行文件運行時,運行代碼通過不同的命令行flag參數,區分兩者,並最終運行兩者各自相應的部分。

啟動Docker Daemon時,一般可以使用一下命令來完成

docker --daemon = truedocker –ddocker –d = true

再由docker的main函數來解析以上命令的相應的flag參數,並最終完成Docker Daemon的啟動。

Docker Daemon的啟動流程:

默認配置下,  Docker Daemon只能相應來自本地host的客戶端請求。如果要允許遠程客戶端請求,需要在配置文件中打開TCP監聽。我們可以照著如下步驟進行配置:

(1)編輯配置文件 /etc/systemd/system/multi-user.target.wants/docker.service ,在環境變量 ExecStart後面添加 -H tcp://0.0.0.0,允許來自任意 IP 的客戶端連接。

(2)重啟 Docker Daemon

systemctl daemon-reloadsystemctl restart docker.service

(3)我們通過以下命令即可實現與遠程伺服器通信

-H 是用來指定伺服器主機,info子命令用於查看docker伺服器的信息

3、Docker Image

Docker鏡像可以看作是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之後也不會被改變。我們可將Docker鏡像看成只讀模板,通過它可以創建Docker容器。

鏡像有多種生成方法:

從無到有開始創建鏡像

下載並使用別人創建好的現成的鏡像

在現有鏡像上創建新的鏡像

我們可以將鏡像的內容和創建步驟描述在一個文本文件中,這個文本文件稱作Dockerfile,通過執行docker build命令可以構建出docker鏡像。

4、Docker Registry

Docker Registry是存儲Docker Image的倉庫,它在Docker生態環境中的位置如下圖所示:

運行Docker Push、Docker pull、Docker search時,實際上是通過 Docker Daemon與  Docker registry通信。

5、Docker Container

Docker容器就是Docker鏡像的運行實例,是真正運行項目程序、消耗系統資源、提供服務的地方。Docker  Container提供了系統硬體環境,我們可以使用Docker Image這些製作好的系統盤,再加上我們編寫好的項目代碼,run一下就可以提供服務了。

容器啟動過程如下:

具體過程可以看如下這幅演示圖:

我們可以通過Docker Image可以查看到hello-world已經下載到本地

我們可以通過docker -h去查看命令的詳細的幫助文檔。在這裡我只會講一些平常日常比賽或者生活中我們可能會用的比較多的一些命令。

例如,我們需要拉取一個docker鏡像,我們可以用如下命令:

image_name為鏡像的名稱,而如果我們想從Docker Hub上去下載某個鏡像,我們可以使用以下命令:

docker pull centos:latest

centos:lastest是鏡像的名稱,Docker daemon發現本地沒有我們需要的鏡像,會自動去Docker Hub上去下載鏡像,下載完成後,該鏡像被默認保存到/var/lib/docker目錄下。

接著我們如果想查看下主機下存在多少鏡像,我們可以用如下命令:

我們要想知道當前有哪些容器在運行,我們可以用如下命令:

-a是查看當前所有的容器,包括未運行的

我們該如何去對一個容器進行啟動,重啟和停止呢?我們可以用如下命令:

docker start container_name/container_iddocker restart container_name/container_iddocker stop container_name/container_id

這個時候我們如果想進入到這個容器中,我們可以使用attach命令:

docker attach container_name/container_id

那如果我們想運行這個容器中的鏡像的話,並且調用鏡像裡面的bash,我們可以使用如下命令:

docker run -t -i container_name/container_id /bin/bash

那如果這個時候,我們想刪除指定鏡像的話,由於image被某個container引用(拿來運行),如果不將這個引用的container銷毀(刪除),那image肯定是不能被刪除。我們首先得先去停止這個容器:

然後我們用如下命令去刪除這個容器:

docker psdocker stop container_name/container_id

然後這個時候我們再去刪除這個鏡像:

此時,常用的Docker相關的命令就講到這裡為止了,我們在後續的文章中還會反覆地提到這些命令。

Dockerfile是自動構建docker鏡像的配置文件,用戶可以使用Dockerfile快速創建自定義的鏡像,Dockerfile中的命令非常類似於Linux下的shell命令。

我們可以通過下面這幅圖來直觀地感受下 Docker 鏡像、容器和 Dockerfile 三者之間的關係。

我們從上圖中可以看到,Dockerfile可以自定義鏡像,通過Docker命令去運行鏡像,從而達到啟動容器的目的。

Dockerfile 是由一行行命令語句組成,並且支持已#開頭的注釋行。

一般來說,我們可以將Dockerfile分為四個部分:

下面是一段簡單的Dockerfile的例子:

1、從Docker Hub上pull下python 2.7的基礎鏡像

2、顯示維護者的信息

3、copy 當前目錄到容器中的/app目錄下 複製本地主機的(Dockerfile所在目錄的相對路徑)到容器裡

4、指定工作路徑為/app

5、安裝依賴包

6、暴露5000埠

7、啟動app

這個例子是啟動一個Python flask app的Dockerfile(flask是Python的一個輕量級的web框架),相信大家從這個例子中能夠稍微理解了Dockerfile的組成以及指令的編寫過程。

mkdir static_web
cd static_web
touch Dockerfile
然後 vi Dockerfile  開始編輯該文件
輸入 i 開始編輯

以下是我們構建的Dockerfile內容``````````FROM nginx
MAINTAINER Angel_Kitty<angelkitty6698@gmail
RUN echo '</angelkitty6698

Hello, Docker!' > /usr/share/nginx/html/index.html``````````
編輯完後 按 esc 退出編輯
然後  :wq    寫入 退出

我們在Dockerfile文件所在目錄執行:

docker build -t angelkitty/nginx_web:v1 .

我們解釋一下,-t是為新鏡像設置倉庫和名稱,其中angelkitty為倉庫名,nginx_web為鏡像名,:v1為標籤(不添加為默認latest)

我們構建完成之後,使用docker images命令查看所有鏡像,如果存在REPOSTORY為nginx和TAG是v1的信息,就表示構建成功。

接下來使用docker run命令來啟動容器

docker run --name nginx_web -d -p 8080:80   angelkitty/nginx_web:v1

這條命令會用nginx鏡像啟動一個容器,命名為nginx_web,並且映射了 8080 埠,這樣我們可以用瀏覽器去訪問這個nginx伺服器:http:localhost:8080或者 http://本機的IP位址:8080/,頁面返回信息:

這樣一個簡單使用Dockerfile構建鏡像,運行容器的示例就完成了!

參與視頻號留言互動

每天送出 5個 8.88 元紅包

↓↓↓

相關焦點

  • Docker極簡入門
    5.寫時複製:文件系統都是通過寫時複製創建的,這就意味著文件系統是分層的、快速的,並且佔用磁碟空間小。6.日誌:容器產生的STDOUT、STDIN和STDERR這些IO流都會被收集並記入日誌,用來進行日誌分析和故障排除。
  • Docker從入門到放棄-基礎篇
    引言 如果你認為學習docker是運維該做的,那你就錯了。作為一名研發工程師,學會基礎的docker使用,能大大提高平時的效率。 雖然docker已經出來將近8年,但是相信還是有很多人並不知道docker是什麼?為什麼這麼受歡迎?
  • Docker 最初的2小時(Docker從入門到入門)
    虛擬化,本質上一種虛幻,給你一種幻覺,讓你覺得擁有的很多甚至擁有全世界,哪怕你實際是一隻螻蟻。經過本人多年研究,虛擬化的技術分為2種,一種是虛擬一個世界,第二個是虛擬一個氛圍。比如我們在現實生活裡面是個屌絲,但是在虛擬人生的遊戲裡面,我們可以是王思聰++,集美貌智慧財富正義於一生。
  • Docker入門為什麼可以這麼簡單?
    這篇我來講講Docker入門的相關概念和常用的命令,跟大家一起入門Docker!Docker一、Docker相關術語一般從零學習一門技術(語言),都是從HelloWorld開始的,但這次我偏不。所以,如果你想跟著我一起安裝Docker,先明確自己的版本是否是CentOS 7,如果不是只能找其他的教程來進行安裝。
  • 【擁抱容器】:Docker 與 K8s 的入門課實戰系列課程總結
    不管你是想要複習,還是因故未能參加,還是中途缺席課程的,都可以戳以往的文章回顧學習哦~:👇👇👇【活動回顧】容器實戰:Docker 基礎入門講座實錄 | 擁抱容器:Docker 集群入門與實戰(上)講座實錄 | 擁抱容器:Docker 集群入門與實戰(下)【活動回顧】擁抱容器:Python web開發及其與
  • 宋寶華:Docker 最初的2小時(Docker從入門到入門)
    虛擬化,本質上一種虛幻,給你一種幻覺,讓你覺得擁有的很多甚至擁有全世界,哪怕你實際是一隻螻蟻。經過本人多年研究,虛擬化的技術分為2種,一種是虛擬一個世界,第二個是虛擬一個氛圍。比如我們在現實生活裡面是個屌絲,但是在虛擬人生的遊戲裡面,我們可以是王思聰++,集美貌智慧財富正義於一生。
  • Docker秒搭建php7+web運行生產環境
    一直聽說Docker比較厲害,但是一直沒有了解,今天在嗶哩嗶哩上刷了一下入門課後,簡直發現新大陸般,Docker的強大真的了解太晚了。
  • 寫給 FE 同學的 Docker 入門指南
    使用 "Node Image" 創建了 2個 "Node Container",這兩個 "Container" 之間互相隔離互不影響2.3.理解 Docker 的三個基本概念在 Docker 中有三個概念Container - 容器Image - 鏡像Registry - 倉庫可以像下面這張圖來類比
  • 搭建前端開發環境――docker篇
    Image 是靜態內容,如果你要把某個 Image 跑起來,那就需要一個 Container。這裡面有一點很重要:Container 中所做的改動不會保存到 Image。如果需要保存改動,很簡單,執行 docker commit ContainerID TAG 即可,類似於 git 的 commit 如果不想使用commit仍想保存文件,docker 也提供了一個方法:使用 Volume。
  • Docker基礎與實戰,看這一篇就夠了
    記住最重要的一點,Dokcer實際是宿主機的一個普通的進程,這也是Dokcer與傳統虛擬化技術的最大不同。docker 安裝安裝前提Docker 要求 CentOS 系統的內核版本高於 3.10 ,首先查看本頁面的前提條件來驗證你的CentOS 版本是否支持 Docker 。
  • 什麼是Docker?看這一篇乾貨文章就夠了!
    測試同學測完後終於可以上線了,這時運維同學又要重新從頭到尾搭建這套環境,費了九牛二虎之力搭建好環境開始上線,糟糕,上線系統就崩潰了,這時心理素質好的程式設計師又可以施展演技了,「明明在人家的環境上可以運行的」。
  • 200集photoshop入門教程分享,看完這篇你就夠了
    200集photoshop入門教程分享,看完這篇你就夠了 多數想學ps的人基礎都沒有打牢,就想學更高級的課程,這會導致整個學習過程非常緩慢,最後學無所成。因為基礎對PS學者來說太重要了,有些人連最基本的工具都不知道怎麼用,就想學創意合成和高級調色,總以為高級的課程,會講解的更加深入和詳細一些。其實不然。
  • Dockerfile使用入門
    使用Dockerfile生成鏡像,並掛載數據卷編寫Dockerfile 注意:命令單詞全部大寫
  • Docker 入門到實戰教程(六)Docker數據卷
    數據卷在Docker的使用過程中往往需要對數據進行持久化,或者需要在多個容器之間進行數據共享,所以這就涉及到Docker容器的數據操作。容器中數據管理主要有兩種方式:數據卷和數據卷容器。2.1 數據卷數據卷是一個特殊的目錄,它將主機目錄直接映射進容器。可供一個或多個容器使用。
  • docker系列:docker安裝
    大家好~我是小方,歡迎大家關注「筍貨測試筆記」體完記得俾個「like」呀
  • 一線網際網路大廠普遍使用的Docker,這份筆記幫你入門到深入
    在計算機技術日新月異的今天,Docker 在國內發展的如火如荼,特別是在一線網際網路公司, Docker 的使用是十分普遍的,甚至成為了一些企業面試的加分項,不信的話看看下面這張圖。這是我在某招聘網站上看到的招聘 Java開發工程師的招聘要求,其中有一條熟悉 docker 成為了你快速入職的加分項,由此可見熟悉 docker 在網際網路公司的地位之重要。
  • Docker —— 從入門到實踐
    在線閱讀:https://www.gitbook.io/book/yeasy/docker_practice。維護本書的Github項目: https://github.com/yeasy/docker_practice。 歡迎大家參與。本書發布時,Docker的最新版本為1.20。
  • Docker 入門到實戰教程(五)構建Docker鏡像
    這點類似於git commit的提交代碼更新,我們可以首先創建一個容器,然後對容器進行修改,修改完成後像提交代碼一樣將修改提交為一個新鏡像。如果你要完成映射還是要在創建的時候使用-p/-P參數。3.1.7 ENV說明:指定環境變量,在鏡像的生成過程中會被後續RUN指令調用,在啟動的容器中也會存在。
  • docker系列學習(二):Docker + Flask 例子
    系列學習(一):整體認識docker系列學習(二):Docker + Flask 例子(當前文章)這是一個簡單的 Docker + Flask 入門教程。如果你想要清除所有未運行的東西,可以運行如下命令:docker system prune -a這將刪除你在本地 docker 實例中的所有內容。所以要小心。好了,現在我們知道了基礎知識,讓我們開始學習吧。
  • Docker 快速入門之 Dockerfile
    通過順序執行這些指令,最後得到一個自定義的鏡像,這有點類似於我們的 shell 腳本。2、Dockerfile 示例接下來先看一個 Dockerfile 示例:FROM centosLABEL maintainer="Locez <locez@locez.com>"ENV TEST="This is a test env"COPY nginx.repo /etc/yum.repos.d