Ubuntu 从裸机到 Docker 容器化实战:安装、调优与避坑指南

发布时间:2026/9/30 3:01:35

Ubuntu 从裸机到 Docker 容器化实战:安装、调优与避坑指南 简介这份资源是面向Ubuntu新手与进阶用户的系统学习与实战指南覆盖从安装配置到开发环境搭建的完整路径。内容按新手入门、进阶优化、实战项目与资源导航分层展开入门部分讲解ISO镜像制作启动盘、UEFI与传统BIOS分区方案、apt软件源更新与终端常用命令进阶部分涉及systemd开机加速、htop资源监控、Docker容器化部署与Python虚拟环境创建实战环节给出LAMP个人博客搭建、Bash自动化脚本、Docker Compose多服务编排及Harbor私有仓库等具体案例并附官方文档、社区教程与依赖冲突、显卡驱动等常见问题处理思路。资源包为1个docx文档约21KB结构清晰、便于按需查阅。目前已有1124人学习适合希望系统掌握Ubuntu日常使用与开发环境配置的读者参考实践。1. 从一台裸机到能跑 Docker这份 Ubuntu 资源包到底装了什么很多人第一次装 Ubuntu卡住的地方根本不是分区而是装完之后不知道下一步该干什么。ISO 写进 U 盘、系统起来、能进桌面然后呢软件源没换、开发工具链没装、显卡驱动是开源 nouveau、Docker 装完还得手动加组这些事没人一次性讲清楚。这份《Ubuntu 使用教程与资源指南》就是冲着这个断层来的它把新手入门、性能调优、开发环境搭建、LAMP 部署、Docker Compose 编排、Harbor 私有仓库串成一条线从裸机安装一路铺到能跑容器化应用。适合两类人刚接触 Linux 想少走弯路的以及已经会用 Ubuntu 但环境搭得零零散散、想系统化补一遍的。下面按我实际拆包的顺序把每一步的命令、参数和翻车点讲透。2. 安装与首次配置分区方案、软件源和开发工具链2.1 分区方案怎么定/、/home、swap 的取舍资源里给的推荐方案是/30GB、/home剩余空间、swap内存的 2 倍。这个方案在 2025 年需要按场景微调。/给 30GB 是底线如果你要装 CUDA Toolkit、PyTorch 这类大块头/usr和/opt会迅速膨胀建议/给到 50GB 以上。swap给内存 2 倍是传统机械盘时代的经验现在内存普遍 16GB 起步swap 给 8GB 到 16GB 足够除非你要用休眠功能那 swap 必须大于等于内存容量。/home单独分区的价值在于重装系统时数据不丢这一点在资源里没展开但它是新手最该养成的习惯。UEFI 和传统 BIOS 的区别也要注意。UEFI 模式下需要额外分一个 512MB 的 EFI 系统分区格式选 FAT32挂载点/boot/efi。传统 BIOS 不需要这个分区但需要留 1MB 到 2MB 的保留空间给 GRUB。制作启动盘用 Rufus 时分区类型选 GPT 对应 UEFI选 MBR 对应传统 BIOS选错了机器直接不认盘。提示分区操作前先在虚拟机里走一遍确认分区表和引导模式匹配再上真机。2.2 首次配置更新源、装工具链、配中文输入法系统装完第一件事不是装软件是更新软件源。资源里给的命令是对的但没讲清楚为什么先 update 再 upgrade。sudo apt update sudo apt upgrade -y # update 刷新软件包索引upgrade 执行实际升级 # -y 自动确认批量操作时省去逐条回车apt update只更新索引不装任何东西apt upgrade才根据新索引升级已装包。跳过 update 直接 upgrade可能因为索引过期导致依赖解析失败。国内网络环境下默认源速度可能不理想常见做法是换成国内镜像源编辑/etc/apt/sources.list把archive.ubuntu.com替换为对应镜像地址然后重新apt update。接着装开发工具链sudo apt install build-essential -y # 包含 gcc、g、make、libc6-dev 等编译基础组件 # 装 CUDA、编译内核模块、pip 装带 C 扩展的包都依赖它build-essential是元包它本身不包含代码只是一组依赖的集合。很多人pip install某个包时报gcc: command not found根因就是没装这个。中文输入法方面搜狗输入法在 Ubuntu 22.04 之后的兼容性时好时坏常见做法是先用系统自带的 IBus 拼音稳定后再考虑第三方方案。装完输入法要检查/etc/environment里的GTK_IM_MODULE、QT_IM_MODULE、XMODIFIERS三个变量是否配置正确配错了表现为能切换但打不出字。2.3 软件管理apt 与图形化工具的边界资源里列了apt search、apt install、apt remove --purge三条命令这里补一个容易被忽略的点--purge和普通remove的区别。sudo apt remove --purge [软件名] # remove 只删二进制保留配置文件 # --purge 连配置文件一起删重装时不会继承旧配置 sudo apt autoremove # 清理不再被依赖的孤儿包释放磁盘空间--purge在排查配置冲突时特别有用。比如你改坏了某个服务的配置文件想回到出厂状态remove再install是没用的旧配置还在必须--purge才能彻底重置。图形化的 Ubuntu Software 和 Synaptic 适合浏览和搜索但批量操作和精确控制还是命令行更可靠。Synaptic 的优势在于能可视化依赖树排查依赖冲突时比纯命令行直观。3. 性能调优与开发环境从开机加速到 Docker 隔离3.1 开机加速systemd-analyze 定位耗时服务资源里给的systemd-analyze blame是排查开机慢的入口命令但光看 blame 不够得配合 critical-chain 才能找到真正的瓶颈。systemd-analyze blame # 按耗时降序列出所有服务的启动时间 systemd-analyze critical-chain # 显示关键启动链标出阻塞点blame列出的是每个服务自身耗时但有些服务是并行启动的单独看它耗时长不代表它拖慢了整体。critical-chain显示的是串行依赖链链上任何一个环节慢整体就慢。常见做法是先用 blame 找到耗时 top 5 的服务再用 critical-chain 确认它是否在关键路径上。确认后禁用sudo systemctl disable [服务名] # 禁止开机自启但不停止当前运行实例 sudo systemctl mask [服务名] # 彻底屏蔽连手动启动都不行适合确认永远不需要的服务disable和mask的区别在于disable只是去掉开机自启的软链接服务仍可手动startmask是创建一个指向/dev/null的链接任何启动尝试都会被拒绝。不确定是否永久需要时先用disable。3.2 Docker 安装与用户组配置资源里的一键安装脚本curl -fsSL https://get.docker.com | sh能用但生产环境我更倾向分步装方便控制版本。sudo apt install docker.io -y # 从 Ubuntu 官方源装版本可能略旧但经过兼容性测试 sudo usermod -aG docker $USER # 把当前用户加入 docker 组避免每条命令都 sudo newgrp docker # 刷新当前 shell 的组身份不重新登录就生效usermod -aG里的-a是关键漏掉它会把你从其他附加组里踢出去。加完组必须重新登录或newgrp才生效很多人加完组发现还是 permission denied就是没刷新会话。验证安装docker run hello-world # 拉取测试镜像并运行输出欢迎信息说明引擎正常 docker info | grep -i root # 确认 Docker Root Dir 位置默认 /var/lib/docker如果hello-world报错Cannot connect to the Docker daemon先检查systemctl status docker大概率是服务没起来或者 socket 权限不对。3.3 Python 虚拟环境venv 的创建、激活与依赖隔离资源里给了python -m venv myenv和source myenv/bin/activate这两条是基础但 venv 的坑在于系统 Python 版本和 pip 源。python3 -m venv myenv # 用系统 python3 创建隔离环境myenv 是目录名 source myenv/bin/activate # 激活后命令行前缀出现 (myenv)pip 和 python 指向环境内 pip install --upgrade pip # 先升级 pip旧版 pip 解析依赖可能出问题 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple # 换国内源加速下载venv 创建的环境默认不包含系统 site-packages这是好事依赖完全隔离。但如果你需要访问系统级的包比如 apt 装的 python3-numpy创建时要加--system-site-packages。退出环境用deactivate别直接关终端否则下次可能忘了自己在哪个环境里。pip freeze requirements.txt导出依赖清单换机器时pip install -r requirements.txt复现这是基本习惯。4. 实战项目LAMP 部署、Docker Compose 编排与 Harbor 仓库4.1 LAMP 栈搭建Apache、MySQL、PHP 的安装顺序与验证LAMP 是 Linux Apache MySQL PHP 的缩写资源里提到用它部署个人博客。安装顺序有讲究先装 Apache 再装 PHP 再装 MySQL因为 PHP 的 Apache 模块依赖 Apache 已存在。sudo apt install apache2 -y # 装完自动启动浏览器访问 localhost 应看到默认页 sudo apt install mysql-server -y # 装完运行安全脚本设 root 密码、删匿名用户 sudo mysql_secure_installation sudo apt install php libapache2-mod-php php-mysql -y # libapache2-mod-php 让 Apache 能解析 PHP # php-mysql 提供 PHP 连 MySQL 的驱动验证 PHP 是否被 Apache 正确解析在/var/www/html/下建一个info.php?php phpinfo(); ?浏览器访问localhost/info.php如果直接下载文件而不是渲染页面说明 PHP 模块没加载检查a2enmod php8.x是否执行。MySQL 8.0 默认 root 用户用 auth_socket 插件认证命令行sudo mysql能进但 PHP 用密码连会失败。需要改认证方式ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 你的密码; FLUSH PRIVILEGES;4.2 Docker Compose 单机编排WordPress MySQL 的配置要点资源里给了一个 Compose 片段我把它补完整并加上关键参数说明。version: 3 services: web: image: nginx:latest ports: - 80:80 volumes: - ./html:/usr/share/nginx/html depends_on: - db db: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: 123 MYSQL_DATABASE: wordpress volumes: - db_data:/var/lib/mysql volumes: db_data:depends_on只保证启动顺序不保证 db 完全就绪后 web 才启动。MySQL 初始化需要几秒web 可能在 db 还没 ready 时就尝试连接。常见做法是在应用层加重试逻辑或者用healthcheck配合condition: service_healthy。volumes里的db_data是命名卷数据持久化在 Docker 管理的区域docker compose down不会删数据但down -v会。生产环境别把 root 密码明文写在 compose 文件里用.env文件加env_file指令。4.3 Harbor 私有仓库企业级镜像存储的部署前提Harbor 不是单个二进制它本身是一组容器。部署前需要 Docker 和 Docker Compose 都已就绪然后下载 Harbor 的离线安装包解压后编辑harbor.yml。tar xzvf harbor-offline-installer-v2.x.x.tgz cd harbor cp harbor.yml.tmpl harbor.yml # 编辑 harbor.yml改 hostname、harbor_admin_password、data_volume sudo ./install.sh # 安装完成后 docker compose ps 应看到多个容器 runninghostname必须改成实际访问地址不能是localhost或127.0.0.1否则客户端推送镜像时解析不到。Harbor 默认用 HTTPS需要自签证书或正式证书跳过这步会导致docker login报 x509 错误。推送镜像前先打 tagdocker tag myapp:latest your-harbor-host/library/myapp:latest docker push your-harbor-host/library/myapp:latest5. 避坑与排查依赖冲突、驱动问题和环境变量5.1 apt 依赖冲突aptitude 的替代方案现象apt install报unmet dependencies提示一堆包互相冲突apt --fix-broken install也修不好。原因通常是混用了不同来源的源或者手动dpkg -i装过包导致依赖树断裂。解决用aptitude替代 apt它会给出多个解决方案让你选。sudo apt install aptitude -y sudo aptitude install [冲突的包名] # 它会列出接受/拒绝方案的选项按提示选择降级或替换aptitude 的优势在于它能做更复杂的依赖求解比如自动降级某个包来满足依赖。apt 遇到冲突直接报错aptitude 会尝试给出可行路径。5.2 NVIDIA 驱动ubuntu-drivers 自动安装与残留清理现象装完 NVIDIA 驱动后进不了桌面或者nvidia-smi报Driver/library version mismatch。原因通常是驱动版本和内核模块不匹配或者之前手动装过驱动没清干净。解决ubuntu-drivers devices # 列出推荐驱动版本 sudo ubuntu-drivers autoinstall # 自动安装推荐版本 sudo apt remove --purge nvidia-* # 如果之前手动装过先彻底清除 sudo apt autoremoveautoinstall选的是 Ubuntu 测试过的稳定版本不一定是最新。如果你需要特定 CUDA 版本对应的驱动得手动指定。装完必须重启不重启内核模块加载的还是旧版本。nvidia-smi和nvcc --version显示的版本可能不同前者是驱动版本后者是 CUDA Toolkit 版本两者不需要一致。5.3 环境变量配置错误PATH 覆盖与 profile 加载顺序现象改完/etc/environment或~/.bashrc后新终端里命令找不到或者 PATH 被覆盖成只剩一两个目录。原因通常是PATH写成了覆盖而不是追加或者改错了文件导致加载顺序混乱。解决追加 PATH 必须用export PATH$PATH:新路径不能直接PATH新路径。加载顺序上/etc/environment最早然后是/etc/profile再到~/.profile、~/.bashrc。改完用source刷新当前会话新开终端验证。echo $PATH # 确认当前 PATH 完整 source ~/.bashrc # 刷新当前 shell不重启终端5.4 忘记登录密码GRUB 恢复模式重置现象Ubuntu 登录密码忘了进不去系统。原因不用多说。解决开机按住 Shift 或 Esc 进 GRUB 菜单选 recovery mode进 root shell。mount -o remount,rw / # recovery 模式默认只读先改读写 passwd 用户名 # 重置密码 reboot如果是全盘加密或者 UEFI 安全启动开启recovery 模式可能受限需要先关安全启动。这个操作在物理机上有效虚拟机里同样适用。5.5 显卡驱动卸载不掉runfile 与 apt 的冲突现象apt remove nvidia-*执行完nvidia-smi还能跑或者报错说驱动正在使用。原因是用 NVIDIA 官方 runfile 装过驱动它不走 apt 的包管理apt 删不掉。解决用 runfile 自带的卸载参数。sudo /usr/bin/nvidia-uninstall # runfile 安装的驱动用这个卸载 sudo apt autoremove # 清理 apt 残留判断驱动是 apt 装的还是 runfile 装的看/usr/bin/nvidia-uninstall是否存在。存在就是 runfile 装的apt 管不了它。6. 进阶技巧用 systemd 服务固化你的自动化脚本资源里提到用 Bash 脚本做日志清理和备份但没讲怎么让它可靠地定时跑。cron 是最简单的方案但 cron 的环境变量和日志排查是黑匣子。我更推荐用 systemd timer它和系统日志集成排查方便。先写一个清理脚本/usr/local/bin/clean-logs.sh#!/bin/bash # 清理 /var/log 下 7 天前的 .log 文件 find /var/log -name *.log -mtime 7 -delete # -mtime 7 表示修改时间超过 7 天 # -delete 直接删除测试时先用 -print 确认范围给它执行权限然后创建 service 和 timer# /etc/systemd/system/clean-logs.service [Unit] DescriptionClean old log files [Service] Typeoneshot ExecStart/usr/local/bin/clean-logs.sh# /etc/systemd/system/clean-logs.timer [Unit] DescriptionRun clean-logs daily [Timer] OnCalendardaily Persistenttrue [Install] WantedBytimers.targetOnCalendardaily表示每天零点触发Persistenttrue保证如果机器在触发时间关机开机后会补跑一次。启用sudo systemctl daemon-reload sudo systemctl enable --now clean-logs.timer systemctl list-timers | grep clean # 确认 timer 已激活并查看下次触发时间排查时用journalctl -u clean-logs.service看每次执行的输出比翻/var/log/syslog里 cron 的碎片记录清晰得多。验证脚本逻辑时先把-delete换成-print确认找到的文件列表符合预期再真正删除。这个习惯我每次写清理脚本都强制走一遍删错文件的后悔药可不好找。从那以后我每次配定时任务都先用-print跑一遍确认范围再换成实际动作最后用 systemd timer 固化。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/9/30 3:01:35

