Docker 安装与配置
好,咱们直接进入 Docker 落地最基础的一步——安装。我见过不少团队,镜像构建环境出问题,最后追根溯源,发现是 Docker 安装时埋的坑。所以这一章,咱们把安装和初始配置彻底理清。
说白了,Docker 就是一个客户端-服务端架构。你敲命令,dockerd 干活。装好只是第一步,配置好了,后面批量质控才稳定。
不同操作系统的安装方式
Linux 上装 Docker,建议走官方仓库,别用系统自带的旧版本。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
这套脚本会自动添加仓库、装好 docker-ce。我之前搭 CI 环境时,被内置的旧版 Docker 坑过(Compose 版本对不上),所以现在一律用官方脚本。
CentOS/RHEL 8+,官方也有仓库。但你得先装 yum-utils,再配 repo:
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
macOS 和 Windows,现在都用 Docker Desktop。这东西自带图形界面,还能管理资源限制。不过要注意,Docker Desktop 在 Windows 上需要 WSL 2 后端。我曾经帮同事排查过“容器启动不了”的问题,最后发现他没装 WSL 2。
| 操作系统 | 推荐方式 | 注意事项 |
|---|---|---|
| Ubuntu / Debian | 官方脚本 或 apt 仓库 | 系统自带版本可能太老 |
| CentOS / RHEL 8+ | yum-config-manager | 需启用 docker-ce 仓库 |
| macOS | Docker Desktop | 可调整 CPU / 内存限制 |
| Windows | Docker Desktop + WSL2 | 必须安装 WSL 2 内核 |
配置守护进程 dockerd
装完 Docker,第一件事是看系统服务状态。我个人习惯这样检查:
sudo systemctl status docker
sudo journalctl -u docker -n 50
如果服务没起来,八成是配置文件写错了。Docker 守护进程的主配置文件在 /etc/docker/daemon.json。我建议你一开始就把它用好,别等出问题了再改。
举个例子,批量构建时经常遇到 存储驱动 和 日志大小 的问题。默认日志文件可能撑爆磁盘——我踩过这个坑。用以下配置可以限制:
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
},
"storage-driver": "overlay2"
}
overlay2 是目前最推荐的存储驱动,性能好、稳定。cgroupdriver 用 systemd 能避免和 kubelet 打架(如果你将来要搭 Kubernetes 的话)。
改完配置,别忘了重载守护进程:
sudo systemctl daemon-reload
sudo systemctl restart docker
dockerd --validate 先检查一遍。
用户组设置
默认情况下,运行 Docker 命令需要 root 权限。你每次敲 sudo docker ... 不烦吗?解决办法是把当前用户加入 docker 组:
sudo usermod -aG docker $USER
newgrp docker # 或者退出 shell 重新登录
之后你就能直接用 docker images、docker ps 了,不用再写 sudo。
我负责过一套多人使用的构建集群,当时就是让每个开发都在自己的用户下装 Docker,结果组权限乱得一塌糊涂。后来统一用 docker 组,权限控制在同一个用户组里,好管理多了。
嗯,到这里 Docker 安装和配置的核心环节就捋清楚了。你想想看,那些莫名其妙“Permission denied”或者“容器跑不起来”的问题,多半是配置不对或者组权限没设好。接下来,咱们会基于这个基地去构建镜像质控环境——但现在,先确保你的 Docker 跑得稳。快检查一下:
docker info
docker run hello-world
两条命令走通,这章的任务就算完了。