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 知识结构概览
安装和配置涉及的内容比较多,我画了张图帮你梳理整个流程。
2.5 安装后的验收清单
装完了,别急着走。我总结了一份验收清单,每装一台机器都走一遍:
- 检查版本:
docker version确认 client 和 server 版本一致 - 检查信息:
docker info看 Storage Driver、Cgroup Driver、Data Root 是否正确 - 运行测试:
docker run hello-world确认能拉取和运行容器 - 检查非root:切换普通用户执行
docker ps,不能报权限错误 - 验证日志:启动一个容器,看
/var/lib/docker/containers/下的日志文件大小是否受限制 - 配置持久化:
systemctl is-enabled docker确认开机自启
小技巧:把验收清单写成脚本,每次装完自动跑一遍。我团队现在都用这个脚本做环境交付,基本不出错。
好了,安装和配置这块就到这儿。把基础打牢,后面构建镜像、锁定版本,才能顺畅地走下去。