因为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. 运行容器配置
- 获取 Docker 容器配置:
# 导出容器配置
docker inspect <container_name> > container_config.json
- 创建对应的 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 主机文件路径 容器名:/容器内路径
常见问题解决
- 容器无法访问网络:
# 检查网络配置
nerdctl inspect 容器名 | grep -i network
- 容器启动失败:
# 查看详细错误信息
nerdctl events
nerdctl logs 容器名
- 存储空间问题:
# 清理未使用的数据
nerdctl system prune -a --volumes
最佳实践
- 使用
--rm
参数运行临时容器 - 总是给容器命名,便于管理
- 使用数据卷而不是绑定挂载
- 定期清理未使用的资源
- 使用 compose 文件管理多容器应用