1. 为什么需要彻底清理Docker环境

在Ubuntu 24上部署MinIO之前,很多开发者容易忽略一个关键步骤——彻底清理旧版Docker环境。我见过太多案例因为残留配置导致端口冲突、权限错误等"玄学问题"。想象一下你的系统就像一间仓库,旧Docker就像随意堆放的货箱,新Docker要入驻时,如果没做好清洁工作,很容易被绊倒。

最常见的问题包括:

  • 服务无法彻底停止:就像原始文章提到的,Docker采用双单元设计,单纯停止docker.service可能无效
  • 残留配置文件冲突:旧版的/var/lib/docker目录可能包含网络配置、卷信息等"历史包袱"
  • 依赖版本混乱:不同安装方式(apt/docker.io/docker-ce)会留下分散的依赖项

实测发现,未彻底清理的环境会导致MinIO部署时出现:

  • 9000端口被占用(即使显示未被占用)
  • 容器启动后莫名退出
  • 存储卷权限异常(特别是Ubuntu 24的AppArmor策略更严格)

2. 彻底卸载Docker的完整流程

2.1 停止服务的正确姿势

原始文章提到的基础命令确实有效,但根据我在生产环境的经验,还需要补充几个关键点:

# 完整停止方案(防止自动重启)
sudo systemctl disable --now docker.service docker.socket
sudo systemctl mask docker.socket  # 防止被其他服务唤醒

这里有个容易踩的坑:如果之前用docker-compose启动过服务,务必先进入对应目录执行:

docker-compose down  # 清理容器网络

2.2 卸载与深度清理

原始文章的卸载命令已经很全面,我再补充几个隐藏的清理点:

# 清理残留配置文件(影响新安装)
sudo rm -rf /etc/docker/daemon.json
sudo rm -rf ~/.docker/config.json

# 处理可能存在的镜像缓存
sudo rm -rf /var/cache/docker

特别注意:Ubuntu 24默认使用zsh shell的用户,需要额外清理:

rm -rf ~/.local/share/docker

2.3 验证清理效果

安装前建议执行以下检查:

# 检查进程
ps aux | grep -i docker

# 检查端口占用
sudo lsof -i :9000
sudo lsof -i :9001

# 检查挂载点
mount | grep docker

3. 最新版Docker安装优化方案

3.1 官方脚本的隐患与改进

原始文章使用的get.docker.com脚本虽然方便,但在国内环境可能遇到:

  • 下载速度慢(特别是containerd镜像)
  • 自动选择不适合的存储驱动

推荐改用阿里云镜像源:

curl -fsSL https://get.docker.com | \
sudo sh -s -- --mirror Aliyun

3.2 关键配置调整

安装后建议立即修改/etc/docker/daemon.json:

{
  "registry-mirrors": ["https://<your-aliyun-mirror>.mirror.aliyuncs.com"],
  "data-root": "/mnt/docker-data",  # 避免占用系统盘
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}

执行sudo systemctl restart docker后,验证配置:

docker info | grep -i root

3.3 Docker-Compose的现代用法

从Docker 20.10+开始,compose已成为内置插件。但要注意:

# 新旧命令对比
docker compose version  # 新式(带空格)
docker-compose version  # 旧式(已废弃)

推荐为常用命令创建别名:

echo "alias dc='docker compose'" >> ~/.zshrc
source ~/.zshrc

4. MinIO部署的进阶实践

4.1 目录结构的专业方案

原始文章的目录创建方式可以优化为:

# 标准化目录结构
mkdir -p ~/minio/{data,config,logs,backups}
chmod -R 775 ~/minio
sudo setfacl -Rdm u:$(whoami):rwx ~/minio

这样设计的好处:

  • 分离日志和数据
  • 预留备份目录
  • 通过ACL解决权限问题

4.2 增强版docker-compose.yml

在原始文章配置基础上,增加以下关键参数:

services:
  minio:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
      interval: 30s
      timeout: 5s
      retries: 3
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
        max-file: "3"
    ulimits:
      nofile:
        soft: 65536
        hard: 65536

4.3 数据持久化的陷阱

原始文章提到的卷挂载需要特别注意:

  1. 新版MinIO的config路径:最新版已改为/config
  2. 文件锁问题:如果宿主机是NTFS格式,需要添加--console-address ":9001"参数
  3. SELinux环境:Ubuntu 24可能默认启用,需要:
sudo chcon -Rt svirt_sandbox_file_t ~/minio/data

5. 常见问题排错指南

5.1 控制台无法访问

如果9001端口无法访问,按以下步骤排查:

  1. 检查防火墙:
sudo ufw status
sudo ufw allow 9001/tcp
  1. 验证容器IP:
docker inspect minio | grep IPAddress
  1. 测试容器内连通性:
docker exec -it minio curl localhost:9001

5.2 上传文件异常

遇到文件不显示或上传失败时:

  1. 检查存储目录权限:
ls -lha ~/minio/data
  1. 查看MinIO日志:
docker logs --tail 50 minio
  1. 重置存储桶策略:
docker exec minio mc anonymous set-json /data/public.json

5.3 容器自动重启

如果MinIO频繁重启,建议:

  1. 检查内存限制:
docker stats minio
  1. 调整JVM参数(在environment中添加):
environment:
  MINIO_JAVA_OPTS: "-Xms512m -Xmx1g"
  1. 启用OOM保护:
sudo sysctl -w vm.overcommit_memory=1

更多推荐