1. 为什么要在Ubuntu上安装Docker?
作为Linux发行版中最流行的选择之一,Ubuntu与Docker的组合已经成为开发者构建、测试和部署应用的黄金标准。我最初接触这个组合是在2016年一个微服务项目中,当时手动配置环境依赖花了整整两天,而改用Docker后同样的工作只需几分钟。
Docker的核心价值在于它提供的容器化技术。与虚拟机不同,容器直接共享主机操作系统内核,这使得它们更加轻量级——通常只有几十MB大小,却能完整封装应用运行所需的所有依赖。在Ubuntu上运行Docker,相当于拥有了一个可移植的、一致的开发与生产环境。
重要提示:虽然Ubuntu 22.04 LTS是目前最稳定的选择,但如果你使用较旧的18.04版本,某些Docker功能可能会受限。建议至少使用20.04及以上版本。
2. 准备工作与环境检查
2.1 系统要求确认
在开始安装前,我们需要确认几个关键点:
Ubuntu版本:打开终端执行
lsb_release -a,查看Description行。我推荐使用22.04 LTS,它的长期支持会持续到2027年。架构兼容性:运行
uname -m,x86_64表示64位系统,这是Docker官方支持最好的架构。如果是ARM设备(如树莓派),需要额外注意镜像兼容性。存储空间:执行
df -h,确保至少有20GB可用空间。Docker默认将镜像存储在/var/lib/docker,这个分区需要有足够容量。
2.2 卸载旧版本(如有)
如果你之前尝试过安装Docker,强烈建议先彻底清理:
sudo apt-get remove docker docker-engine docker.io containerd runc sudo rm -rf /var/lib/docker sudo rm -rf /var/lib/containerd我在帮同事解决问题时,经常发现残留的配置文件导致新版本无法正常工作。这个清理步骤能避免90%的安装冲突。
3. 安装Docker引擎的三种方法
3.1 官方推荐方法:使用apt仓库
这是最稳妥的安装方式,也是Docker官方文档首推的方案:
# 1. 更新apt索引并安装依赖 sudo apt-get update sudo apt-get install ca-certificates curl gnupg # 2. 添加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 # 3. 设置仓库 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 # 4. 安装Docker引擎 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这个流程看似复杂,但每一步都有其必要性:
- GPG密钥验证软件包真实性
- 特定架构的仓库确保兼容性
- 同时安装的docker-compose-plugin让你后续可以直接使用docker compose命令
3.2 便捷方法:使用自动化脚本
对于快速测试环境,可以使用Docker提供的便捷脚本:
curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh虽然这个方法简单,但我只在临时环境使用它。在生产环境中,明确知道每个安装步骤更为安全。
3.3 手动安装.deb包
当服务器无法访问外网时,可以下载离线包手动安装:
- 从https://download.docker.com/linux/ubuntu/dists/ 选择对应版本的pool/stable目录
- 下载以下三个核心包:
- docker-ce_xxx.deb
- docker-ce-cli_xxx.deb
- containerd.io_xxx.deb
- 使用
sudo dpkg -i *.deb安装
这种方法需要自行解决依赖关系,适合有经验的系统管理员。
4. 安装后的关键配置
4.1 用户权限配置
默认只有root用户能运行docker命令,这既不安全也不方便。将当前用户加入docker组:
sudo usermod -aG docker $USER newgrp docker # 立即生效无需注销安全警告:docker组实际上等同于root权限。在多用户系统中,应当谨慎分配此权限。
4.2 镜像加速配置
国内访问Docker Hub可能很慢,修改/etc/docker/daemon.json(不存在则创建):
{ "registry-mirrors": [ "https://registry.cn-hangzhou.aliyuncs.com", "https://hub-mirror.c.163.com" ] }然后重启服务:
sudo systemctl restart docker4.3 存储驱动选择
对于Ubuntu,通常有两种推荐选择:
- overlay2(默认):性能好,兼容性强
- btrfs:如果你使用btrfs文件系统
查看当前驱动:
docker info | grep "Storage Driver"5. 验证安装与基本使用
5.1 运行测试容器
执行以下命令验证安装是否成功:
docker run --rm hello-world你应该看到"Hello from Docker!"的消息。这个命令会:
- 自动从Docker Hub拉取hello-world镜像
- 创建并运行容器
- 输出信息后自动删除容器(--rm参数作用)
5.2 常用命令速查
# 镜像管理 docker pull ubuntu:22.04 # 拉取镜像 docker images # 列出本地镜像 docker rmi <镜像ID> # 删除镜像 # 容器管理 docker ps -a # 查看所有容器 docker start/stop <容器ID> # 启停容器 docker exec -it <容器ID> bash # 进入运行中的容器 docker rm <容器ID> # 删除容器6. 常见问题与解决方案
6.1 "Got permission denied"错误
如果看到这类错误,说明当前用户没有docker组权限。检查:
groups | grep docker如果没有输出,确认是否执行了newgrp docker或已注销重新登录。
6.2 服务启动失败
检查docker服务状态:
sudo systemctl status docker常见原因及解决:
- 端口冲突:修改/etc/docker/daemon.json中的"hosts"配置
- 存储驱动问题:尝试删除/var/lib/docker并重启
- 内核模块缺失:安装linux-modules-extra包
6.3 镜像拉取缓慢
除了配置镜像加速器,还可以:
- 直接使用国内镜像站的镜像
- 设置代理(如果有合法网络权限):
mkdir -p ~/.docker echo '{"proxies":{"default":{"httpProxy":"http://proxy.example.com:8080"}}}' > ~/.docker/config.json
7. 进阶配置建议
7.1 资源限制配置
防止容器占用过多资源,在daemon.json中添加:
{ "default-ulimits": { "nofile": { "Name": "nofile", "Hard": 64000, "Soft": 64000 } }, "storage-opts": [ "size=100G" ] }7.2 日志轮转配置
避免容器日志占满磁盘:
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } }7.3 安全加固建议
- 启用用户命名空间:
echo '{"userns-remap":"default"}' | sudo tee /etc/docker/daemon.json - 禁用特权容器:
docker run --security-opt=no-new-privileges ...
8. 性能优化技巧
经过多年使用,我总结出几个特别实用的优化点:
- 使用SSD存储:/var/lib/docker最好放在SSD上,IO性能提升显著
- 调整CPU调度:对于CPU密集型容器,设置--cpuset-cpus参数绑定核心
- 内存限制:通过-m参数限制容器内存,避免OOM killer误杀重要进程
- 网络性能:对于高吞吐应用,使用--network=host模式(牺牲部分隔离性)
一个生产环境示例:
docker run -d --name myapp \ --cpus 2 \ -m 4g \ --network host \ -v /ssd_data:/data \ myapp-image9. 容器编排初探
虽然这超出了基础安装范围,但了解Docker Compose会让你事半功倍。安装时我们已经包含了compose插件,创建一个docker-compose.yml:
version: '3' services: web: image: nginx ports: - "8080:80" db: image: postgres environment: POSTGRES_PASSWORD: example启动服务栈:
docker compose up -d这个简单的编排文件就能定义和管理多容器应用,非常适合开发环境。