2、Docker安装与配置:把环境收拾利索再上路

说实话,很多同学学Docker卡住,不是因为概念多难,而是安装这一步没走稳。我2016年第一次装Docker,在Ubuntu上折腾了快两个小时,后来才发现是源没换对。所以这一节,咱们把安装、daemon配置、非root用户使用这些基础彻底整明白。

核心目标:装好Docker Engine,调好daemon配置,不用sudo也能跑docker命令。这三件事搞定,后面镜像构建、版本锁定才能顺利进行。

2.1 主流操作系统安装方式

Docker的安装方式,说白了就两种:用包管理器装,或者用官方脚本。我个人习惯前者,更可控。

2.1.1 Ubuntu / Debian 系列

这是最广泛使用的安装方式。我在项目中至少部署过几十台Ubuntu服务器的Docker环境,按下面这个流程基本不出错。

第一步:卸载旧版本

sudo apt-get remove docker docker-engine docker.io containerd runc

第二步:安装依赖

sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release

第三步:添加Docker官方GPG密钥和源

sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

第四步:安装Docker Engine

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

国内加速:如果下载慢,可以把上面的源换成阿里云或中科大的镜像。我每次装新服务器第一件事就是改源。

阿里云:https://mirrors.aliyun.com/docker-ce/linux/ubuntu

2.1.2 CentOS / RHEL 系列

CentOS 7/8的安装方式类似。注意CentOS 8已经EOL了,建议用Rocky Linux或AlmaLinux替代。

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 docker-compose-plugin
sudo systemctl start docker
sudo systemctl enable docker

内核版本:CentOS默认内核可能比较老,建议升级到3.10以上。我在生产环境遇到过因为内核太旧导致的overlay存储驱动问题。

2.1.3 macOS 与 Windows

Mac用户直接用Docker Desktop,Windows用户也一样。但我个人建议生产环境别用桌面版,它更适合开发和测试。

# macOS 用 Homebrew
brew install --cask docker

# 或者直接去官网下载 Docker.dmg

安装完后,打开Docker Desktop应用,它会自动配置好环境。你可以在终端里检查版本。

docker --version
docker-compose --version

2.2 Docker daemon 配置

Docker daemon是整个Docker的后台进程,它负责管理容器、镜像、网络、存储这些事。安装只是第一步,调好daemon配置才算真正入门。

2.2.1 daemon.json 配置文件

daemon的配置放在 /etc/docker/daemon.json 里。这个文件不存在就自己创建。格式是JSON。

常用配置项:

配置项 说明 我的推荐值
registry-mirrors 镜像加速器地址 配置国内源
log-driver 日志驱动 json-file
log-opts 日志参数 max-size=10m, max-file=3
exec-opts 容器运行时参数 native.cgroupdriver=systemd
storage-driver 存储驱动 overlay2
data-root 数据存储目录 根据磁盘规划

我个人习惯的配置模板:

{
  "registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  },
  "exec-opts": ["native.cgroupdriver=systemd"],
  "storage-driver": "overlay2",
  "data-root": "/data/docker"
}

为什么推荐systemd cgroup驱动? 因为Docker和kubelet都用systemd管理cgroup,能避免资源竞争。我曾经在生产集群里因为cgroup驱动不一致,导致容器启动失败,排查了整整一个下午。

2.2.2 配置生效和验证

配置写完后,需要重启daemon:

sudo systemctl daemon-reload
sudo systemctl restart docker

检查配置是否生效:

docker info | grep -E "Storage Driver|Cgroup Driver|Data Root"

如果看到 overlay2、systemd、/data/docker,说明配置生效了。

2.2.3 日志配置的坑

你想想看,如果不限制日志大小,跑几个月的容器日志能把磁盘撑爆。我在项目里就吃过这个亏。容器跑了三个月,日志文件占了200多G,导致整个节点磁盘IO异常。

配置日志轮转后:

"log-opts": {
  "max-size": "10m",
  "max-file": "3"
}

这样每个容器的日志文件最大10MB,最多保留3个。超过的自动删除。

2.3 非root用户使用Docker

默认情况下,运行docker命令需要root权限或sudo。但每次sudo多麻烦?而且生产环境里用root跑docker存在安全风险。我个人的习惯是创建一个docker用户组,把需要操作docker的用户加进去。

2.3.1 创建docker用户组并添加用户

sudo groupadd docker
sudo usermod -aG docker $USER
newgrp docker

执行完后,退出当前终端再重新登录,或者用 newgrp docker 刷新组权限。

测试:

docker run hello-world

如果能正常输出,说明配置成功。

验证方法:docker ps 不加sudo也不报错,就对了。

2.3.2 安全性说明

docker用户组的用户相当于拥有root权限,因为docker daemon本身以root运行,加入docker组的用户可以通过docker命令提权。所以在生产环境里,只把信任的用户加进去。我在安全管理规范里看到过,有些环境甚至用 userns-remap 做用户命名空间隔离。

不要随便加陌生人:docker组权限很高,相当于root。线上环境只加运维和开发负责人。

2.3.3 如果还是报权限错误

有时候添加用户后还是报 permission denied,可能是docker socket的权限问题。检查一下socket文件:

ls -l /var/run/docker.sock

正常情况下应该是 srw-rw----,属组是 docker。如果不对,改一下:

sudo chown root:docker /var/run/docker.sock
sudo chmod 660 /var/run/docker.sock

嗯,这步在Ubuntu 22.04上尤其要注意,有时候docker安装脚本不会自动设置socket的组权限。

2.4 知识结构概览

安装和配置涉及的内容比较多,我画了张图帮你梳理整个流程。

Docker安装与配置知识结构 Docker安装与配置知识结构 Linux 安装 macOS / Windows 离线安装 daemon.json 配置 日常验证与排错 非root用户使用Docker 用户组与权限管理 验证步骤 docker info → docker version → docker run hello-world → docker ps 关键原则 日志大小要限制 | 存储驱动用 overlay2 | 非root用户操作 生产环境不要用root运行docker命令 整个流程:安装 → 配置 daemon → 非root配置 → 验证

2.5 安装后的验收清单

装完了,别急着走。我总结了一份验收清单,每装一台机器都走一遍:

  1. 检查版本:docker version 确认 client 和 server 版本一致
  2. 检查信息:docker info 看 Storage Driver、Cgroup Driver、Data Root 是否正确
  3. 运行测试:docker run hello-world 确认能拉取和运行容器
  4. 检查非root:切换普通用户执行 docker ps,不能报权限错误
  5. 验证日志:启动一个容器,看 /var/lib/docker/containers/ 下的日志文件大小是否受限制
  6. 配置持久化:systemctl is-enabled docker 确认开机自启

小技巧:把验收清单写成脚本,每次装完自动跑一遍。我团队现在都用这个脚本做环境交付,基本不出错。

好了,安装和配置这块就到这儿。把基础打牢,后面构建镜像、锁定版本,才能顺畅地走下去。