特殊符号引发换行失控?前端文本断行完整修复指南

下午四点收到运营反馈,页面列表里几个标题在移动端排得七零八落。我打开手机一看,标题里的斜杠、井号、连续点号全在捣乱,中文被顶到下一行,地址栏一样的长串字符直接戳出卡片边框。用一句话概括就是:文字一遇到特殊符…

2026/9/30 3:01:35

Unity3D Shader动态屏幕遮罩:跟随目标开洞的实战指南

简介:这份资源面向Unity3D开发者和Shader学习者,聚焦动态屏幕遮罩效果的实现,可用于游戏视野限制、暗黑探索、聚光灯式可视范围等场景。资源以PDF文档形式呈现,压缩包内共1个文件,体积约66KB,内容围绕Shade…

2026/9/30 3:01:35

Unity3D动态屏幕遮罩实战:Shader坐标空间、纹理生成与性能优化

简介:这是一份面向Unity3D开发者与Shader学习者的技术资料,聚焦于用Shader实现动态屏幕遮罩效果,适合具备一定渲染管线基础、希望掌握屏幕后处理与遮罩交互的中级开发者参考。资源以PDF文档形式呈现,压缩包内共1个文件&#xff0c…

2026/9/30 4:16:38

数据字典从手工到自动化:元数据采集、字段注释与变更治理实战

