Skip to content

Docker 安装与镜像源

Docker Engine 由客户端、守护进程、containerd、runc 和网络/存储插件一起组成。安装 Docker 不是只得到一个 docker 命令,还会在宿主机上启动 dockerd 服务,创建 /var/lib/docker 数据目录,接管一部分容器网络和镜像存储。

生产机器上通常走官方软件仓库或公司内部镜像源。这样版本、依赖和安全补丁都比较清楚,也方便后面统一升级。国内环境还要单独处理 Docker Hub 镜像拉取慢的问题,registry-mirrors 只解决公共镜像拉取,不等同于内部镜像仓库。

一、Ubuntu 安装

Ubuntu 使用 Docker 官方 apt 仓库:

bash
# 安装 HTTPS 仓库和证书校验需要的基础工具
sudo apt-get update
sudo apt-get install -y ca-certificates curl

# Docker 官方 GPG key 放到 /etc/apt/keyrings,仓库配置会引用这个路径
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# VERSION_CODENAME 来自 /etc/os-release,避免把 Ubuntu 版本代号写死
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt-get update

# docker-compose-plugin 是 Compose v2,命令格式是 docker compose
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装后启动:

bash
sudo systemctl enable --now docker
sudo docker version
sudo docker compose version

docker version 同时看到 Client 和 Server 信息,说明客户端能连上 Docker daemon。只有 Client 没有 Server,通常是 daemon 没启动、socket 权限不对,或者当前用户没有访问权限。

二、RHEL / Rocky / CentOS 安装

RHEL、Rocky Linux、CentOS 8/9 系列使用 dnf:

bash
# dnf-plugins-core 提供 config-manager,用来添加 rpm 仓库
sudo dnf -y install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo
sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

CentOS 7 等老系统使用 yum:

bash
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

启动并验证:

bash
sudo systemctl enable --now docker
sudo docker version
sudo docker run --rm hello-world

机器原来装过发行版自带的 dockerdocker.iopodman-docker 时,要先看包来源。命令名一样不代表组件一致,后面排查 CLI、daemon、containerd 版本时很容易混。

三、docker 组和权限

默认只有 root 能执行 Docker 命令。把用户加入 docker 组后,可以不写 sudo

bash
sudo usermod -aG docker ops
id ops

用户重新登录后组权限才会生效。docker 组基本等同于 root 权限,因为它可以挂载宿主机目录、启动特权容器、访问 Docker socket。跳板机、共享服务器、生产机器上给这个权限要收口。

四、关键路径

路径说明
/usr/bin/dockerDocker CLI
/usr/bin/dockerdDocker daemon
/run/docker.sockDocker API socket
/etc/docker/daemon.jsondaemon 配置文件
/var/lib/docker镜像、容器可写层、volume、构建缓存

/var/lib/docker 要提前规划磁盘。镜像层、容器日志、volume、构建缓存都会占空间,后面磁盘满时,大概率先看这个目录。

查看当前状态:

bash
systemctl status docker --no-pager
journalctl -u docker -n 100 --no-pager
docker info

docker info 里可以看到 Docker Root Dir、Storage Driver、Cgroup Driver、Registry Mirrors、运行时等信息。排查环境差异时,这个输出比只看版本号更有用。

五、配置 1ms 镜像源

国内机器直接拉 Docker Hub 镜像经常超时或速度很慢。/etc/docker/daemon.json 里配置 registry-mirrors,让 Docker Hub 镜像走加速源:

json
{
  "registry-mirrors": [
    "https://docker.1ms.run"
  ]
}

如果 daemon.json 已有日志轮转、数据目录、insecure registry 等配置,要合并字段,不要直接覆盖整个文件。

bash
# 重启后 daemon 才会读取新的 daemon.json
sudo systemctl restart docker

# 查看 Registry Mirrors 是否包含 1ms 地址
docker info | sed -n '/Registry Mirrors:/,/Live Restore Enabled:/p'

# 拉一个固定版本镜像验证链路
docker pull nginx:1.26

registry-mirrors 只对 Docker Hub(docker.io)生效。GHCR、GCR、Quay 等仓库不受这个配置影响,需要通过对应加速前缀、代理或内部仓库同步来处理。

六、日志轮转基础配置

Docker 默认 json-file 日志驱动会把容器标准输出写到宿主机文件。没有轮转时,日志量大的容器很容易把磁盘打满。

json
{
  "registry-mirrors": [
    "https://docker.1ms.run"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "5"
  }
}

这个配置只对新建容器生效,已经存在的容器需要重建后才会应用新的日志选项。日志量大的服务还要接入日志平台,本地轮转只是避免宿主机被撑满。

七、基础验证

bash
# 查看 daemon 和客户端版本
docker version

# 拉取测试镜像,容器执行完自动删除
docker run --rm hello-world

# 查看当前镜像、容器和磁盘占用
docker images
docker ps -a
docker system df

安装完成后的验证不只看 hello-world。还要确认镜像源生效、Docker Root Dir 在预期磁盘、日志轮转配置存在、普通用户权限符合要求。