二進位制安裝 Docker 以及 Docker Compose

ACatSmiling發表於2024-10-18

Author: ACatSmiling

Since: 2024-10-12

Docker 安裝

  1. 官網下載安裝包。(以下示例指令碼為下載最新版 Docker 離線壓縮包,也可以用瀏覽器開啟官網地址直接下載再傳到伺服器。如果使用該指令碼,下面的第 2、3 步可以不執行。)

    #!/bin/bash
    
    set -u
    # docker 官網下載地址
    url='https://download.docker.com/linux/static/stable/x86_64/'
    # 獲取最新版的 docker 包名,地址:https://download.docker.com/linux/static/stable/x86_64/
    tarFile=$(curl -s ${url} | grep -E '.*docker-[0-9]*\.[0-9]*\.[0-9]*\.tgz' | tail -n 1 | awk -F '"' '{print $2}')
    # 拼接完整 url 並下載
    curl -o docker.tgz "${url}${tarFile}"
    
    # 解壓,將壓縮包內的檔案挪到 /usr/local/bin
    tar xf docker.tgz
    mv docker/* /usr/local/bin/
    
    # 建立 docker 的資料目錄
    mkdir -p /home/data/docker
    
    $ sudo bash docker.sh
    
  2. 解壓安裝包,將安裝包內的二進位制程式解壓到/usr/local/bin目錄。

    $ tar xf docker.tgz
    $ mv docker/* /usr/local/bin/
    
  3. 建立 Docker 的資料存放目錄/home/data/docker

    $ mkdir -p /home/data/docker
    
  4. 建立 Docker 的 service 檔案/usr/lib/systemd/system/docker.service

    $ sudo vim /usr/lib/systemd/system/docker.service
    
    [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 --data-root /home/data/docker
    
    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
    
  5. 配置 Docker 的 daemon.json。

    $ sudo vim /etc/docker/daemon.json
    
    {
        "registry-mirrors": [
            "https://dockerproxy.com",
            "https://hub-mirror.c.163.com",
            "https://mirror.baidubce.com",
            "https://ccr.ccs.tencentyun.com"
        ]
    }
    
    • /etc 目錄下可能沒有 docker 目錄和 daemon.json,需要新建。
    • 檢查 daemon.json 檔案的格式:cat /etc/docker/daemon.json | python -m json.tool
  6. 生效配置。

    $ systemctl daemon-reload
    $ systemctl start docker
    $ systemctl enable docker
    
  7. 驗證。

    $ systemctl status docker
    $ docker info
    
  8. 普通使用者如需使用二進位制方式安裝的 Docker,可參考以下步驟,假設普通使用者的使用者名稱為 admin。

    # 1. 建立 docker 使用者組
    $ sudo groupadd docker
    # 2. 將 admin 使用者加到 docker 使用者組
    $ sudo usermod admin -a -G docker
    # 3. 重啟 docker
    $ systemctl restart docker
    # 4. admin 使用者執行 docker 命令進行測試
    
  9. 如果安裝過程中出現錯誤,使用命令檢視詳細的錯誤日誌。

    $ systemctl status docker.service
    $ journalctl -xeu docker | less
    

Docker Compose 安裝

  1. 官網下載二進位制程式包(以下示例指令碼為透過代理站從 GitHub 下載最新版 docker-compose 的安裝包,也可以用瀏覽器直接從瀏覽器下載再傳到伺服器。如果使用該指令碼,下面的第 2、3 步可以不執行。)

    #!/bin/bash
    
    set -eu
    tag=$(curl -s "https://api.github.com/repos/docker/compose/tags" | grep '"name":' | head -n 1 | awk -F '"' '{print $4}')
    
    url="https://github.com/docker/compose/releases/download/${tag}/docker-compose-$(uname -s)-$(uname -m)"
    
    curl -o docker-compose ${url}
    
    chmod +x docker-compose
    
    # 將 docker-compose 挪到 PATH 環境變數的路徑
    mv docker-compose /usr/local/bin/
    
    # 驗證並檢視版本
    docker-compose --version
    
    $ sudo bash docker-compose.sh
    
  2. 重新命名為 docker-compose,並移到/usr/local/bin

  3. 驗證。

如果指令碼執行異常,下載的 docker-compose 安裝包不正確,可以手動安裝。(因為下載地址是 GitHub,如果沒有配置代理,下載速度會很慢,甚至失敗。)

# 1. 檢視最新版本
$ curl -s "https://api.github.com/repos/docker/compose/tags" | grep '"name":' | head -n 1 | awk -F '"' '{print $4}'

# 2. 下載,如需下載其他版本,替換 v2.24.7 為最新的版本號即可
$ sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.7/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 3. 賦予二進位制檔案可執行許可權
$ sudo chmod +x /usr/local/bin/docker-compose

Docker 配置 clash 代理

國內映象源偶爾會出現不能使用的情況,在已有代理的情況下,按如下方式配置:

# 1. 編輯 daemon.json 檔案,新增代理,192.168.1.17:7890 是宿主機區域網中的代理伺服器地址(國內映象源的配置需要刪除)
$ vim /etc/docker/daemon.json 
{
    "proxies": {
        "http-proxy": "http://192.168.1.17:7890",
        "https-proxy": "http://192.168.1.17:7890"
    }
}

# 2. 生效配置
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

代理配置完成後,需要設定防火牆的入站規則,否則可能出現無法拉取映象,宿主機也無法 ping 通虛擬機器的情況。

image-20240621234809771

image-20240622001039962

安裝指令碼

#!/bin/bash
# description:國內聯網情況下透過 Docker 二進位制包安裝 Docker 和 docker-compose

set -u
dataDir='/home/apps/docker'

downloadDocker(){
 # Docker 官網下載地址
 local url='https://download.docker.com/linux/static/stable/x86_64/'
 # 獲取最新版的 Docker 包名
 local tarFile=$(curl -s ${url} | grep -E '.*docker-[0-9]*\.[0-9]*\.[0-9]*\.tgz' | tail -n 1 | awk -F '"' '{print $2}')
 # 拼接完整 url 並下載
 curl -s -o docker.tgz "${url}${tarFile}"

 # 解壓,將壓縮包內的檔案挪到 /usr/local/bin
 tar xf docker.tgz
 mv docker/* /usr/local/bin/

 # 建立 Docker 的資料目錄
 mkdir -p ${dataDir}
 echo -e "\n\t>>> docker data dir: ${dataDir} <<<\n"

 # (可選)建立 Docker 使用者組
 groupadd docker
}

downloadDockerCompose() {
 # 獲取最新版 tag
 local tag=$(curl -s "https://api.github.com/repos/docker/compose/tags" | grep '"name":' | head -n 1 | awk -F '"' '{print $4}')
 # 透過 ghproxy 的代理拼接下載 url
 local url="https://ghproxy.com/https://github.com/docker/compose/releases/download/${tag}/docker-compose-linux-x86_64"

 curl -s -o docker-compose ${url}
 chmod +x docker-compose
 mv docker-compose /usr/local/bin
}

createSystemConfig() {
 cat > 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
ExecStart=/usr/local/bin/dockerd --data-root ${dataDir}

ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity

#TasksMax=infinity
TimeoutStartSec=0

Delegate=yes

KillMode=process

Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s

[Install]
WantedBy=multi-user.target
EOF
 mv docker.service /etc/systemd/system/

 systemctl daemon-reload
 systemctl start docker
 systemctl enable docker
}

# 生成 Docker 的配置檔案
createDockerConfig() {
 if [ ! -d "/etc/docker" ]; then
     echo -e "\n\t>>> /etc/docker is not exist. <<<\n"
     return
 fi

 if [ -f "/etc/docker/daemon.json" ]; then
     echo -e "\n\t>>> /etc/docker/daemon.json is exist. <<<\n"
     return
 fi

 cat > /etc/docker/daemon.json <<EOF
{
 "log-driver": "json-file",
 "log-level": "warn",
 "log-opts": {
     "max-size": "100m"
 }
}
EOF
 systemctl daemon-reload
 systemctl restart docker
}

main() {
 # 檢測當前使用者是否為 root 使用者
 if [ $(whoami) != 'root' ]; then
     echo -e "\n\t>>> Please use \033[31mroot\033[0m privilege to run this script. <<<\n"
     exit 1
 fi

 # 檢測 Docker 是否已安裝
 docker --version > /dev/null 2>&1
 if [ $? -eq 0 ]; then
     echo -e "\n\t\033[31m>>> Docker is already installed. <<<\033[0m"
     echo -e "\t\033[31m>>> If you want to reinstall, please uninstall it first. <<<\033[0m\n"
     exit 1
 fi

 downloadDocker
 downloadDockerCompose
 createSystemConfig
 createDockerConfig
}

main

相關文章