跳转至

Docker

在线脚本安装(官方脚本)

官方脚本支持的发行版有限,常见的 Debian/Ubuntu,红帽系仅有 RHEL/CentOS。

docker-ce

sudo apt insatll curl
###下载官方脚本
sudo curl -fsSL https://get.docker.com -o get-docker.sh
###阿里云源
sudo DOWNLOAD_URL=https://mirrors.aliyun.com/docker-ce sh get-docker.sh
###ustc源自动安装(不支持过时的系统)
sudo DOWNLOAD_URL=https://mirrors.ustc.edu.cn/docker-ce sh get-docker.sh

docker-compose

在线安装 docker-ce 的脚本已包含,一般情况无需额外安装。

dnf install docker-compose-plugin -y
apt insatll docker-compose-plugin -y

手动配置源安装(阿里云源)

适用于 Rocky Linux。可参考阿里云官方文档:https://help.aliyun.com/zh/ecs/use-cases/install-and-use-docker-on-a-linux-ecs-instance

###添加源:官方
#sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
###添加源:阿里云
sudo dnf config-manager --add-repo=https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
###安装
sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
###启动
sudo systemctl start docker
sudo systemctl enable docker

开启远程 API

Docker 的远程 API 使用 http 通信,存在安全隐患,网上不乏恶意程序通过此端口获取到 Docker 主机 root 权限的案例。

所以推荐在仅内网环境下开启。如果需要使用 Portainer 之类的第三方工具管理 Docker,请优先考虑安装 portainer-agent 之类的代理容器,或使用 https。

配置(手动)

#### 打开docker的systemd服务注册文件
sudo nano /lib/systemd/system/docker.service

#### 找到[Service]下面的(修改前)
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
#### 改为如下(修改后)
ExecStart=/usr/bin/dockerd  -H fd:// -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock

sudo systemctl daemon-reload          # 重新加载守护进程配置
sudo systemctl restart docker.service # 重启 docker 服务

Shell 脚本(自动化)

每次使用包管理器升级 docker 后,配置都会重置,需要重新添加。这里提供一个 Shell 脚本用于定时作业自动化执行,减少繁琐的手动配置。

Shell 脚本内容如下:

docker_api_enable.sh
if test -z "$(cat /usr/lib/systemd/system/docker.service | grep 2375)"; #判断是否不存在关键字2375
then
    echo "不存在关键字2375,执行自动添加。"
    sudo sed -i 's#ExecStart=.*#ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --containerd=/run/containerd/containerd.sock#' /usr/lib/systemd/system/docker.service
    sudo systemctl daemon-reload          # 重新加载守护进程配置
    sudo systemctl restart docker.service # 重启 docker 服务
    echo "不存在关键字2375,自动添加、重启服务完成。"
else
  echo "存在关键字2375,结束。"
fi

这里使用 1Panel 的计划任务功能实现定时作业,如下图:OS_UPDATE为每月一次的自动更新系统,ENABLE_DOCKER_API放在其之后执行。

https://cdn.jsdelivr.net/gh/dsf1995cn/PicHub@main/imgs/Snipaste_2024-04-27_15-32-02.png

添加私有仓库(http)

docker 默认需要使用 https,如果直接docker login XXX登录 http 协议的私有仓库会报错:

dsf@jump-server:~# docker login reg.proxy.onehat.cn
Username: admin
Password: 
Error response from daemon: Get "https://reg.proxy.onehat.cn/v2/": remote error: tls: unrecognized name

需要修改配置文件,添加可信仓库insecure-registries

sudo nano /etc/docker/daemon.json
/etc/docker/daemon.json
{
        "exec-opts": [
                "native.cgroupdriver=systemd"
        ],
        "registry-mirrors": [
                "https://dockerproxy.com",
                "https://docker.mirrors.sjtug.sjtu.edu.cn"
        ], 
        "insecure-registries": [
                 "reg.proxy.onehat.cn"
        ]
}

修改完成后重启 docker 服务生效。

sudo service docker restart

启用网络代理

创建 dockerd 相关的 systemd 目录,这个目录下的配置将覆盖 dockerd 的默认配置

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

新建配置文件 /etc/systemd/system/docker.service.d/http-proxy.conf,这个文件中将包含环境变量,如果你自己建了私有的镜像仓库,需要 dockerd 绕过代理服务器直连,那么配置 NO_PROXY 变量。多个 NO_PROXY 变量的值用逗号分隔,而且可以使用通配符(*),极端情况下,如果 NO_PROXY=*,那么所有请求都将不通过代理服务器。

sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf
/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.168.31.221:7890"
Environment="HTTPS_PROXY=http://192.168.31.221:7890"
Environment="NO_PROXY=*.proxy.onehat.cn"

重新加载配置文件,重启 dockerd

sudo systemctl daemon-reload
sudo systemctl restart docker

检查确认环境变量已经正确配置:

╭─dsf@jump-server ~ 
╰─$ sudo systemctl show --property=Environment docker           
Environment=HTTP_PROXY=http://192.168.31.221:7890 HTTPS_PROXY=http://192.168.31.221:7890 "NO_PROXY=*.proxy.onehat.cn"