1. 为什么选择Ubuntu+Docker组合
在Linux发行版中,Ubuntu长期占据着开发者首选操作系统的位置。根据2023年Stack Overflow开发者调查报告,Ubuntu在开发环境使用率高达47%,远超其他Linux发行版。而Docker作为容器化技术的代表,其轻量级、快速部署的特性与Ubuntu的稳定性形成了完美互补。
我最初接触这个组合是在处理一个需要多版本Python环境的数据分析项目时。传统虚拟机的资源占用让我苦不堪言,直到发现Docker容器只需几MB就能实现环境隔离。更关键的是,Ubuntu对Docker的原生支持程度令人惊喜——官方软件源直接提供docker.io包,apt-get一键安装的便捷程度远超其他发行版。
注意:虽然Ubuntu 22.04 LTS默认仓库中的docker.io版本(当前为20.10.21)并非最新,但经过充分测试,稳定性远超直接安装Docker官方源的最新版。生产环境建议优先考虑稳定性。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 安装前的关键准备工作
2.1 系统架构确认
在开始安装前,需要明确系统架构。虽然大多数现代PC都是x86_64架构,但在物联网和边缘计算场景中可能会遇到ARM设备。执行以下命令确认:
bash复制uname -m
输出如果是x86_64则表示64位Intel/AMD处理器,aarch64则表示ARM架构(如树莓派4B+)。这对后续选择正确的Docker镜像至关重要。
2.2 虚拟化支持检查
Docker依赖CPU的虚拟化扩展(Intel VT-x/AMD-V)。在物理机上运行以下命令检测:
bash复制grep -E --color 'vmx|svm' /proc/cpuinfo
有彩色输出即表示支持。如果在VMware虚拟机中安装,需要确保已开启嵌套虚拟化:
- 关闭虚拟机
- 编辑.vmx文件添加:
properties复制vhv.enable = "TRUE"
2.3 卸载冲突组件
某些旧版本或冲突软件会导致安装失败。彻底清理的命令序列:
bash复制sudo apt remove docker docker-engine docker.io containerd runc
sudo rm -rf /var/lib/docker
sudo rm -rf /var/lib/containerd
3. 三种安装方案对比实施
3.1 方案一:官方仓库安装(推荐新手)
这是最稳妥的安装方式,适合绝大多数用户:
bash复制sudo apt update
sudo apt install -y docker.io
sudo systemctl enable --now docker
验证安装:
bash复制sudo docker run hello-world
你会看到经典的欢迎信息。这个方案的优势在于:
- 自动处理所有依赖关系
- 版本经过Ubuntu团队充分测试
- 自动配置systemd服务
3.2 方案二:Docker官方源安装(追求新特性)
如需最新功能,可以添加Docker官方源:
bash复制# 安装依赖工具
sudo apt install -y ca-certificates curl gnupg
# 添加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
# 设置仓库
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 update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
警告:使用官方源可能遇到与某些Ubuntu定制组件的兼容性问题。我曾遇到与NetworkManager的冲突,导致容器网络异常。
3.3 方案三:离线安装(无外网环境)
在内网环境时,可以事先在有网络的机器上下载deb包:
bash复制# 在有网络的机器上执行
mkdir docker-offline
cd docker-offline
apt download docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
# 将整个目录拷贝到目标机器后
sudo apt install ./docker-offline/*.deb
4. 安装后必须的配置调优
4.1 非root用户权限配置
默认需要sudo才能执行docker命令,这既不安全也不方便。将用户加入docker组:
bash复制sudo usermod -aG docker $USER
newgrp docker # 立即生效无需注销
验证:
bash复制docker run --rm hello-world
重要安全提示:docker组实质等同于root权限。在多人使用的系统上,这相当于给所有组用户提供了root权限,生产环境请慎用。
4.2 镜像加速配置
国内访问Docker Hub速度堪忧。修改/etc/docker/daemon.json(不存在则新建):
json复制{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
重启服务生效:
bash复制sudo systemctl restart docker
4.3 存储驱动优化
Ubuntu默认使用overlay2驱动,但某些场景需要调整。查看当前驱动:
bash复制docker info | grep "Storage Driver"
对于使用ext4文件系统的用户,建议添加mount选项优化性能。编辑/etc/fstab,找到根分区所在行,添加:
properties复制defaults,discard,noatime
然后重新挂载:
bash复制sudo mount -o remount /
5. 日常使用中的高频场景
5.1 容器生命周期管理
完整的工作流示例(以Nginx为例):
bash复制# 拉取镜像
docker pull nginx:1.23-alpine
# 运行容器(-d后台运行,--name命名,-p端口映射)
docker run -d --name myweb -p 8080:80 nginx:1.23-alpine
# 查看运行状态
docker ps
# 进入容器shell
docker exec -it myweb /bin/sh
# 停止容器
docker stop myweb
# 删除容器
docker rm myweb
# 删除镜像
docker rmi nginx:1.23-alpine
5.2 数据持久化方案
容器本身是临时的,重要数据必须持久化。三种挂载方式对比:
| 方式 | 命令示例 | 适用场景 | 优缺点 |
|---|---|---|---|
| 绑定挂载 | -v /host/path:/container/path | 开发环境 | 直接修改主机文件,性能最好但安全性低 |
| 卷挂载 | -v myvolume:/container/path | 生产环境 | Docker管理存储位置,备份方便 |
| 临时挂载 | --tmpfs /container/path | 临时数据 | 内存存储,容器删除即消失 |
创建并使用卷的完整示例:
bash复制# 创建卷
docker volume create mysqldata
# 使用卷
docker run -d --name mysql-db \
-v mysqldata:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=secret \
mysql:8.0
# 查看卷信息
docker volume inspect mysqldata
5.3 容器网络配置
Docker默认创建三种网络:
bash复制docker network ls
创建自定义网络实现容器间通信:
bash复制# 创建自定义网络
docker network create mynet --subnet 172.20.0.0/16
# 容器加入同一网络
docker run -d --name web1 --network mynet nginx
docker run -it --name client1 --network mynet alpine ping web1
6. 开发环境实战案例
6.1 Python多版本管理
假设项目需要同时测试Python 3.7和3.10:
bash复制# 运行Python 3.7环境
docker run -it --rm -v $(pwd):/code -w /code python:3.7-alpine sh
# 另一个终端运行Python 3.10环境
docker run -it --rm -v $(pwd):/code -w /code python:3.10-alpine sh
两个容器共享主机当前目录,却拥有完全隔离的Python环境。
6.2 数据库服务部署
一键部署可复用的MySQL服务:
bash复制mkdir -p mysql/data mysql/conf.d
echo "[mysqld]\ncharacter-set-server=utf8mb4" > mysql/conf.d/charset.cnf
docker run -d --name mysql-server \
-v $(pwd)/mysql/data:/var/lib/mysql \
-v $(pwd)/mysql/conf.d:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-p 3306:3306 \
mysql:8.0 \
--default-authentication-plugin=mysql_native_password
7. 常见问题排错指南
7.1 虚拟化支持错误
错误信息:
code复制Docker Desktop failed to start because virtualization support wasn't detected
解决方案:
- 确认BIOS中已开启VT-x/AMD-V
- 对于Windows的WSL2环境,需要:
powershell复制dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart - 对于VMware虚拟机,确保已启用嵌套虚拟化
7.2 权限拒绝错误
错误信息:
code复制Got permission denied while trying to connect to the Docker daemon socket
可能原因:
- 用户未加入docker组 → 执行
sudo usermod -aG docker $USER - /var/run/docker.sock权限错误 →
sudo chmod 666 /var/run/docker.sock(临时方案)
7.3 镜像拉取失败
错误信息:
code复制Error response from daemon: pull access denied
解决方案:
- 检查镜像名称拼写
- 对于私有仓库需要先登录:
bash复制
docker login registry.example.com - 尝试更换镜像源
8. 进阶技巧与优化建议
8.1 使用Docker Compose编排服务
创建docker-compose.yml文件:
yaml复制version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
启动服务栈:
bash复制docker compose up -d
8.2 构建优化技巧
优化Dockerfile构建速度的实践:
- 合理利用构建缓存:将变化频率低的指令(如包安装)放在前面
- 多阶段构建减小镜像体积:
dockerfile复制FROM python:3.9 as builder COPY requirements.txt . RUN pip install --user -r requirements.txt FROM python:3.9-slim COPY --from=builder /root/.local /root/.local COPY . . CMD ["python", "app.py"] - 使用.dockerignore文件排除无关文件
8.3 资源限制配置
防止单个容器耗尽系统资源:
bash复制docker run -it --memory=512m --cpus=1.5 ubuntu
查看资源使用情况:
bash复制docker stats
