常用操作
# 以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 为每一层镜像创建快照。这些快照可以看作是文件系统的快照,包含了每一层镜像的文件和元数据。
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.m.daocloud.io",
"https://huecker.io",
"https://dockerhub.timeweb.cloud",
"https://noohub.ru"
]
}
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
镜像构建代理
基本思路是使用宿主机的网络来使用代理。
# 宿主机执行,需要修改你的实际端口
export http_proxy="http://127.0.0.1:10809"
export HTTP_PROXY="http://127.0.0.1:10809"
export https_proxy="http://127.0.0.1:10809"
export HTTPS_PROXY="http://127.0.0.1:10809"
# 构建镜像使用宿主机网络
docker build --network host . -t <imagId>:<tag>
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