1. 为什么选择Ubuntu虚拟机运行Docker?
在开发环境搭建过程中,Ubuntu+Docker的组合堪称黄金搭档。作为最流行的Linux发行版之一,Ubuntu对Docker的支持度堪称完美——官方文档明确推荐在Ubuntu上部署,社区资源丰富到几乎每个报错都能找到解决方案。而虚拟机环境则提供了完美的隔离性,特别适合以下场景:
- 需要在Windows/macOS主机上保持开发环境纯净的开发者
- 需要快速复制相同环境进行团队协作的项目
- 作为学习Docker的安全沙盒,避免误操作影响宿主机
我自己的工作站就是Windows 11 + VMware Ubuntu 22.04的组合,运行Docker容器近两年从未出现兼容性问题。下面分享的每个步骤都经过生产环境验证。
2. 虚拟机环境准备
2.1 虚拟机创建要点
推荐使用VMware Workstation Pro或VirtualBox,关键配置参数:
- 磁盘空间:至少40GB(Docker镜像很占空间)
- 内存:4GB起步,8GB更佳(运行多个容器时需要)
- CPU:启用虚拟化引擎(VT-x/AMD-V)
- 网络:NAT模式即可,需要端口映射时再调整
重要提示:务必在BIOS中开启CPU虚拟化支持!这是很多新手容易忽略的关键步骤。
安装Ubuntu时选择最小化安装(Minimal Installation),这样可以减少不必要的软件包占用资源。LTS版本(如22.04)是更稳妥的选择。
2.2 系统基础配置
安装完成后首先执行:
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y curl git vim net-tools
这些基础工具在后续排错时非常有用。建议同时配置SSH服务:
bash复制sudo apt install -y openssh-server
sudo systemctl enable --now ssh
这样可以通过主机终端直接操作虚拟机,效率更高。
3. Docker安装全流程
3.1 官方推荐安装方式
Docker官方为Ubuntu提供了专属的安装脚本,这是最可靠的方法:
bash复制# 卸载旧版本(如有)
sudo apt remove docker docker-engine docker.io containerd runc
# 安装依赖
sudo apt install -y ca-certificates curl gnupg lsb-release
# 添加GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置稳定版仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
3.2 验证安装
执行以下命令验证安装是否成功:
bash复制sudo docker run hello-world
如果看到"Hello from Docker!"的输出,说明安装正确。此时系统会自动下载测试镜像并运行容器。
3.3 非root用户配置
默认情况下运行docker命令需要sudo权限,这很不方便。将当前用户加入docker组:
bash复制sudo usermod -aG docker $USER
newgrp docker # 立即生效
现在可以直接运行docker ps而不需要sudo了。
4. 关键配置优化
4.1 镜像加速配置
国内用户必须配置镜像加速,否则拉取镜像速度极慢。修改/etc/docker/daemon.json:
json复制{
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
]
}
然后重启服务:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
4.2 存储驱动选择
查看当前存储驱动:
bash复制docker info | grep "Storage Driver"
对于Ubuntu 22.04,推荐使用overlay2驱动。如果显示其他驱动,可以修改/etc/docker/daemon.json:
json复制{
"storage-driver": "overlay2"
}
4.3 日志限制
防止容器日志占用过多磁盘空间:
json复制{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}
5. 常见问题排错指南
5.1 网络连接问题
症状:无法拉取镜像,提示网络错误
解决方案:
bash复制# 检查DNS配置
cat /etc/resolv.conf
# 临时使用Google DNS
sudo mkdir -p /etc/systemd/resolved.conf.d
echo "[Resolve]" | sudo tee /etc/systemd/resolved.conf.d/docker.conf
echo "DNS=8.8.8.8" | sudo tee -a /etc/systemd/resolved.conf.d/docker.conf
sudo systemctl restart systemd-resolved
5.2 权限拒绝错误
症状:Got permission denied while trying to connect to the Docker daemon
解决方案:
bash复制# 确认用户是否在docker组
groups $USER
# 如果不在组内
sudo usermod -aG docker $USER
newgrp docker
# 检查docker.sock权限
ls -l /var/run/docker.sock
5.3 存储空间不足
症状:No space left on device
解决方案:
bash复制# 查看docker磁盘使用
docker system df
# 清理无用资源
docker system prune -a
# 调整存储位置(如果虚拟机磁盘太小)
sudo systemctl stop docker
sudo rsync -a /var/lib/docker /new/location
sudo mv /var/lib/docker /var/lib/docker.bak
sudo ln -s /new/location/docker /var/lib/docker
sudo systemctl start docker
6. 生产环境建议
经过基础安装后,还需要考虑以下生产级配置:
6.1 资源限制
防止单个容器耗尽所有资源:
bash复制# 限制容器内存使用
docker run -it --memory="1g" ubuntu
# 限制CPU使用
docker run -it --cpus="1.5" ubuntu
6.2 健康检查
为关键服务添加健康检查:
dockerfile复制HEALTHCHECK --interval=30s --timeout=3s \
CMD curl -f http://localhost/ || exit 1
6.3 备份策略
定期备份关键数据卷:
bash复制docker run --rm --volumes-from my_container -v /backup:/backup ubuntu \
tar cvf /backup/backup.tar /data
7. 进阶工具链配置
7.1 Docker Compose安装
虽然已经安装了compose-plugin,但传统写法仍然有用:
bash复制sudo apt install -y docker-compose-plugin
创建docker-compose.yml示例:
yaml复制version: '3.8'
services:
web:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
7.2 可视化工具Portainer
通过容器部署管理界面:
bash复制docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 \
--name portainer \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce:latest
7.3 开发环境建议
对于开发环境,推荐安装:
bash复制# 命令行自动补全
sudo apt install -y bash-completion
sudo curl https://raw.githubusercontent.com/docker/docker-ce/master/components/cli/contrib/completion/bash/docker -o /etc/bash_completion.d/docker
8. 性能调优技巧
8.1 文件系统选择
虚拟机内推荐使用ext4文件系统,并添加挂载选项:
bash复制# /etc/fstab 示例
UUID=xxx / ext4 defaults,discard 0 1
discard选项可以自动回收未使用空间。
8.2 内存交换配置
适当调整swappiness值:
bash复制# 查看当前值
cat /proc/sys/vm/swappiness
# 临时修改
sudo sysctl vm.swappiness=10
# 永久生效
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
8.3 内核参数优化
调整网络相关参数:
bash复制echo "net.core.somaxconn=65535" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_max_syn_backlog=8192" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
9. 安全加固措施
9.1 用户命名空间
启用用户命名空间隔离:
bash复制# 创建子用户和组
sudo groupadd -g 100000 dockerroot
sudo useradd -u 100000 -g dockerroot -s /bin/false dockerroot
# 配置/etc/docker/daemon.json
{
"userns-remap": "dockerroot"
}
9.2 只读文件系统
运行容器时限制写入:
bash复制docker run --read-only -v /data:/data:rw alpine
9.3 能力限制
移除不必要的Linux能力:
bash复制docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx
10. 监控与日志管理
10.1 资源监控
使用cAdvisor监控容器资源:
bash复制docker run \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8081:8080 \
--detach=true \
--name=cadvisor \
gcr.io/cadvisor/cadvisor:v0.47.0
10.2 日志收集
配置ELK栈收集日志:
dockerfile复制# 示例logstash配置
input {
docker {
host => "unix:///var/run/docker.sock"
}
}
10.3 性能分析
使用dive分析镜像层:
bash复制docker run --rm -it \
-v /var/run/docker.sock:/var/run/docker.sock \
wagoodman/dive:latest my-image