刚接触Docker的新手常会遇到各种"玄学问题",比如明明照着教程操作却报错,或者装完发现命令不能用。我在第一次部署Docker时,就遇到过因为旧版本残留导致的依赖冲突,折腾了大半天才解决。为了避免大家踩同样的坑,我们先从最基础的环境检查开始。
首先用SSH连接你的CentOS服务器(建议使用7.6以上版本),执行以下命令检查系统内核版本:
bash复制uname -r
关键点:Docker要求内核版本3.10以上,如果看到类似3.10.0-1160.el7.x86_64的输出就可以继续。我遇到过某些云服务商的定制镜像内核被裁剪过,这时需要重装标准内核。
接着检查已安装的Docker组件:
bash复制yum list installed | grep docker
如果输出为空,恭喜你可以直接安装新版。如果出现docker-ce等包名,说明存在旧版本,必须彻底卸载。有次我偷懒没卸载干净,结果新装的Docker一直提示端口冲突。
分四步走更稳妥:
systemctl stop dockersocket激活,这是正常现象yum remove -y docker* containerd.iobash复制rm -rf /var/lib/docker
rm -rf /etc/docker
yum list installed | grep docker应该无输出注意:/var/lib/docker存放着所有镜像和容器数据,删除前请确认是否需要备份
官方源在国内访问较慢,建议使用阿里云镜像源。先安装必要工具:
bash复制yum install -y yum-utils device-mapper-persistent-data lvm2
添加仓库配置时有个细节容易出错——不同CentOS版本对应不同repo地址。对于CentOS 7应该用:
bash复制yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
如果遇到Error: Status code: 404,可能是误用了CentOS 8的仓库地址。我曾在凌晨三点被这个问题卡住,后来发现文档版本号写错了。
查看可用版本列表:
bash复制yum list docker-ce --showduplicates | sort -r
生产环境建议安装特定稳定版(如23.0.3),避免自动升级带来兼容性问题:
bash复制yum install -y docker-ce-23.0.3 docker-ce-cli-23.0.3 containerd.io
如果遇到依赖冲突(常见于装有旧版containerd的系统),可以强制替换:
bash复制yum install --allowerasing -y docker-ce-23.0.3
安装完成后别急着用,还需要关键的一步——启动服务并设置开机自启:
bash复制systemctl start docker
systemctl enable docker
验证安装成功的正确姿势是:
bash复制docker run hello-world
如果看到"Hello from Docker!"的欢迎信息,说明你的容器引擎已经ready了。第一次看到这个画面时,我对着终端傻笑了五分钟。
官方推荐通过GitHub下载二进制文件,但国内直连GitHub可能不稳定。这里分享两个实测可用的国内镜像源:
阿里云镜像(替换版本号即可):
code复制https://mirrors.aliyun.com/docker-toolbox/linux/compose/1.29.2/docker-compose-Linux-x86_64
DaoCloud镜像:
code复制https://get.daocloud.io/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)
下载后需要三步操作:
bash复制mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
常见坑点:如果直接执行docker-compose命令报
Permission denied,记得用chmod +x添加可执行权限。有次我在生产环境忘了这步,排查了半小时才发现问题。
用版本检查命令测试:
bash复制docker-compose version
正常输出应包含两个版本信息:
code复制Docker Compose version v2.20.3
Docker Engine version 23.0.3
如果Docker版本显示为unknown,可能是docker.socket未激活,重启服务即可:
bash复制systemctl restart docker
刚装完Docker时,普通用户执行docker命令会报权限错误。有三种解决方案:
每次加sudo(最安全但麻烦):
bash复制sudo docker ps
将用户加入docker组(推荐方案):
bash复制sudo usermod -aG docker $USER
newgrp docker # 立即生效
修改守护进程配置(不安全,仅测试环境用):
bash复制sudo chmod 666 /var/run/docker.sock
我曾经因为图省事用了第三种方案,结果被安全团队发了整改通知。建议在正式环境始终使用第二种方案。
Docker默认将数据存储在/var/lib/docker,长期运行可能导致根分区爆满。可以通过修改daemon.json来迁移数据目录:
bash复制sudo mkdir -p /data/docker
sudo systemctl stop docker
sudo mv /var/lib/docker /data/
创建配置文件:
bash复制sudo tee /etc/docker/daemon.json <<-'EOF'
{
"data-root": "/data/docker"
}
EOF
重启服务生效:
bash复制sudo systemctl start docker
这个技巧帮我解决了某次线上事故——当时/var分区只剩100MB,导致容器不断崩溃。迁移后不仅解决了空间问题,I/O性能还提升了30%。
在启用firewalld的服务器上,需要放行相关端口:
bash复制sudo firewall-cmd --permanent --add-port=2375/tcp # Docker守护端口
sudo firewall-cmd --permanent --add-port=2376/tcp # TLS加密端口
sudo firewall-cmd --reload
如果使用docker-compose部署web应用,记得暴露对应端口:
bash复制firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=443/tcp
有次我在客户现场调试,所有配置都正确但服务就是访问不了,最后发现是防火墙忘了开80端口。现在我的检查清单里一定会加上这一项。