kubernetes docker 运行时安装与配置

kubernetes1.24 以前版本 通过docker运行时调用containerd 来管理容器的,使用docker 运行时依赖containerd

启动顺序 containerd==> docker.socket ==>docker-ce

一、kubernetes 离线安装docker 运行时

1. 下载安装docker-ce

  1. 下载安装包
下载地址:https://download.docker.com/linux/static/stable/x86_64
wget https://download.docker.com/linux/static/stable/x86_64/docker-28.0.1.tgz
tar -zxvf docker-28.0.1.tgz

ls docker
containerd  containerd-shim-runc-v2  ctr  docker  dockerd  docker-init  docker-proxy  runc

mv docker/* /usr/bin/
groupadd docker
useradd -g docker docker  -s /usr/sbin/nologin

2. 配置containerd

  1. systemctl 配置
cat >/lib/systemd/system/containerd.service<<EOF

# Copyright The containerd Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target dbus.service

[Service]
#uncomment to enable the experimental sbservice (sandboxed) version of containerd/cri integration
#Environment="ENABLE_CRI_SANDBOXES=sandboxed"
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd

Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=infinity
# Comment TasksMax if your systemd version does not supports it.
# Only systemd 226 and above support this version.
TasksMax=infinity
OOMScoreAdjust=-999

[Install]
WantedBy=multi-user.target
EOF
  1. 启动
systemctl start containerd
systemctl status containerd
systemctl enable containerd

3. 配置docker

  1. 配置docker socket
cat >/lib/systemd/system/docker.socket<<EOF

[Unit]
Description=Docker Socket for the API

[Socket]
# If /var/run is not implemented as a symlink to /run, you may need to
# specify ListenStream=/var/run/docker.sock instead.
ListenStream=/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker

[Install]
WantedBy=sockets.target
EOF

2 配置docker

cat >/lib/systemd/system/docker.service<<EOF

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target docker.socket firewalld.service containerd.service time-set.target
Wants=network-online.target containerd.service
Requires=docker.socket

[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/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP \$MAINPID
TimeoutStartSec=0
RestartSec=2
Restart=always

# Note that StartLimit* options were moved from "Service" to "Unit" in systemd 229.
# Both the old, and new location are accepted by systemd 229 and up, so using the old location
# to make them work for either version of systemd.
StartLimitBurst=3

# Note that StartLimitInterval was renamed to StartLimitIntervalSec in systemd 230.
# Both the old, and new name are accepted by systemd 230 and up, so using the old name to make
# this option work for either version of systemd.
StartLimitInterval=60s

# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNPROC=infinity
LimitCORE=infinity

# Comment TasksMax if your systemd version does not support it.
# Only systemd 226 and above support this option.
TasksMax=infinity

# 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
OOMScoreAdjust=-500

[Install]
WantedBy=sockets.target
EOF
  1. 启动服务
systemctl start docker
systemctl status docker
systemctl enable docker
  1. systemctl 配置说明

After=network-online.target docker.socket firewalld.service containerd.service time-set.target
Wants=network-online.target containerd.service

After:定义启动顺序,确保 Docker 在以下服务之后启动:
network-online.target:网络可用。
docker.socket:Docker socket 已准备。
firewalld.service:防火墙服务(可选)。
containerd.service:containerd 运行时(Docker 依赖它)。
time-set.target:系统时间已同步(可选)。
Wants:弱依赖关系,即使这些服务失败,Docker 仍会启动,但建议它们正常运行

Requires=docker.socket
Requires:强依赖关系,如果 docker.socket 未启动,Docker 服务将失败。
必要性:Docker 需要通过 socket 接收 API 请求,因此必须确保 socket 可用。

  1. 配置docker http/https代理(可选)

squid 代理地址: 172.16.0.101:11080

 mkdir -p /usr/lib/systemd/system/docker.service.d

vi  /usr/lib/systemd/system/docker.service.d/http_proxy.conf
[Service]
Environment="HTTP_PROXY=http://172.16.0.101:11080" "HTTPS_PROXY=http://172.16.0.101:11080" "NO_PROXY=localhost,127.0.0.1,172.16.0.101,registry.iotcloud.wl"
  1. 配置docker 镜像仓库
mkdir -p /etc/docker
cat >/etc/docker/daemon.json<<EOF
{
  "log-driver": "json-file",
  "log-opts": {"max-size":"200m", "max-file":"5"},
  "data-root": "/var/lib/docker",
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "http://hub-mirror.c.163.com",
    "https://reg-mirror.qiniu.com",
    "https://lwqjc7mq.mirror.aliyuncs.com",
    "https://registry.docker-cn.com",
    "https://reg-mirror.qiniu.com",
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com"
  ],
  "insecure-registries": [
    "registry.iotcloud.wl:5000",
    "registry.iotcloud.wl:8090",
    "registry.iotcloud.wl:443",
    "registry.iotcloud.wl"
  ]
}
EOF
  1. 验证配置

重载配置

systemctl daemon-reload
systemctl reload docker

docker info

 Insecure Registries:
  registry.iotcloud.wl:8090
  registry.iotcloud.wl
  registry.iotcloud.wl:443
  registry.iotcloud.wl:5000
  ::1/128
  127.0.0.0/8
 Registry Mirrors:
  http://hub-mirror.c.163.com/
  https://reg-mirror.qiniu.com/
  https://lwqjc7mq.mirror.aliyuncs.com/
  https://registry.docker-cn.com/
  https://docker.m.daocloud.io/
  https://dockerproxy.com/
 Live Restore Enabled: false
 Product License: Community Engine
  1. docker 插件安装

对于离线安装 需要单独配置

1. 下载
https://github.com/docker/buildx/releases/download/v0.26.1/buildx-v0.26.1.linux-amd64

mv buildx-v0.26.1.linux-amd64 /usr/bin/docker-buildx
chmod +x /usr/bin/docker-buildx

2. 安装并验证 Docker Buildx
将 docker-buildx 移动到 Docker 插件目录:

mkdir -p ~/.docker/cli-plugins
ln -s /usr/bin/docker-buildx ~/.docker/cli-plugins/docker-buildx

docker buildx version
  1. docker 解压包说明

root@k8s-master01:~# ls docker

containerd  containerd-shim-runc-v2  ctr  docker  dockerd  docker-init  docker-proxy  runc
  • containerd 是一个核心组件,是 Docker 的运行时管理器。它负责管理容器的生命周期,包括创建、运行、暂停、删除等操作。
  • containerd-shim 是一个轻量级进程,用于在容器与 containerd 之间进行通信和协调。它帮助
    containerd 启动和管理容器进程。
  • containerd-shim-runc-v2 是使用 runc 运行时的
    containerd-shim 的版本。runc 是一个符合 OCI(Open Container
    Initiative)规范的轻量级容器运行时。 ctr 是一个命令行工具,用于与 containerd
    通信和管理容器、镜像等资源。它提供了一个简单的方式来执行 containerd API 操作。
  • docker 是 Docker
    的客户端命令行工具,用于与 Docker 守护进程(dockerd)通信,管理 Docker 容器、镜像、网络等资源。
  • dockerd 是 Docker 的守护进程,负责管理 Docker 的核心功能,包括监听 Docker API
    请求、创建和管理容器、存储卷、网络等。 docker-init
    是一个初始化进程,用于在启动容器时设置容器环境并执行预定义的初始化任务。
  • docker-proxy 是一个用于代理 Docker
    容器网络流量的工具,帮助容器与外部网络进行通信。 runc 是一个符合 OCI 规范的轻量级容器运行时,用于启动和运行容器进程,是
    containerd-shim 使用的容器运行时之一

已上是docker 使用二进制安装方法,适用离线部署,若在线安装请使用以下部署

二、kubernetes 在线安装docker 运行时

centos7

1. 配置源
cd /etc/yum.repos.d ; mkdir bak; mv CentOS-Linux-* bak/
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y install yum-utils wget device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.rep
2.  安装 
yum install -y docker-ce  
或  yum install -y docker-ce docker-ce-cli containerd.io

3.  启动
systemctl start docker

4. 镜像仓库及代理配置如上

ubuntu24

1. 配置源
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/containerd.list
apt update

2. 安装 
sudo apt-get -y install docker-ce containerd.io

安装docker-ce时依赖安装以下工具
docker-compose-plugin
docker-ce-rootless-extras
docker-ce-cli
docker-buildx-plugin
containerd.io
docker-ce 

3. 安装指定版本的docker-ce:
Step 1: 查找Docker-CE的版本:
apt-cache madison docker-ce
Step 2: 安装指定版本的Docker-CE: (VERSION例如上面的17.03.1~ce-0~ubuntu-xenial)
sudo apt-get -y install docker-ce=[VERSION]

查看可安装版本
root@k8s-master03:~# apt-cache madison docker-ce|awk '{ print $3 }'
5:28.0.4-1~ubuntu.22.04~jammy
5:28.0.3-1~ubuntu.22.04~jammy
5:28.0.2-1~ubuntu.22.04~jammy
5:28.0.1-1~ubuntu.22.04~jammy
root@k8s-master03:~# apt-cache madison containerd.io|awk '{print $1,"|",$3}'
containerd.io | 1.7.26-1
containerd.io | 1.7.25-1
containerd.io | 1.7.24-1
sudo apt-get -y install docker-ce=5:28.0.4-1~ubuntu.22.04~jammy  containerd.io=1.7.26-1

4. 查看开机启动项
systemctl is-enabled containerd docker
systemctl status docker docker.socket containerd 
systemctl start docker containerd
systemctl enable docker containerd

三、Docker 与 containerd 的关系

Docker 是一个高级容器运行时,它通过调用低级运行时 containerd 来实际管理容器的生命周期。containerd 是一个行业标准的容器运行时,负责镜像管理、容器执行、存储和网络等核心功能。

1. 在 Kubernetes 集群中,Docker 的运行流程如下:

Kubernetes 的 kubelet 通过 Dockershim(一个内置组件)与 Docker 交互。
Docker 接收到请求后,调用 containerd 完成具体的容器操作。
containerd 再调用更底层的运行时(如 runc)来启动和管理容器。
这种架构在 Kubernetes 1.24 之前是主流,但由于 Dockershim 的维护成本较高,Kubernetes 社区决定在 1.24 版本中移除对 Dockershim 的支持。

2. Docker 调用 containerd 的实现方式

Docker 和 containerd 的协作通过以下步骤实现:

  1. Docker 的架构
    Docker 自身是一个客户端-服务器架构,包含以下核心组件:
    Docker CLI:用户与 Docker 交互的命令行工具。
    Docker Daemon(dockerd):负责接收和处理 Docker CLI 的请求。
    containerd:被 Docker Daemon 调用,负责实际的容器管理任务。

  2. containerd 的作用
    containerd 是一个轻量级的运行时,专注于以下功能:
    镜像的拉取、存储和管理。
    容器的创建、启动和销毁。
    存储和网络的管理。
    containerd 通过调用 runc(符合 OCI 标准的低级运行时)来启动容器。

  3. Kubernetes 中的调用链
    在 Kubernetes 集群中,调用链如下:

kubelet 发送容器操作请求(如创建 Pod)。
Dockershim 将请求转发给 Docker Daemon。
Docker Daemon 调用 containerd 完成操作。
containerd 使用 runc 启动容器。

3. Docker 与 containerd 的优缺点对比

  1. 优点
    Docker 提供了丰富的生态系统和工具链,适合开发和测试环境。
    containerd 是轻量级运行时,性能较高,适合生产环境。

  2. 缺点
    Docker 的引入增加了额外的抽象层,可能导致性能损失。
    Dockershim 的维护成本较高,Kubernetes 社区已停止支持。

  3. Kubernetes 1.24 版本的变化
    自 Kubernetes 1.24 版本起,Dockershim 被移除,Kubernetes 不再直接支持 Docker 作为容器运行时。取而代之的是直接使用 containerd 或其他符合 CRI(容器运行时接口)标准的运行时。

对于仍在使用 Docker 的用户,建议迁移到 containerd 或其他 CRI 兼容的运行时,以确保与未来版本的 Kubernetes 兼容。

四、在kubernetes 中 docker 启动顺序

在 Kubernetes 1.24 之前的版本中,Docker 作为容器运行时,其启动顺序涉及多个组件的协作,包括 containerd、docker.socket 和 docker-ce。
以下是对这一启动顺序的详细解析,结合相关搜索结果进行说明。

  1. containerd 的启动
    containerd 是一个低级容器运行时,负责管理容器的生命周期,包括镜像管理、容器执行、存储和网络等核心功能。它作为一个 API 服务,
    提供了一系列接口供外部调用,例如创建容器、删除容器、创建镜像、删除镜像等。
    在启动顺序中,containerd 通常是最先启动的组件,因为 Docker 依赖 containerd 来完成实际的容器操作。containerd 的启动由 systemd 管理,
    确保其在 Docker 之前运行。

  2. docker.socket 的激活
    docker.socket 是一个 systemd socket 单元文件,用于管理 Docker 的 Unix 域套接字(/run/docker.sock)。它的作用是通过 socket 激活机制,在收到连
    接请求时才启动 Docker 服务,而不是让 Docker 一直运行。
    在启动顺序中,docker.socket 的激活发生在 containerd 启动之后。当外部工具(如 Kubernetes 的 kubelet 或 docker CLI)尝试连接 /run/docker.sock 时,
    systemd 会自动启动 Docker 服务。

  3. docker-ce 的启动
    docker-ce 是 Docker 的社区版,是一个高级容器运行时,通过调用 containerd 来管理容器。它的启动由 docker.socket 触发,确保按需启动。

  4. 启动顺序的必要性
    依赖关系:Docker 依赖 containerd 来管理容器,因此 containerd 必须先启动。docker.socket 的激活确保 Docker 按需启动,避免资源浪费。
    稳定性:通过 systemd 管理启动顺序,确保各组件按正确的顺序启动,避免因依赖问题导致服务失败。
    性能优化:socket 激活机制减少了 Docker 的运行时间,只有在需要时才启动,优化了系统资源的使用

  5. 在 Kubernetes 1.24 之前的版本中,Docker 作为容器运行时的启动顺序为:containerd → docker.socket → docker-ce。这一顺序确保了各组件的正确协作和高效运行。
    containerd 负责底层容器管理,docker.socket 实现按需启动,docker-ce 提供高级容器运行时功能

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