Docker 知識梳理及其安裝使用

讲文张字發表於2024-09-09

Docker 介紹

Docker 是一個強大的工具,用於高效開發、打包和部署應用程式。Docker 是一種容器管理服務。Docker 於 2013 年釋出。它是開源的,可用於 Windows、macOS 和 Linux 等不同平臺。Docker 正在快速交付、測試和部署程式碼。這樣可以減少編寫程式碼和在生產環境中執行程式碼之間的延遲。您可以建立稱為容器的自包含環境。它可以在不同的平臺上一致地執行。

Docker 是一組平臺即服務 (PaaS) 產品,它使用作業系統級虛擬化以稱為容器的包的形式交付軟體。容器彼此隔離,並捆綁自己的軟體、庫和配置檔案;他們可以透過定義明確的渠道相互通訊。所有容器都由單個作業系統核心執行,因此使用的資源比虛擬機器少。

Docker 是一個開源 容器化 平臺,透過該平臺,您可以將應用程式及其所有依賴項打包到一個稱為容器的標準化單元中。容器重量輕,這使得它們具有可移植性,並且它們與底層基礎設施和其他容器隔離。您可以在任何安裝了 docker 的計算機上將 docker 映象 作為 docker 容器執行,而無需依賴 作業系統。

為什麼 Docker 很受歡迎?

Docker 因其對軟體開發和部署的影響而廣受歡迎。以下是 docker 流行的一些主要原因:

  • 可移植性: Docker 有助於開發人員將其應用程式與所有依賴項打包到單個輕量級容器中。它有助於確保不同計算環境中的效能一致。
  • 可重複性: 透過將應用程式及其依賴項封裝在一個容器中,它可以確保軟體設定在開發、測試和生產環境中保持一致。
  • 效率: Docker 透過其基於容器的架構最佳化了資源利用率。它允許開發人員在單個主機系統上執行多個隔離的應用程式。
  • 可擴充套件性: Docker 的可擴充套件性功能有助於開發人員在工作負載增加時更輕鬆地處理他們的應用程式。

Docker 的關鍵元件

以下是 Docker 的一些關鍵元件:

  • Docker Engine: 它是 Docker 的核心部分,用於處理容器的建立和管理。
  • Docker Image: 它是一個只讀模板,用於建立容器,包含應用程式程式碼和依賴項。
  • Docker Hub: 它是一個基於雲的儲存庫,用於查詢和共享容器映像。
  • Dockerfile: 這是一個指令碼,其中包含構建 docker 映象的說明。
  • Docker Registry :它是 docker 映象的儲存分發系統,您可以在其中以公共和私有模式儲存映象。

Docker 架構以及 Docker 的工作原理?

Docker 使用客戶端-伺服器架構。Docker 客戶端與 docker 守護程式通訊,這有助於構建、執行和分發 docker 容器。Docker 客戶端與守護程式在同一系統上執行,或者我們可以遠端將 Docker 客戶端與 Docker 守護程式連線。在 UNIX 套接字或網路上的 REST API 的幫助下,docker 客戶端和守護程式可以相互互動。

Docker Daemon

Docker 守護程式透過與其他守護程式通訊來管理所有服務。它藉助 Docker 的 API 請求管理 Docker 物件,例如映像、容器、網路和卷。

Docker Client

在 docker 客戶端的幫助下,docker 使用者可以與 docker 互動。docker 命令使用 Docker API。Docker 客戶端可以與多個守護程式通訊。當 docker 客戶端在 docker 終端上執行任何 docker 命令時,終端會向守護程序傳送指令。Docker 守護程式從命令形狀和 REST API 請求內的 docker 客戶端獲取這些指令。

docker 客戶端的主要目標是提供一種方法來指導從 docker 登錄檔中提取映象並在 docker 主機上執行它們。客戶端使用的常用命令是 docker build、docker pull 和 docker run。

Docker Host

Docker 主機是一種負責執行多個容器的機器。它包括 Docker 守護程式、映像、容器、網路和儲存。

Docker Registry

所有 docker 映象都儲存在 docker 登錄檔中。有一個公共登錄檔,稱為 docker hub,任何人都可以使用。我們也可以執行我們的私有登錄檔。在 docker run 或 docker pull 命令的幫助下,我們可以從配置的登錄檔中提取所需的映象。在 docker push 命令的幫助下,映象被推送到配置的登錄檔中。

Docker Objects

每當我們使用 docker 時,我們都會建立和使用映象、容器、卷、網路和其他物件。現在,我們將討論 docker 物件:-

Docker Images

