【Ubuntu2404】Ubuntu24.04下Docker引擎的安装与配置全攻略
1. 为什么选择Docker?容器化技术的核心优势
如果你是一名开发者或运维工程师,肯定听说过"Docker"这个名词。但你可能好奇:为什么大家都在用Docker?它和传统虚拟机有什么区别?简单来说,Docker就像是一个轻量级的"软件集装箱",它把应用程序和所有依赖环境打包在一起,确保在任何地方都能以相同的方式运行。
想象一下这个场景:你在本地开发环境调试好的程序,交给测试团队时总是报错,原因是测试环境的Python版本和你本地不同。这种情况在Docker的世界里不会发生,因为你的Python环境、系统库、配置文件都被打包在一个标准化的容器里。我去年负责的一个微服务项目,就是靠Docker实现了开发、测试、生产环境的完全一致,部署时间从原来的半天缩短到几分钟。
Docker的核心优势在于:
- 环境一致性:从开发到生产的全流程环境完全一致
- 资源高效:相比虚拟机,容器直接共享主机内核,内存占用更小
- 快速部署:秒级启动容器,而虚拟机通常需要分钟级
- 易于扩展:配合Kubernetes等工具可以实现自动扩缩容
在Ubuntu 24.04上安装Docker特别推荐,因为这是最新的LTS版本,内核和软件包都针对容器技术做了优化。实测下来,同样的容器在Ubuntu 24.04上运行比在20.04上性能提升约15%,特别是IO性能有明显改善。
2. 安装前的准备工作:彻底清理旧版本
很多人在安装Docker时遇到的第一个坑就是旧版本残留问题。我曾经就因为没彻底清理旧版Docker,导致新安装的容器网络一直异常。所以这一步千万别偷懒!
首先检查系统是否已安装过Docker相关组件:
dpkg -l | grep -i docker如果输出显示有docker.io等包,就需要执行完整卸载。Ubuntu自带的docker.io包虽然能用,但版本较旧,而且会与官方Docker CE产生冲突。以下是完整清理命令:
sudo apt-get remove -y docker docker-engine docker.io containerd runc特别注意两个容易遗漏的目录:
sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd这些目录存放着Docker的镜像和容器数据,如果不清理,新安装的Docker可能会读取到旧的配置信息。我建议在执行删除前先备份重要数据:
sudo tar -czvf docker_backup_$(date +%Y%m%d).tar.gz /var/lib/docker3. 配置Docker官方仓库:安全可靠的安装源
直接从Ubuntu默认仓库安装Docker不是个好主意,因为版本往往滞后。Docker官方维护的APT仓库才是最佳选择,它能保证你获取到最新稳定版。
首先安装必要的依赖工具:
sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg接下来这步很关键:添加Docker的GPG密钥。这个密钥用于验证软件包的真实性,防止中间人攻击。我遇到过因为跳过这步导致安装包被篡改的情况:
sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg然后添加APT源,注意要根据Ubuntu版本正确选择代号。Ubuntu 24.04的代号是Noble Numbat,但我们可以用自动检测的方式:
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null更新软件包索引:
sudo apt-get update4. 安装Docker引擎:组件详解与最佳实践
现在可以正式安装Docker了。但你知道docker-ce这个包名中的"ce"代表什么吗?它是Community Edition的缩写,即社区版。与之对应的是EE(Enterprise Edition)企业版。
推荐安装以下组件包:
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这些组件的作用分别是:
- docker-ce:Docker守护进程和核心引擎
- docker-ce-cli:命令行工具
- containerd.io:容器运行时
- docker-buildx-plugin:多架构镜像构建工具
- docker-compose-plugin:容器编排工具
安装完成后,建议立即将当前用户加入docker组,这样就不需要每次都加sudo了:
sudo usermod -aG docker $USER newgrp docker # 立即生效,不需要重新登录验证安装是否成功:
docker version你应该能看到Client和Server两个部分的版本信息。如果只有Client没有Server,说明dockerd服务没有正常启动,可以尝试:
sudo systemctl restart docker5. 配置与优化:让Docker发挥最佳性能
安装完成只是第一步,合理的配置才能让Docker更好地工作。分享几个我实践过的优化技巧。
首先是修改Docker的存储驱动。Ubuntu 24.04默认使用overlay2,这通常是最佳选择,但如果你使用btrfs或zfs文件系统,可以相应调整:
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<EOF { "storage-driver": "overlay2", "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "3" } } EOF限制日志大小很重要,我曾经因为没设置这个参数,导致Docker日志把磁盘占满。
另一个实用配置是设置镜像加速器。由于网络原因,直接拉取Docker Hub镜像可能很慢。可以配置国内镜像源:
sudo tee /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"] } EOF应用所有配置后重启Docker:
sudo systemctl daemon-reload sudo systemctl restart docker6. 运行第一个容器:从Hello World到实际应用
现在来运行经典的hello-world容器测试:
docker run hello-world如果看到"Hello from Docker!"的欢迎信息,说明一切正常。但hello-world容器只是个开始,让我们尝试运行一个更有实际意义的Nginx容器:
docker run -d -p 8080:80 --name my-nginx nginx这个命令做了以下几件事:
-d:后台运行容器-p 8080:80:将主机的8080端口映射到容器的80端口--name my-nginx:给容器起个名字nginx:使用官方nginx镜像
访问http://localhost:8080就能看到Nginx的欢迎页面。要停止并删除这个容器:
docker stop my-nginx docker rm my-nginx7. 常见问题排查:我遇到过的那些坑
即使按照教程一步步操作,也可能会遇到各种问题。这里分享几个典型问题的解决方法。
问题1:docker命令报"Permission denied"
Got permission denied while trying to connect to the Docker daemon socket解决方法:确保你的用户属于docker组,并执行了newgrp docker
问题2:拉取镜像超时
net/http: request canceled while waiting for connection解决方法:配置镜像加速器,或者检查网络连接
问题3:容器启动后立即退出
Exited (0) 1 second ago解决方法:检查容器内主进程是否持续运行,前台进程容器才会保持运行
问题4:端口冲突
Bind for 0.0.0.0:8080 failed: port is already allocated解决方法:更改主机端口或停止占用端口的容器
查看Docker日志有助于诊断问题:
journalctl -u docker.service -n 50 --no-pager8. 进阶技巧:日常使用中的实用命令
掌握这些命令能让你的Docker使用体验更顺畅:
查看正在运行的容器:
docker ps查看所有容器(包括已停止的):
docker ps -a查看镜像列表:
docker images进入运行中的容器:
docker exec -it 容器名 /bin/bash查看容器日志:
docker logs -f 容器名清理无用资源:
docker system prune构建自定义镜像(需要在Dockerfile所在目录执行):
docker build -t 镜像名 .这些命令看似简单,但在实际开发中能解决大问题。比如docker exec命令,我经常用它进入容器内部调试应用;docker system prune则帮我节省了大量磁盘空间。
