常用操作

# 以root身份进入容器
docker exec -u 0 -it <container_id_or_name> /bin/bash

# ctr基本操作,建议安装nerdctl,兼容docker指令
ctr c ls
ctr t ls 
ctr t exec -t --user 0 --exec-id 0 weaviate-1 /bin/sh
ctr t rm -f weaviate-1
ctr c rm weaviate-1

查看日志

journalctl 是 systemd 管理的日志系统的主要接口。systemd 是现代 Linux 发行版中广泛使用的初始化系统和系统管理器,它负责管理系统的进程、服务和日志记录

# 显示详细日志,定位到末尾
journalctl -xe
# 查看docker服务的日志
journalctl -u docker.service

卸载旧版本

yum remove docker-ce docker-ce-cli containerd.io docker-ce-rootless-extras docker-buildx-plugin docker-compose-plugin

离线安装

如果你的服务器无法连接外网,可以使用离线包来安装docker和启动容器,官方文档:https://docs.docker.com/engine/install/centos/#install-from-a-package

sudo yum install containerd.io-1.6.28-3.2.el7.x86_64.rpm docker-ce-25.0.4-1.el7.x86_64.rpm docker-ce-cli-25.0.4-1.el7.x86_64.rpm docker-ce-rootless-extras-25.0.4-1.el7.x86_64.rpm docker-buildx-plugin-0.13.0-1.el7.x86_64.rpm docker-compose-plugin-2.6.0-3.el7.x86_64.rpm
sudo systemctl start docker
#verify
yum list installed | grep docker
sudo docker run hello-world

镜像导出与导入

docker pull <imageId:tag>
docker save -o <imageId>-<tag>.tar <imageId:tag>

# import
docker load -i <imageId>-<tag>.tar
# 查看刚导入的image
docker images
docker tag <image_id> <repo>:<tag>

容器镜像站:

  • https://dockerproxy.com/
  • docker.nju.edu.cn

设置镜像存储目录

tee /etc/docker/daemon.json << EOF
{
  "data-root": "/data/docker",
}
EOF

systemctl restart docker
docker info | grep 'Root Dir'

断点续传

Containerd 是一个开源的容器运行时(container runtime),设计用于管理容器的生命周期,包括镜像管理、容器执行、存储管理等核心功能。它最初是从 Docker 中的容器运行时组件提取出来的,后来成为一个独立的项目,被广泛地用于多种容器管理平台和工具中,其中包括 Docker、Kubernetes 等。

containerd-snapshotter 负责管理 Docker 镜像的快照。在拉取镜像时,Docker 引擎会通过 containerd-snapshotter 为每一层镜像创建快照。这些快照可以看作是文件系统的快照,包含了每一层镜像的文件和元数据。

docker存储驱动支持的文件系统类型

Storage driver Supported backing filesystems
overlay2 xfs with ftype=1, ext4
fuse-overlayfs any filesystem
btrfs btrfs
zfs zfs
vfs any filesystem

当你使用 Docker Engine 作为容器运行时时,Docker 镜像通常会存储在 /var/lib/docker 目录下。这个目录包含:

  • containers/:存放容器的运行时状态和元数据。
  • image/:存放 Docker 镜像的各个层(layers)和元数据。
  • volumes/:存放 Docker 卷的数据。

当你使用 containerd 作为容器的运行时时,它默认使用 /var/lib/containerd 存储运行时的数据,类似 Docker Engine 的 /var/lib/docker 目录。

# 查看当前docker是不是用的containerd
systemctl status docker
# CGroup: /system.slice/docker.service
#         └─28173 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

systemctl status containerd
# 查看containerd runtime支持的文件系统,目前我这台机器支持:overlayfs, native
ctr plugin ls | grep io.containerd.snapshotter.v1
# io.containerd.snapshotter.v1          aufs                     linux/amd64    skip
# io.containerd.snapshotter.v1          btrfs                    linux/amd64    skip
# io.containerd.snapshotter.v1          devmapper                linux/amd64    error
# io.containerd.snapshotter.v1          native                   linux/amd64    ok
# io.containerd.snapshotter.v1          overlayfs                linux/amd64    ok
# io.containerd.snapshotter.v1          zfs                      linux/amd64    skip

# 如果使用了containerd,默认下载在(最后的目录是你指定文件系统):/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs

# 修改默认存储路径
echo 'root = "/data/docker/containerd"' > /etc/containerd/config.toml
# 重启containerd
systemctl restart containerd

# 启用containerd-snapshotter 来支持断点续传功能
tee /etc/docker/daemon.json << EOF
{
  "storage-driver": "overlayfs",
  "features": {
    "containerd-snapshotter": true
  }
}
EOF
# 重启docker
systemctl restart docker

