Docker 替换到 Containerd (nerdctl相关指令)

发布于:2025-02-24 ⋅ 阅读:(14) ⋅ 点赞:(0)

因为docker不给用了,所以使用Containerd来代替

前置准备

安装 Containerd


# 安装 containerd
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y containerd.io
# 生成默认配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml

# 启动 containerd
systemctl start containerd
systemctl enable containerd

迁移步骤

1. 备份数据

# 创建备份目录
mkdir -p /backup/docker

# 导出所有 Docker 镜像
for image in $(docker images --format "{{.Repository}}:{{.Tag}}"); do
  docker save $image > "/backup/docker/${image//\//_}.tar"
done

# 导出容器数据卷
docker run --rm --volumes-from <container_name> -v /backup/docker:/backup busybox tar cvf /backup/data.tar /data

2. 导入镜像到 Containerd

# 安装 nerdctl (Containerd 的命令行工具)
wget https://github.com/containerd/nerdctl/releases/download/v0.22.2/nerdctl-0.22.2-linux-amd64.tar.gz
tar xvf nerdctl-0.22.2-linux-amd64.tar.gz
mv nerdctl /usr/local/bin/

# 导入镜像
for tar in /backup/docker/*.tar; do
  ctr images import $tar
done

3. 运行容器配置

  1. 获取 Docker 容器配置:
# 导出容器配置
docker inspect <container_name> > container_config.json
  1. 创建对应的 Containerd 容器:
# 使用 nerdctl 创建容器,运行容器时只需要把平时用的docker run 换成nerdctl run就可以,参数和使用docker run基本一致
nerdctl run \
  --name <new_container_name> \
  --volume /path/to/data:/container/path \
  --network <network_name> \
  --env-file <env_file> \
  <image_name>

5. 验证

# 检查容器状态
nerdctl ps -a

# 检查服务可用性
curl http://localhost:<port>

# 检查日志
nerdctl logs <container_name>

基础命令

1. 容器管理

# 运行容器
nerdctl run [选项] 镜像名 [命令]
# 示例:运行 Nginx
nerdctl run -d --name mynginx -p 80:80 nginx

# 常用运行选项:
-d, --detach          # 后台运行
-p, --publish         # 端口映射
-v, --volume          # 挂载数据卷
--name                # 指定容器名
--rm                  # 容器停止后自动删除
-e, --env            # 设置环境变量
--network            # 指定网络

2. 容器操作

# 查看运行中的容器
nerdctl ps
# 查看所有容器(包括已停止的)
nerdctl ps -a

# 启动/停止/重启容器
nerdctl start 容器名或ID
nerdctl stop 容器名或ID
nerdctl restart 容器名或ID

# 删除容器
nerdctl rm 容器名或ID
# 强制删除运行中的容器
nerdctl rm -f 容器名或ID

# 查看容器日志
nerdctl logs 容器名或ID
# 实时查看日志
nerdctl logs -f 容器名或ID

# 进入容器
nerdctl exec -it 容器名或ID /bin/bash

3. 镜像管理

# 查看本地镜像
nerdctl images

# 拉取镜像
nerdctl pull 镜像名:标签

# 推送镜像到仓库
nerdctl push 镜像名:标签

# 删除镜像
nerdctl rmi 镜像名:标签

# 构建镜像
nerdctl build -t 镜像名:标签 .

# 保存和加载镜像
nerdctl save 镜像名:标签 > image.tar
nerdctl load < image.tar

高级功能

1. 网络管理

# 查看网络列表
nerdctl network ls

# 创建网络
nerdctl network create 网络名
# 示例:创建自定义网络
nerdctl network create mynetwork

# 删除网络
nerdctl network rm 网络名

# 连接容器到网络
nerdctl network connect 网络名 容器名

# 断开容器与网络的连接
nerdctl network disconnect 网络名 容器名

2. 数据卷管理

# 查看数据卷
nerdctl volume ls

# 创建数据卷
nerdctl volume create 卷名

# 删除数据卷
nerdctl volume rm 卷名

# 查看数据卷详情
nerdctl volume inspect 卷名

3. 容器资源限制

# 限制内存使用
nerdctl run -m 512m 镜像名

# 限制 CPU 使用
nerdctl run --cpus 2 镜像名

# 限制 CPU 份额
nerdctl run --cpu-shares 512 镜像名

4. 容器编排

# 使用 compose 启动服务
nerdctl compose up -d

# 停止 compose 服务
nerdctl compose down

# 查看 compose 服务状态
nerdctl compose ps

实用技巧

1. 容器监控

# 查看容器资源使用情况
nerdctl stats

# 查看容器详细信息
nerdctl inspect 容器名或ID

2. 镜像管理技巧

# 清理未使用的镜像
nerdctl image prune

# 清理所有未使用的资源
nerdctl system prune

# 查看镜像历史
nerdctl history 镜像名:标签

3. 文件传输

# 从容器复制文件到主机
nerdctl cp 容器名:/容器内路径 主机路径

# 从主机复制文件到容器
nerdctl cp 主机文件路径 容器名:/容器内路径

常见问题解决

  1. 容器无法访问网络:
# 检查网络配置
nerdctl inspect 容器名 | grep -i network
  1. 容器启动失败:
# 查看详细错误信息
nerdctl events
nerdctl logs 容器名
  1. 存储空间问题:
# 清理未使用的数据
nerdctl system prune -a --volumes

最佳实践

  1. 使用 --rm 参数运行临时容器
  2. 总是给容器命名,便于管理
  3. 使用数据卷而不是绑定挂载
  4. 定期清理未使用的资源
  5. 使用 compose 文件管理多容器应用