[Docker] Server 從 0 開始建置 Docker 環境

我有一台乾淨的 Linux Server,展示一下想要在這台 Server 使用 Docker 的話要安裝、設置些什麼。

 

 

 

建置環境

Linux OS Version:Ubuntu 20.4

 

 

安裝版本注意事項

如果你的 Linux 是以下的 64 位元 version,安裝請參考 安裝 Docker-ce(new)

  • Ubuntu Kinetic 22.10
  • Ubuntu Jammy 22.04 (LTS)
  • Ubuntu Focal 20.04 (LTS)
  • Ubuntu Bionic 18.04 (LTS)

 

如果你的 Linux 是其他 version,安裝請參考 安裝 Docker.io(舊版)

 

 

安裝 Docker.io(舊版)

如果輸入 docker 相關指令出現 not found 訊息,代表還沒有安裝 Docker

 

使用 apt 安裝 Docker,先更新 sources 的套件資訊 & 索引

sudo apt update
sudo apt-get install docker.io

 

安裝好後,可用以下指令查看安裝的 Docker 服務狀態 (兩個指令用途相同,擇一即可)

systemctl status docker
service docker status

 

 

安裝 Docker-ce(new)

官方教學:Install Docker Engine on Ubuntu | Docker Documentation

如果你的 Server 已經安裝過 old 的 docker.io,請先移除

sudo apt-get remove docker docker-engine docker.io containerd runc

如果出現一些這種 message 不用擔心 👇,就是代表你沒安裝這個套件而已,他才會找不到套件來刪除

E: Unable to locate package docker-engine

 

設置 docker.com 的 repository

docker-ce 會從這個 sources 抓,所以必須設置

 

更新 sources 的套件資訊 & 索引

sudo apt-get update

 

安裝所需套件

sudo apt-get install \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

 

新增 Docker 官方 GPG key

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

 

設置 repository

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

安裝新的 Docker Engine

更新 sources 的套件資訊 & 索引

sudo apt-get update

 

安裝 docker-ce 與其他相關套件

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

 

如果在執行上述指令出現此錯誤  👇 ,代表你沒設置 repository 所以他抓不到,請參考上一個步驟設置完 repository 後,再更新一次 sources 索引,然後再執行一次此 install 指令才可以用

E: Package 'docker-ce' has no installation candidate

(如果你不想用 docker 的 repository 安裝,可以再參考 Install Docker Engine on Ubuntu | Docker Documentation 其他安裝方式)

 

install 完畢後,可以下 docker -v 檢查,如果是移除舊版的安裝,docker-ce 的 version 會比 docker.io 新

 

 

為 Docker 添加權限

下 docker 指令時,若是遇到 permission denied 錯誤

是因為權限問題,docker 指令前面還要再加一個 sudo,像這樣 ⬇ 

sudo docker ps

如果不想要每次加「sudo」,就要再做以下設置

 

建立 Docker Group

如果還沒有 docker group 的話可以用以下指令添加

sudo groupadd docker

不過如果你是用前一個步驟安裝 docker.io 的話,其實他就會幫你自動 add group 'docker' 了 (可以看一下 install docker.io 那張圖的 log)

 

把我的 user 帳戶添加進這個 Docker 群組

sudo usermod -aG docker mmadmin

 

設置完後要重新 Login 才能生效

 

 

設置 Server 的 Proxy

如果使用 curl 指令下載東西時出現 time out ,代表你可能需要設置 proxy 

 

這裡我選擇用永久的全域變數設置方式

 

在 /etc/profile.d 下創建一個 http_proxy.sh 來存全域環境變數

sudo touch /etc/profile.d/http_proxy.sh

 

編輯 http_proxy.sh

sudo vi /etc/profile.d/http_proxy.sh

添加 proxy 設置

export HTTPS_PROXY=http://yourproxy.hostname:3128
export HTTP_PROXY=http://yourproxy.hostname:3128
export https_proxy=http://yourproxy.hostname:3128
export http_proxy=http://yourproxy.hostname:3128

 

上面會發現我大小寫的 HTTP_PROXY http_proxy都有設置,是因為我之前踩到一些坑,發現有些指令只接受大寫的 HTTP_PROXY,有些指令只接受小寫的 http_proxy,所以我的解決方式是大小寫都設置比較保險

延伸閱讀:大小寫 http proxy 的相關討論串
 http proxy - What's the 'right' format for the HTTP_PROXY environment variable? Caps or no caps? - Unix & Linux Stack Exchange

 

讓 Server 重新吃這個設定

source /etc/profile.d/http_proxy.sh

 

查看 env 是否已經有新增的 proxy 環境變數

env | grep -i proxy

 

再下一次 curl 就可以通了

 

 

設置 Docker Proxy

如果無法 pull image,出現以下錯誤,代表還需要設置 docker proxy

Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

 

新增 docker service 用的目錄

sudo mkdir -p /etc/systemd/system/docker.service.d

 

新增 proxy.conf 設置擋

sudo touch /etc/systemd/system/docker.service.d/proxy.conf

 

編輯 proxy.conf 

sudo vi /etc/systemd/system/docker.service.d/proxy.conf

裡面添加 port 為 3128 的 Proxy 的設置

[Service]
Environment="HTTP_PROXY=http://yourproxy.hostname:3128"
Environment="HTTPS_PROXY=http://yourproxy.hostname:3128"

(Docker 就支援大寫的 HTTP_PROXY,這裡放心只設置大寫的就可以了)

 

設置完後要重新載入 Docker Daemon 配置

sudo systemctl daemon-reload

 

重新啟動 Docker

sudo systemctl restart docker.service

 

接下來就能正常 docker pull image 了

 

更多 proxy 設置說明可參考官方 Doc
Control Docker with systemd | Docker Documentation
Configure Docker to use a proxy server | Docker Documentation