映象包含建立 Docker 容器的說明。它只是一個只讀模板。它用於儲存和交付應用程式。映像是 docker 體驗的重要組成部分,因為它們以以前無法實現的任何方式支援開發人員之間的協作。

Docker Containers

容器是從 docker 映象建立的,因為它們是現成的應用程式。在 Docker API 或 CLI 的幫助下,我們可以啟動、停止、刪除或移動容器。容器只能訪問映像中定義的那些資源,除非在容器中構建映像期間定義了其他訪問許可權。

Docker Storage

我們可以將資料儲存在容器的可寫層中,但它需要一個儲存驅動程式。儲存驅動程式控制和管理 Docker 主機上的映象和容器。

以下是 Docker 中常見的資料持久化方法:

  • 資料卷(Volumes):資料卷是一種特殊的目錄,可以繞過容器檔案系統並將資料儲存在宿主機上。資料卷可以被一個或多個容器共享,並且在容器之間持久存在。使用資料卷可以方便地備份、恢復和遷移資料。
  • 繫結掛載(Bind Mounts):繫結掛載允許將宿主機上的檔案或目錄直接掛載到容器中。這樣,容器可以訪問宿主機檔案系統中的資料,並且對資料的修改也會反映到宿主機上。
  • 命名卷(Named Volumes):命名卷是一種具有名稱的資料卷,可以在多個容器之間共享,並且可以方便地管理和使用。透過為卷指定名稱,可以在建立容器時直接引用該名稱,並且 Docker 會自動建立和管理卷。
  • 資料卷容器(Data Volume Containers):資料卷容器是一種特殊型別的容器,用於儲存和管理資料卷。其他容器可以透過 --volumes-from 選項掛載這些資料卷容器,從而實現資料的共享和持久化。

Docker 網路

Docker 網路為 Docker 容器提供完全隔離。這意味著使用者可以將 docker 容器連結到多個網路。它需要的作業系統例項非常少來執行工作負載。

網路模式說明

網路模式 配置 說明
bridge --network=bridge 為每個容器分配 IP 。並將容器連線到 docker0 虛擬網橋上,這種模式是預設模式
host --network=host 容器不會建立自己的網路卡,配置 IP 等,而是使用宿主機的 IP 和埠
none --network=none 容器關閉網路功能,不進行任何網路設定
container --network=container 容器不會建立自己的網路卡和IP,而是和一個指定的容器共享 IP 和埠
custom --network=new_bridge 為每個容器分配 IP 。並將容器連線到自定義的虛擬網橋上

Docker 安裝方式

準備環境

系統要求:Docker 支援 64 位版本 CentOS 7/8,並且要求核心版本不低於 3.10。 CentOS 7 滿足最低核心的要求,但由於核心版本比較低,部分功能(如 overlay2 儲存層驅動)無法使用,並且部分功能可能不太穩定。

如需升級 Linux 核心參考《CentOS 7 核心升級最新記錄(yum及編譯)

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)
[root@localhost ~]# uname -r
3.10.0-1160.el7.x86_64

