1. 环境准备与系统检查
刚拿到一台全新的Ubuntu 24.04 LTS服务器时,我习惯先做两件事:确认系统版本和更新软件源。这个习惯帮我避免过不少兼容性问题。打开终端输入以下命令:
cat /etc/os-release你会看到类似这样的输出:
PRETTY_NAME="Ubuntu 24.04 LTS" VERSION_ID="24.04"重点注意:Docker对系统内核版本有要求,而Ubuntu 24.04默认搭载的6.x内核完全满足需求。不过我在帮朋友配置旧机器时遇到过坑——他之前手动升级过内核导致依赖冲突。如果遇到类似情况,建议先用uname -r确认内核版本不低于5.4。
接着执行系统更新(这步不能省):
sudo apt update && sudo apt upgrade -y有次我跳过了这步直接安装Docker,结果因为openssl版本不匹配导致TLS验证失败。更新后记得安装基础依赖包:
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common这些工具的作用分别是:
apt-transport-https:让apt能通过HTTPS协议下载软件ca-certificates:管理CA证书curl:命令行下载工具software-properties-common:管理软件源
2. Docker仓库配置实战
配置仓库时最容易出错的是密钥环节。去年帮学生调试时发现,某高校网络会拦截GPG密钥请求,导致安装失败。这里分享两种解决方案:
方案一:官方源(推荐网络通畅时使用)
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg方案二:国内镜像源(适合下载慢的环境)
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg添加仓库时要注意$(lsb_release -cs)这个变量,它会自动获取系统代号。有次我在Ubuntu 22.04上手动填成了"focal",结果版本冲突。正确命令:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null3. Docker引擎安装详解
更新源缓存后,安装命令看似简单却暗藏玄机:
sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io常见问题排查:
- 如果报错"package not found",检查上一步的仓库配置
- 出现依赖冲突时,尝试
sudo apt --fix-broken install - 企业环境可能需要特定版本,可用
apt-cache madison docker-ce查看版本列表
启动服务时我习惯三连操作:
sudo systemctl start docker sudo systemctl enable docker sudo systemctl status docker最后这步status能直观看到服务状态,有次发现服务没启动,日志显示是cgroup驱动问题,这个我们后面配置环节会讲到。
验证安装成功最直接的方式:
sudo docker --version # 输出类似:Docker version 24.0.5, build 24.0.5-0ubuntu1~24.04.14. 国内镜像加速配置
直接拉取Docker Hub的镜像慢得像蜗牛?这是我实测有效的配置方案。创建或修改/etc/docker/daemon.json:
sudo tee /etc/docker/daemon.json <<EOF { "registry-mirrors": [ "https://mirror.aliyuncs.com", "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com" ], "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF参数解析:
registry-mirrors:镜像加速地址,建议选离你最近的cgroupdriver:与系统保持一致避免警告log-driver:日志格式和大小限制storage-driver:推荐overlay2文件系统
重启服务应用配置:
sudo systemctl daemon-reload sudo systemctl restart docker验证加速器是否生效:
docker info | grep Mirrors -A 25. Hello World实战与进阶测试
经典的hello-world测试:
sudo docker run hello-world成功的话你会看到鲸鱼图案的欢迎信息。但我想分享几个更实用的测试案例:
案例一:运行Nginx测试网络
docker run -d -p 8080:80 --name test-web nginx访问http://localhost:8080 应该能看到Nginx欢迎页
案例二:交互式Ubuntu容器
docker run -it ubuntu bash这个特别适合练习基础命令,退出后容器会自动停止
案例三:查看容器日志
docker logs test-web案例四:资源监控
docker stats6. 权限优化与日常管理
每次都要sudo太麻烦?把当前用户加入docker组:
sudo usermod -aG docker $USER newgrp docker # 立即生效安全提示:生产环境要谨慎操作,相当于给用户root权限。我团队曾发生过因误操作导致容器逃逸的事故。
常用管理命令备忘:
# 查看运行中的容器 docker ps # 查看所有容器(包括已停止的) docker ps -a # 停止/启动容器 docker stop test-web docker start test-web # 删除容器 docker rm test-web # 查看镜像列表 docker images # 删除镜像 docker rmi nginx遇到空间不足时,记得定期清理:
docker system prune7. 故障排查手册
问题1:docker命令报"Permission denied"
- 检查用户是否在docker组
- 尝试用sudo执行
- 查看/var/run/docker.sock权限
问题2:镜像拉取失败
- 检查网络连接
- 尝试更换registry-mirrors
- 手动ping镜像域名测试
问题3:容器启动立即退出
- 查看日志:docker logs <容器ID>
- 测试交互模式:docker run -it <镜像> bash
- 检查ENTRYPOINT/CMD配置
问题4:端口无法访问
- 确认防火墙放行
- 检查端口映射是否正确
- 测试容器内服务是否正常:docker exec -it <容器ID> curl localhost:80
记得去年处理过一个经典案例:用户反馈容器连不上MySQL,最后发现是docker0网桥的MTU设置问题。这类问题可以用docker network inspect bridge诊断。