解压docker程序

# 二进制包下载地址:https://download.docker.com/linux/static/stable/x86_64/
# wget https://mirrors.ustc.edu.cn/docker-ce/linux/static/stable/x86_64/docker-25.0.3.tgz
​
#解压
tar xf docker-*.tgz 
#拷贝二进制文件
cp docker/* /usr/bin/

创建containerd的service文件

#创建containerd的service文件,并且启动
cat >/etc/systemd/system/containerd.service <<EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target
​
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=1048576
TasksMax=infinity
OOMScoreAdjust=-999
​
[Install]
WantedBy=multi-user.target
EOF
​
# 参数解释:
# 
# [Unit]
# - Description=containerd container runtime:指定服务的描述信息。
# - Documentation=https://containerd.io:指定服务的文档链接。
# - After=network.target local-fs.target:指定服务的启动顺序,在网络和本地文件系统启动之后再启动该服务。
# 
# [Service]
# - ExecStartPre=-/sbin/modprobe overlay:在启动服务之前执行的命令,使用`-`表示忽略错误。
# - ExecStart=/usr/bin/containerd:指定服务的启动命令。
# - Type=notify:指定服务的类型,`notify`表示服务会在启动完成后向systemd发送通知。
# - Delegate=yes:允许服务代理其他服务的应答,例如收到关机命令后终止其他服务。
# - KillMode=process:指定服务终止时的行为,`process`表示终止服务进程。
# - Restart=always:指定服务终止后是否自动重启,`always`表示总是自动重启。
# - RestartSec=5:指定服务重启的时间间隔,单位为秒。
# - LimitNPROC=infinity:限制服务的最大进程数,`infinity`表示没有限制。
# - LimitCORE=infinity:限制服务的最大核心数,`infinity`表示没有限制。
# - LimitNOFILE=1048576:限制服务的最大文件数,指定为1048576。
# - TasksMax=infinity:限制服务的最大任务数,`infinity`表示没有限制。
# - OOMScoreAdjust=-999:指定服务的OOM(Out of Memory)得分,负数表示降低被终止的概率。
# 
# [Install]
# - WantedBy=multi-user.target:指定服务的安装方式,`multi-user.target`表示该服务在多用户模式下安装。
​
​
# 设置开机自启
systemctl enable --now containerd.service

准备docker的service文件

#准备docker的service文件
cat > /etc/systemd/system/docker.service <<EOF
[Unit]
# 描述服务的作用,这里是Docker Application Container Engine,即Docker应用容器引擎
Description=Docker Application Container Engine
# 提供关于此服务的文档链接,这里是Docker官方文档链接
Documentation=https://docs.docker.com
# 说明该服务在哪些其他服务之后启动,这里是在网络在线、firewalld服务和containerd服务后启动
After=network-online.target firewalld.service cri-docker.service docker.socket containerd.service
# 说明该服务想要的其他服务,这里是网络在线服务
Wants=network-online.target
# 说明该服务需要的其他服务,这里是docker.socket和containerd.service
Requires=docker.socket containerd.service
​
[Service]
# 服务类型,这里是notify,表示服务在启动完成时发送通知
Type=notify
# 启动dockerd并指定一些参数,其中-H指定dockerd的监听地址为fd://,--containerd指定containerd的sock文件位置
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
# 重载命令,当接收到HUP信号时执行的命令,这里是/bin/kill -s HUP $MAINPID,即发送HUP信号给主进程ID
ExecReload=/bin/kill -s HUP $MAINPID
# 服务超时时间,这里是0,表示没有超时限制
TimeoutSec=0
# 重启间隔时间,这里是2秒,表示重启失败后等待2秒再重启
RestartSec=2
# 重启策略,这里是always,表示总是重启
Restart=always
# 启动限制次数,这里是3,表示在启动失败后最多重试3次
StartLimitBurst=3
# 启动限制时间间隔,这里是60秒,表示两次启动之间最少间隔60秒
StartLimitInterval=60s
# 文件描述符限制,这里是infinity,表示没有限制
LimitNOFILE=infinity
# 进程数限制,这里是infinity,表示没有限制
LimitNPROC=infinity
# 核心转储限制,这里是infinity,表示没有限制
LimitCORE=infinity
# 最大任务数,这里是infinity,表示没有限制
TasksMax=infinity
# 修改权限,这里是yes,表示启用权限修改
Delegate=yes
# 杀死模式,这里是process,表示杀死整个进程组
KillMode=process
# 用于调整进程在系统内存紧张时的优先级调整,这里是-500,表示将OOM分数降低500
OOMScoreAdjust=-500
​
[Install]
# 指定该服务应该在多用户模式下启动
WantedBy=multi-user.target
EOF

准备docker的socket文件

#准备docker的socket文件
cat > /etc/systemd/system/docker.socket <<EOF
[Unit]
# 描述了该socket的作用,即为Docker API的socket
Description=Docker Socket for the API
​
[Socket]
# 指定了socket的监听地址,该socket会监听在/var/run/docker.sock上,即Docker守护程序使用的默认sock文件
ListenStream=/var/run/docker.sock
# 指定了socket文件的权限模式,此处为0660,即用户和用户组有读写权限,其他用户无权限
SocketMode=0660
# 指定了socket文件的所有者,此处为root用户
SocketUser=root
# 指定了socket文件的所属用户组,此处为docker用户组
SocketGroup=docker
​
[Install]
# 指定了该socket被启用时的目标,此处为sockets.target,表示当sockets.target启动时启用该socket
WantedBy=sockets.target
EOF
​
# 该配置文件的作用是为Docker提供API访问的通道,它监听在/var/run/docker.sock上,具有root用户权限,但只接受docker用户组的成员的连接,并且其他用户无法访问。这样,只有docker用户组的成员可以通过该socket与Docker守护进程进行通信。

配置加速器

# 配置加速器
mkdir /etc/docker/ -pv
cat >/etc/docker/daemon.json <<EOF
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn"
  ],
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker"
}
EOF

启动docker

groupadd docker
#创建docker组
​
systemctl daemon-reload
​
systemctl enable --now docker.socket
# 启用并立即启动docker.socket单元。docker.socket是一个systemd的socket单元,用于接收来自网络的Docker API请求。
​
systemctl enable --now docker.service
# 启用并立即启动docker.service单元。docker.service是Docker守护进程的systemd服务单元。
​
systemctl status docker.service
# 显示docker.service单元的当前状态,包括运行状态、是否启用等信息。
​
docker info
#验证

解压cri-docker

# 由于1.24以及更高版本不支持docker所以安装cri-docker
# 下载cri-docker 
# https://github.com/Mirantis/cri-dockerd/releases/
# wget  https://mirrors.chenby.cn/https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.10/cri-dockerd-0.3.10.amd64.tgz
​
# 解压cri-docker
tar xvf cri-dockerd-*.amd64.tgz 
cp -r cri-dockerd/  /usr/bin/
chmod +x /usr/bin/cri-dockerd/cri-dockerd

写入启动cri-docker配置文件

# 写入启动配置文件
cat >  /usr/lib/systemd/system/cri-docker.service <<EOF
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
​
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
​
[Install]
WantedBy=multi-user.target
EOF

写入cri-docker的socket配置文件

# 写入socket配置文件
cat > /usr/lib/systemd/system/cri-docker.socket <<EOF
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
​
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
​
[Install]
WantedBy=sockets.target
EOF

启动cri-docker

systemctl daemon-reload
# 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
​
systemctl enable --now cri-docker.service
# 启用并立即启动cri-docker.service单元。cri-docker.service是cri-docker守护进程的systemd服务单元。
​
systemctl restart cri-docker.service
# 重启cri-docker.service单元,即重新启动cri-docker守护进程。
​
systemctl status docker.service
# 显示docker.service单元的当前状态,包括运行状态、是否启用等信息。