3.4 CentOS
CentOS (及其替代品 Rocky Linux、AlmaLinux) 是企業級伺服器常用的作業系統。本節介紹在這些系統上安裝 Docker 的步驟。
企業級部署的版本選擇
值得注意的是,CentOS 8 已停止維護,CentOS 7 已停止支援。如果你正在規劃新的生產部署,強烈建議選擇 Rocky Linux 或 AlmaLinux——這兩個專案是由社群維護的 CentOS 替代品,延續了 CentOS 的企業級屬性,同時提供了更長的生命週期承諾。選擇穩定的基礎系統,才能為 Docker 的長期運維奠定堅實基礎。
警告:切勿在沒有設定 Docker YUM 源的情況下直接使用 yum 指令安裝 Docker。
3.4.1 準備工作
安裝前請確認系統版本和核心版本滿足 Docker 的執行要求。
系統要求
嚴重警告:CentOS 7 已於 2024 年 6 月 30 日結束所有支援,不再接收任何安全更新。CentOS 8 已於 2021 年 12 月 31 日停止維護。強烈建議新專案使用 Rocky Linux 或 AlmaLinux 替代,這兩個專案由社群維護,提供長期支援承諾。
Docker 官方當前安裝文件覆蓋的 CentOS 平台為 CentOS Stream 9 和 CentOS Stream 10(具體以官方 安裝文件 為準)。Rocky Linux、AlmaLinux 等 RHEL 相容發行版通常可以沿用相近步驟,但建議先在測試環境驗證倉庫與依賴是否對應。
對於 Rocky Linux、AlmaLinux 或 CentOS Stream,推薦使用 dnf 套件管理器。
解除安裝舊版本
舊版本的 Docker 稱為 docker 或者 docker-engine,使用以下指令解除安裝舊版本:
$ sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine \
docker-ce-cli \
containerd.io
3.4.2 使用 yum 安裝
使用 yum/dnf 安裝是管理 Docker 生命週期的標準方式。
執行以下指令安裝依賴套件:
$ sudo dnf install -y dnf-plugins-core
預設建議優先使用 Docker 官方倉庫;如果企業內網維護了受信任映象站,可自行替換倉庫 URL。
執行下面的指令新增 yum 軟體源:
$ sudo dnf config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
如果需要測試版本的 Docker 請執行以下指令:
$ sudo dnf config-manager --set-enabled docker-ce-test
安裝 Docker
更新 dnf 軟體源快取,並安裝 Docker Engine 及常用 CLI 外掛。
$ sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3.4.3 防火牆注意事項
Docker 官方提醒:如果主機使用 ufw 或 firewalld 管理防火牆,容器暴露出的連接埠可能繞過現有規則;同時 Docker 僅相容 iptables-nft 和 iptables-legacy,不支援直接由 nft 建立的規則集。
因此,生產環境中更穩妥的做法是:
- 明確使用
iptables-nft或iptables-legacy維護規則; - 需要限制容器流量時,優先把自定義規則寫入
DOCKER-USER鏈; - 在變更防火牆策略前,先用測試容器驗證連接埠暴露和東西向流量是否符合預期。
3.4.4 使用指令碼自動安裝
在測試或開發環境中,Docker 官方提供了便捷安裝指令碼,但官方明確不建議把它作為生產環境的標準安裝方式。
在真正執行前,建議先用 --dry-run 預覽指令碼動作:
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh ./get-docker.sh --dry-run
# 若需要測試頻道:
# curl -fsSL https://test.docker.com -o test-docker.sh
# sudo sh ./test-docker.sh
確認無誤後,再執行 sudo sh ./get-docker.sh 安裝穩定版。
3.4.5 啟動 Docker
$ sudo systemctl enable --now docker
3.4.6 建立 docker 使用者組
預設情況下,docker 指令會使用 Unix socket 與 Docker 引擎通訊。而只有 root 使用者和 docker 組的使用者才可以訪問 Docker 引擎的 Unix socket。出於安全考慮,一般 Linux 系統上不會直接使用 root 使用者。因此,更好的做法是將需要使用 docker 的使用者加入 docker 使用者組。
⚠️ 安全警告:
docker使用者組等同於root許可權將使用者加入
docker組免去了每次執行docker指令時輸入sudo的繁瑣,但這也意味著該使用者可以輕易獲取主機的最高 root 許可權(例如透過掛載根目錄執行容器)。 如果你在一個多使用者共享的生產系統上設定,切勿隨意將普通使用者加入此組。此時,更安全的替代方案是使用官方提供的 Rootless 模式 (Rootless mode),它允許在沒有任何 root 許可權的情況下執行 Docker 守護程序和容器。
建立 docker 組:
$ sudo groupadd docker
將當前使用者加入 docker 組:
$ sudo usermod -aG docker $USER
退出當前終端並重新登入,進行如下測試。
3.4.7 測試 Docker 是否安裝正確
$ docker run --rm hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:308866a43596e83578c7dfa15e27a73011bdd402185a84c5cd7f32a88b501a24
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/
若能正常輸出以上訊息,則說明安裝成功。
3.4.8 映象加速
如果在使用過程中發現拉取 Docker 映象十分緩慢,可以設定 Docker 國內映象加速。
3.4.9 新增核心引數
如果在 CentOS 使用 Docker 看到下面的這些警告訊息:
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
請新增核心設定引數以啟用這些功能。
$ sudo tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
然後重新載入 sysctl.conf 即可
$ sudo sysctl -p