从老版本升级docker后,可能会造成docker pull镜像成功后,docker images看不到的问题,但是重新pull立刻又成功,也可以运行容器。主要原因就是老版本用的是docker runtime不是dockerd,它读取的是/etc/docker/daemon.json里配置的data-root路径,新版本下载的镜像读的是/etc/containerd/config.toml配置的root路径(默认/var/lib/dockerd),两边冲突了。如果解决不了,可以考虑删除以前的docker runtime和containerd的目录,重启一次。

systemctl stop docker
systemctl stop containerd
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
systemctl start containerd
systemctl start docker

镜像

tee /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
    "https://docker-0.unsee.tech",
    "https://docker-cf.registry.cyou",
    "https://docker.1panel.live"
  ]
}
EOF

代理

docker pull代理

docker pull是由守护进程dockerd来执行的。

cat <<EOF > /etc/docker/daemon.json
{
  "proxies": {
    "http-proxy": "http://your_proxy_server:port/",
    "https-proxy": "http://your_proxy_server:port/",
    "no-proxy": "localhost,127.0.0.1"
  }
}
EOF

镜像构建代理

ip port需要设置成你的代理地址,除了使用–build-arg方式外,也可以直接在Docker file内使用 ENV http_proxy=xxx的方式设置代理。

# 构建镜像使用宿主机网络
docker build --network host . -t <imagId>:<tag> --build-arg http_proxy=http://<ip>/<port> --build-arg https_proxy=http://<ip>/<port>

ctr相关操作

# 查看状态
systemctl status containerd
# 查看所有的命名空间
ctr namespaces ls

# 查看镜像,默认查看default空间下的
ctr images ls
ctr -n k8s.io images ls
# 简化输入命名空间动作
alias ctrk='ctr -n k8s.io'

# 拉取镜像
ctr images pull docker.io/library/alpine:latest
# 删除镜像
ctr images rm harbor.qihoo.net/finloan-dev/xinference:v0.10.3
# 删除所有镜像
for image in $(sudo ctr images ls -q); do
  sudo ctr images rm $image
done

push多平台镜像

# 查看镜像的manifest文件,提取平台对应的hash
docker manifest inspect semitechnologies/weaviate:1.25.7

# 拉取镜像,hash信息从manifest文件获取
docker pull semitechnologies/weaviate:1.25.7@sha256:57521bc9730de02b7af614d844fddfe07f52e0589cafa92aef625abe5ade1e9d
docker pull semitechnologies/weaviate:1.25.7@sha256:5b0236662d5f87e439b71cef2ea5d14214212173f493c6abd1e0bdc15d3ad64a

# 修改镜像tag
docker tag semitechnologies/weaviate:1.25.7@sha256:57521bc9730de02b7af614d844fddfe07f52e0589cafa92aef625abe5ade1e9d registry.cn-shenzhen.aliyuncs.com/docker-mirror2/weaviate:1.25.7-amd64
docker tag semitechnologies/weaviate:1.25.7@sha256:5b0236662d5f87e439b71cef2ea5d14214212173f493c6abd1e0bdc15d3ad64a registry.cn-shenzhen.aliyuncs.com/docker-mirror2/weaviate:1.25.7-arm64

# push镜像
docker push registry.cn-shenzhen.aliyuncs.com/docker-mirror2/weaviate:1.25.7-amd64
docker push registry.cn-shenzhen.aliyuncs.com/docker-mirror2/weaviate:1.25.7-arm64

# 创建多平台manifest后push
docker manifest create registry.cn-shenzhen.aliyuncs.com/docker-mirror2/weaviate:1.25.7 --amend registry.cn-shenzhen.aliyuncs.com/docker-mirror2/weaviate:1.25.7-amd64 --amend registry.cn-shenzhen.aliyuncs.com/docker-mirror2/weaviate:1.25.7-arm64
docker manifest push registry.cn-shenzhen.aliyuncs.com/docker-mirror2/weaviate:1.25.7

启动GPU镜像

驱动校验

# 校验Nvidia驱动
nvidia-smi

# 校验Docker GPU支撑
docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi

驱动安装

# 添加官方源
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/libnvidia-container/gpgkey | \
  sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg

curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
  sed 's#deb #deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] #' | \
  sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# 安装 toolkit
sudo apt update
sudo apt install -y nvidia-container-toolkit

# 自动配置 Docker runtime
sudo nvidia-ctk runtime configure --runtime=docker

# 重启 Docker 服务
sudo systemctl restart docker
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