Docker 學習 一:Docker 是什麼

小魔童哪吒發表於2021-10-27

Docker 是什麼

網址:hub.docker.com/

docker對程式進行封裝隔離,屬於 作業系統層面的虛擬化技術

由於隔離的程式獨立於宿主和其它的隔離的程式,因此也稱其為容器

docker 應用場景

  • 自動化測試和持續整合、釋出
  • Web 應用的自動化打包和釋出
  • 後臺應用易部署

docker 的優勢

  • 快速, 一致的交付應用程式
  • 可移植,可擴充套件
  • 輕巧,快速,經濟,高效,壓榨linux自身資源

Docker 能做什麼?

先來說說 Docker 和虛擬機器有啥不一樣的

以前的虛擬機器這樣的,系統佔用資源大,很多步驟是冗餘的,並且啟動還很慢,不能忍

現在的 Docker 是這個樣子的,

容器之間互相隔離,互補干擾,一起執行在同一個作業系統上,最大化使用作業系統資源

Docker 技術和虛擬機器技術的不同?

  • 每個容器間都是相互隔離的,他們有屬於自己的檔案系統,相互不會有影響
  • 容器沒有自己的核心,沒有自己的硬體,容器內的應用是直接執行在宿主機的核心中
  • 傳統的虛擬機器是虛擬出一個硬體,執行完成的作業系統,在其上面執行應用

那麼 Docker 具體能做什麼?

做 DevOps

做 DevOps 有如下幾個提升點:

  • 應用可以更快捷的部署和交付

以前麻煩的安裝步驟一去不復返,使用 Docker 容器化後,打包映象釋出測試,一鍵部署及執行

  • 可以更方便的升級和擴容

使用 Docker,將專案打包成映象,升級方便,擴容方便

  • 開發,運維,測試都會更簡單

再也不用擔心開發環境,測試環境,運維環境不一致的情況了

  • 更高效的利用資源

Dcoker 是執行在宿主機的核心中,可以在這臺物理主機上部署多個 Docker 例項

Docker 的組成

Docker 使用客戶端-伺服器 (C/S) 架構模式,使用遠端API來管理和建立 Docker 容器

Docker 的三個基本概念:

圖片來源於網路

  • 映象

相當於是一個 root 檔案系統,類似於一個模板,這是靜態的

  • 容器

相當於從模板拉出來的一個例項,容器通過映象來建立,我們可以對他做建立,啟動,停止,暫停,刪除等操作

  • 倉庫

用來儲存映象的,可以看做是一個程式碼控制中心

Docker 的安裝和使用

安裝

網路上安裝 Docker 的方式大致有如下幾種:

  • 官方指令碼自動安裝
  • 使用 Docker 倉庫安裝
  • 使用 ==shell== 指令碼安裝

我們們以 ubuntu 的系統為例子,使用 Docker 倉庫的方式進行安裝,我的ubuntu 系統版本如下:

# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic

設定倉庫

安裝依賴包

sudo apt-get update
sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

新增 Docker 的官方 GPG 金鑰:

curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

驗證祕鑰,可以直接搜尋 9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88 後面的8個字元

sudo apt-key fingerprint 0EBFCD88

有如下輸出為正確設定了祕鑰

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

設定穩定版倉庫

sudo add-apt-repository \
   "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ \
  $(lsb_release -cs) \
  stable"

安裝 Docker

安裝最新的 Docker 版本

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

安裝完成後,驗證是否OK

可以通過 docker version 來檢視 docker 的版本

# docker version
Client: Docker Engine - Community
 Version:           20.10.7
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        f0df350
 Built:             Wed Jun  2 11:56:40 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.7
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       b0f5bc3
  Built:            Wed Jun  2 11:54:48 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.8
  GitCommit:        7eba5930496d9bbe375fdf71603e610ad737d2b2
 runc:
  Version:          1.0.0
  GitCommit:        v1.0.0-0-g84113ee
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

執行一個 hello-world

sudo docker run hello-world

出現如下資訊,為 docker 安裝成功

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:df5f5184104426b65967e016ff2ac0bfcd44ad7899ca3bbcf8e44e4461491a9e
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

當然,你也可以選擇不安裝最新的,安裝自己指定的版本也可

  1. 使用 ==apt-cache madison docker-ce== 檢視倉庫中可用的版本

  2. 使用 ==sudo apt-get install docker-ce= docker-ce-cli= containerd.io== 安裝指定版本的 Docker

  3. 使用 ==sudo docker run hello-world== 驗證是否安裝成功

  • 檢視 docker 映象
# docker images
REPOSITORY        TAG       IMAGE ID       CREATED        SIZE
hello-world       latest    d1165f221234   4 months ago   13.3kB
  • docker 映象
解除安裝映象
sudo apt-get purge docker-ce docker-ce-cli containerd.io

刪除安裝目錄
/var/lib/docker 是docker 的預設安裝路徑
 sudo rm -rf /var/lib/docker
 sudo rm -rf /var/lib/containerd

映象加速

如果是使用阿里雲伺服器的小夥伴可以看這一步

配置映象加速,需要 docker 的安裝版本在 1.10.0 以上,我們當前安裝的 docker 版本為 1.41,完全符合

我們可以通過修改 daemon 配置檔案 /etc/docker/daemon.json 來使用加速器,執行如下指令

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://uhr5ub75.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

docker run 的流程

  • docker run 現在本地找對應的映象,若有則直接執行
  • 若沒有就去docker hub 上下載,若有就下載到本地後執行
  • 若沒有就直接報錯

Docker 的底層原理

Docker 是如何工作的?

docker 是一個C/S 模型,docker 的後臺守護進行執行在主機上,客戶端和服務端通過套接字 Socket 通訊

docker 服務端收到 docker 客戶端的指令時,則執行該指令

為什麼 Docker 比 虛擬機器快呢?

在網路上找了一張圖,我們們對比一下就明確了

如圖,Docker 比虛擬機器快的原因如下:

  • docker 比虛擬機器的抽象層更少
  • docker 利用的是宿主機的核心,而虛擬機器是需要新建一個 OS

基於如上 2 點,虛擬機器啟動時,會載入作業系統,啟動慢,時間基本上是分鐘級

docker 啟動的時候,不需要載入作業系統核心,因此快,時間基本上是秒級

參考資料:

docker docs

歡迎點贊,關注,收藏

朋友們,你的支援和鼓勵,是我堅持分享,提高質量的動力

好了,本次就到這裡

技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。

我是小魔童哪吒,歡迎點贊關注收藏,下次見~

本作品採用《CC 協議》,轉載必須註明作者和本文連結
關注微信公眾號:小魔童哪吒

相關文章