1. 数据字典到底是什么:先从一个真实的混乱现场说起数据字典这个词,第一次听到的人十有八九会以为它跟《新华字典》沾点亲戚关系,或者以为是把公司所有数据汇总成一个大表格。我在带新人时最常说的一句话是:你先别急着理解定义&am…

2026/9/30 4:16:38

AI工程化实战:从零构建可交付AI系统

1. 这不是“搭积木”,而是亲手锻造AI系统的完整工程链“AI Engineering from Scratch”——看到这个标题,很多人第一反应是:“哦,又一个从零写个神经网络的教程?”但如果你真这么想,就完全误判了它的分量。…

2026/9/30 4:16:38

Python与Java核心差异解析:语法、运行机制与生态选型指南

做了七八年后端,又带了几年新人,最常听到的问题不是“怎么写接口”,而是“老大,我到底该学Python还是Java?”如果你也在刷这两门语言的入门教程、面试题、环境配置,恭喜你,这篇就是为你准备的。…

2026/9/30 4:16:38

闹钟响后如何选择起床?用行为脚本和睡眠惯性破解回笼觉难题

1. 闹钟响后的那个瞬间,你其实正站在十字路口1.1 为什么说这是“一天中最重要的一秒钟”闹钟响后的前五秒,大部分人还分不清自己是睡着了还是醒着。伸手摸到手机,按掉铃声,然后大脑里瞬间弹出两条路:一条是再躺十分钟&…