[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i.bak '7s/enforcing/disabled/' /etc/selinux/config

[root@localhost ~]# swapoff -a
[root@localhost ~]# sed -ri.bak 's/.*swap.*/#&/' /etc/fstab

[root@localhost ~]# systemctl stop firewalld && systemctl disable firewalld
[root@localhost ~]# firewall-cmd --state
not running

# 更換阿里源
[root@localhost ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
[root@localhost ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
[root@localhost ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 

線上 YUM 安裝

時間:2024-09

# 解除安裝舊版本
[root@localhost ~]# yum remove docker docker-client docker-client-latest docker-common docker-latest \
docker-latest-logrotate docker-logrotate docker-selinux docker-engine-selinux docker-engine

# 安裝所需的軟體包。yum-utils 提供了 yum-config-manager
[root@localhost ~]# yum install -y yum-utils

# 新增 yum 軟體源(三選一)
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo  # 阿里源

yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo  # 清華大學源

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo   # 官方源(較慢)

# 列出儲存庫中可用的版本。按版本號(從高到低)
[root@localhost ~]# yum list docker-ce --showduplicates | sort -r
 * updates: mirrors.aliyun.com
Loading mirror speeds from cached hostfile
Loaded plugins: fastestmirror
 * extras: mirrors.aliyun.com
docker-ce.x86_64            3:26.1.4-1.el7                      docker-ce-stable
docker-ce.x86_64            3:26.1.3-1.el7                      docker-ce-stable
docker-ce.x86_64            3:26.1.2-1.el7                      docker-ce-stable
docker-ce.x86_64            3:26.1.1-1.el7                      docker-ce-stable
docker-ce.x86_64            3:26.1.0-1.el7                      docker-ce-stable
docker-ce.x86_64            3:26.0.2-1.el7                      docker-ce-stable
docker-ce.x86_64            3:26.0.1-1.el7                      docker-ce-stable
docker-ce.x86_64            3:26.0.0-1.el7                      docker-ce-stable
docker-ce.x86_64            3:25.0.5-1.el7                      docker-ce-stable
docker-ce.x86_64            3:25.0.4-1.el7                      docker-ce-stable
docker-ce.x86_64            3:25.0.3-1.el7                      docker-ce-stable
docker-ce.x86_64            3:25.0.2-1.el7                      docker-ce-stable
docker-ce.x86_64            3:25.0.1-1.el7                      docker-ce-stable
docker-ce.x86_64            3:25.0.0-1.el7                      docker-ce-stable
docker-ce.x86_64            3:24.0.9-1.el7                      docker-ce-stable
docker-ce.x86_64            3:24.0.8-1.el7                      docker-ce-stable

# 安裝最新版本
[root@localhost ~]# yum install docker-ce docker-ce-cli containerd.io

# 若選擇版本安裝 例如docker-ce-24.0.9
yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io

# 若選擇測試版本的 Docker 請執行以下命令
yum-config-manager --enable docker-ce-test

# 驗證
[root@localhost ~]# docker -v
Docker version 26.1.4, build 5650f9b

# 新增國內映象加速(每次修改需重啟 docker)
[root@localhost ~]# cat > /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": [
        "https://mirror.baidubce.com",
        "https://mirror.ccs.tencentyun.com",
        "https://wxvmh7l6.mirror.aliyuncs.com",
        "https://hub.atomgit.com",
        "https://registry.docker-cn.com",
        "https://mirrors.tuna.tsinghua.edu.cn",
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"
    ]
}
EOF

# 啟動
[root@localhost ~]# systemctl daemon-reload && systemctl start docker

# 測試 Docker 是否安裝正確
[root@localhost ~]# docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d195baed67eb: Pull complete
Digest: sha256:be06e3c4ce8780c0f87fbf66ec9b34623ba2fd14caa5559be5b593653821b814
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/

若能正常輸出以上資訊,則說明安裝成功。

二進位制離線安裝

時間:2024-09

下載 Docker 地址

  • 阿里地址【https://mirrors.aliyun.com/docker-ce
  • 清華大學地址【https://mirrors.tuna.tsinghua.edu.cn/docker-ce
  • 官方地址【https://download.docker.com

# 下載 Docker docker-23.0.6.tgz 為例 (當前最新版本 docker-27.2.0.tgz)
[root@localhost ~]# wget https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-23.0.6.tgz
[root@localhost ~]# tar -xf docker-23.0.6.tgz
[root@localhost ~]# cp docker/* /usr/local/bin/

[root@localhost ~]# docker -v
Docker version 23.0.6, build ef23cbc
[root@localhost ~]# docker -h

# 將docker註冊為 Systemd 的 service
[root@localhost ~]# cat > /etc/systemd/system/docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
  
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/local/bin/dockerd -H unix:///var/run/docker.sock --selinux-enabled=false --default-ulimit nofile=65536:65536
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
  
[Install]
WantedBy=multi-user.target

EOF


# 如果需要開啟遠端服務ExecStart屬性修改為以下命令:
ExecStart=/usr/local/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --selinux-enabled=false --default-ulimit nofile=65536:65536
# -H tcp://0.0.0.0:2375 開啟遠端連線命令

# 新增檔案可執行許可權
[root@localhost ~]# chmod +x /etc/systemd/system/docker.service

# 新增國內映象加速(每次修改需重啟 docker)
[root@localhost ~]# mkdir /etc/docker
[root@localhost ~]# cat > /etc/docker/daemon.json <<EOF
{
    "registry-mirrors": [
        "https://mirror.baidubce.com",
        "https://mirror.ccs.tencentyun.com",
        "https://wxvmh7l6.mirror.aliyuncs.com",
        "https://hub.atomgit.com",
        "https://registry.docker-cn.com",
        "https://mirrors.tuna.tsinghua.edu.cn",
        "http://hub-mirror.c.163.com",
        "https://docker.mirrors.ustc.edu.cn"
    ]
}
EOF

# 啟動
[root@localhost ~]# systemctl daemon-reload && systemctl start docker

# 測試 Docker 是否安裝正確
[root@localhost ~]# docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d195baed67eb: Pull complete
Digest: sha256:be06e3c4ce8780c0f87fbf66ec9b34623ba2fd14caa5559be5b593653821b814
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/

若能正常輸出以上資訊,則說明安裝成功。

Docker 常用命令

相關文章