2026/9/30 4:16:38

C语言手写哈希表创建原理与教学实践

1. 项目概述:从“icoding数据结构——哈希表创建(详细注释)”看教学级哈希实现的本质“icoding数据结构——哈希表创建(详细注释)”这个标题,一眼就能看出它不是工业级系统里的哈希容器,而是面向…

2026/9/30 4:11:38

多线程卡死排查与治理:四招定位死锁、线程池与阻塞点

多线程程序最让人头疼的不是跑不起来,而是跑着跑着就不动了。进程还在,端口还连着,CPU 曲线平得像一条直线,日志停在某个时间点之后再没吐过一个字,重启一下立刻恢复正常,过几个小时又来一遍。这种"假…

2026/9/29 11:07:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/29 21:48:03

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 0:01:22

MATLAB+Yalmip+CPLEX实战:综合能源系统优化调度全流程解析

做综合能源系统优化调度这活儿,最痛苦的不是建模本身,而是模型写完之后不知道该怎么求解。看论文里轻飘飘一句“采用Yalmip调用CPLEX求解”,自己上手时却往往卡在环境配置、变量声明、约束写法和求解状态判读上,一耗就是两三天。这…

2026/9/30 0:01:22

I3C比I2C快10倍?RK3576实战:速率、DTS配置与混合总线避坑指南

I3C 比 I2C 快 10 倍?这句话在嵌入式群里传了很久,每次都能吵出一堆截图。前段时间我正好在 RK3576 上调板级 I3C 接口,从控制器寄存器一路摸到 Linux DTS 配置,踩了不少坑,也把这笔速度账彻底算明白了。本文就用 RK35…

2026/9/30 0:01:22

字符串转对象:JSON.parse、new Function与URLSearchParams

“字符串转对象”这几个字,我在技术群里见过的问法至少有十几种:有人拿着一串{a:1,b:2}说 JSON.parse 直接报错,有人要从 URL 里抠出参数,还有人只是想把abc变成能挂属性的东西。js 这门语言里,字符串和对象之间的转换…

2026/9/29 3:53:39

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/29 9:46:12

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/29 6:36:14

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