《别再被环境问题折磨了!Docker 新手极简入门指南》

《别再被环境问题折磨了!Docker 新手极简入门指南》 《别再被环境问题折磨了Docker 新手极简入门指南》第一部分引言 —— 为什么要学 Docker1. 这三个瞬间你肯定经历过崩溃一代码在我电脑上跑得好好的怎么到你那儿就红屏报错了崩溃二新电脑配环境配到怀疑人生一下午没了一行代码没写。崩溃三测试环境稳如老狗一上生产环境秒变事故现场。根源就四个字环境不一致。2. Docker 是干嘛的一句话把应用和它依赖的环境一起装进一个箱子里。以前你在 Windows 写代码扔到 Linux 服务器上水土不服。现在连箱子带应用一起扔过去服务器只要有 Docker就能直接跑。从此在我电脑上是好的 在任何电脑上都是好的。3. 它和虚拟机有什么不一样虚拟机像搬一整套房子带门带窗带装修又重又慢。Docker 容器像搬一个集装箱只装货不装墙轻便、秒启动、省资源。一句话总结虚拟机虚拟的是硬件Docker 虚拟的是操作系统。第二部分三大核心概念一张图彻底讲透一句话记住三个词镜像Image 菜谱只读模板不能改容器Container 做好的菜能跑、能吃、能删仓库Registry 菜谱网站存菜谱、下菜谱用做菜彻底讲透概念通俗理解技术含义你能对它做什么镜像菜谱只读的模板包含代码环境依赖看、下载、不能改容器按菜谱做的菜镜像跑起来的运行实例启动、停止、删除、隔离仓库下厨房/美食杰存镜像的云端硬盘pull下菜谱、push传菜谱关键认知镜像不动容器随便动。 你改的是容器里的内容不影响镜像。 想持久化把容器腌成新镜像 → push到仓库。动作关系一张图看懂pull下载菜谱 Docker Hub云盘 push上传菜谱 ↓ ┌─────────────────────┐ │ 镜像只读菜谱 │ ← 模板不能改 └──────────┬──────────┘ │ docker run照着菜谱做菜 ↓ ┌─────────────────────┐ │ 容器一盘菜 │ ← 运行实例能改能删能隔离 └─────────────────────┘ │ docker commit把菜腌成新菜谱 ↓ 回到镜像第三部分Docker 安装与环境准备在 Linux 上安装Ubuntu# 更新软件包 sudo apt update ​ # 安装 Docker sudo apt install -y docker-ce docker-ce-cli containerd.io ​ # 启动 Docker 并设置开机自启 sudo systemctl enable --now docker ​ # 验证安装 docker --version在 Linux 上安装CentOS 7# 卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common \ docker-latest docker-latest-logrotate docker-logrotate docker-engine ​ # 安装依赖并添加官方仓库 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo ​ # 安装 Docker sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin ​ # 启动并设置开机自启 sudo systemctl start docker sudo systemctl enable docker ​ # 验证安装 docker --version在 Windows 和 Mac 上安装访问 Docker 官网下载Docker Desktop for Windowshttps://www.docker.com/products/docker-desktop/ 下载链接官网 Install Docker Desktop on Windows | Docker Docs链接中也有详细的安装教程如果有需要可以直接看官网的文档如果是mac可以下载上面的后续的镜像配置是一样的双击运行安装程序按向导完成安装安装时建议勾选“使用 WSL 2 而非 Hyper-V”性能更好安装完成后启动 Docker Desktop等待右下角鲸鱼图标稳定配置国内镜像a. 左侧菜单选中Docker Engineb. 右侧大文本框粘贴国内镜像 JSON 配置c. 右下角Apply Restart保存并重启 Docker 生效可直接复制的国内镜像完整配置{ registry-mirrors: [ https://docker.mirrors.ustc.edu.cn, https://hub-mirror.c.163.com, https://mirror.ccs.tencentyun.com, https://docker.xuanyuan.me ], builder: { gc: { defaultKeepStorage: 20GB, enabled: true } }, experimental: false, features: { buildkit: true } }第四部分快速上手 —— 运行你的第一个容器一、拉取镜像把菜谱下载到本地docker pull nginx:latest从 Docker Hub 拉取最新版 Nginx 镜像你会看到一层层下载的进度条。二、运行容器把菜谱做成菜docker run -d --name my-web -p 8080:80 nginx这条命令拆开看参数含义大白话docker run运行一个容器照着菜谱做菜-d后台运行detach厨房里偷偷做不占你屏幕--name my-web给容器起个名字这盘菜叫 my-web-p 8080:80端口映射访问你电脑的 8080 端口 → 转发到容器的 80 端口nginx用哪个镜像用 Nginx 这个菜谱端口映射是重点容器内部跑在 80 端口但你看不见它。-p 8080:80把宿主机的 8080 映射到容器的 80这样你访问自己电脑的 8080 就等于访问了容器。三、见证奇迹打开浏览器访问http://localhost:8080看到Welcome to nginx页面 →恭喜你的第一个容器跑起来了第五部分Docker 必背命令清单 场景一镜像操作找食材、下锅前准备命令白话解释最常用时机docker search 镜像名去 Docker Hub 仓库里搜一下有没有这个镜像不确定镜像全名时先搜搜看docker pull 镜像名:标签把镜像从网上下载到本地电脑第一次用某个镜像或者本地没有时docker images看看本地电脑上已经存了哪些镜像想确认镜像是否下载成功或看占了多少硬盘docker rmi 镜像ID或名称删除本地某个镜像rm image 的缩写镜像太旧没用或者占空间太大docker tag 旧镜像名:标签 新镜像名:标签给镜像起个别名/打标签准备把自己做的镜像推到仓库前 举个实际流程# 1. 搜一下有没有 Python 相关的官方镜像 docker search python ​ # 2. 拉取 Python 3.11 版本带-slim后缀的是精简版体积小 docker pull python:3.11-slim ​ # 3. 查看本地镜像列表确认拉取成功 docker images ​ # 输出大概长这样 # REPOSITORY TAG IMAGE ID CREATED SIZE # python 3.11-slim abc123def456 2 weeks ago 125MB 场景二容器生命周期从启动到删除的全流程1. 创建并运行容器最重要、参数最多docker run [参数] 镜像名 [容器启动后要执行的命令]新手最容易懵的参数我单独拆开说参数全称/含义大白话-ddetach分离模式容器在后台静默运行不占用当前终端窗口-itinteractive TTY交互式运行让你能像 SSH 进服务器一样操作容器内部常见于调试--name 名字给容器起名不起名 Docker 会随机给一个后期不好记强烈建议自己起-p 宿主机端口:容器端口publish 端口映射把容器里的端口“暴露”给外面比如-p 8080:80表示访问电脑的 8080 就等于访问容器里的 80-v 宿主机路径:容器路径volume 数据卷挂载把电脑上的文件夹映射进容器用于数据持久化或实时改代码--restart always重启策略容器意外挂了Docker 会自动帮你拉起来生产环境必备--rmremove容器停止后自动删除适合跑一次性临时任务比如编译、测试 两条经典运行命令新手直接抄作业# 【场景A】跑一个长期在后台运行的 Web 服务比如 Nginx docker run -d --name my-nginx -p 8080:80 --restart always nginx # 【场景B】临时进一个 Ubuntu 容器做测试玩完就删适合练手 docker run -it --rm --name test-ubuntu ubuntu bash注意第二条命令结尾的bash意思是容器启动后直接打开一个 bash 终端让你在里面敲命令。2. 管理容器状态启动 / 停止 / 重启 / 删除命令大白话特别提醒docker ps只看正在运行的容器刚学的时候要养成随时敲的习惯docker ps -a看所有容器包括已停止的容器不见了先敲这个找找docker stop 容器名优雅地停止容器给时间保存数据类似电脑正常关机docker kill 容器名粗暴地强制停止容器类似直接拔电源慎用docker start 容器名启动一个已停止的容器注意是 start不是 runrun 是新建docker restart 容器名重启容器相当于 stop start改完配置后常用docker rm 容器名删除容器必须已停止想删正在跑的加-f强制删docker logs 容器名查看容器输出的日志容器出问题第一排查命令docker logs -f 容器名实时滚动查看日志-f follow看实时请求日志按 CtrlC 退出 场景三进入容器内部排查故障必备新手最慌的时候就是“容器里到底什么情况”这时候要会“钻进去”看。docker exec -it 容器名 /bin/bash # 或者如果容器里没有 bash就用 sh docker exec -it 容器名 /bin/sh白话解释exec是在运行的容器里额外执行一条命令-it让你获得一个交互式终端。进去之后你可以ls看文件、cat看配置、ps看进程就像登录了一台小服务器。 完整实操# 1. 先确保 Nginx 容器在运行 docker start my-nginx # 2. 钻进容器内部 docker exec -it my-nginx bash # 3. 进去后看看 Nginx 的首页文件在哪 ls -l /usr/share/nginx/html # 4. 想退出直接敲 exit 回车 exit⚠️新手常见误区千万不要用docker attach来进容器那个是进主进程的容易卡死终端。记住只用docker exec -it。 场景四清理与维护给电脑腾空间Docker 用久了镜像、容器、数据卷、缓存会吃掉大量硬盘下面这组命令是“清道夫”。命令作用风险等级docker system df查看 Docker 占了多少硬盘类似电脑的磁盘管理 无风险只看docker system prune一键清理停止的容器、无用的镜像、未使用的网络 中等会询问确认docker system prune -a更激进连没有正在运行的镜像都删 谨慎可能删掉你以后要用的docker container prune只删停止的容器 放心用docker image prune只删没用的镜像 中等 推荐新手每周执行一次安全清理docker system prune # 会提示WARNING! This will remove... 输入 y 确认 第五部分总结速查表一图流为了方便你做成一张长图或思维导图我把最最核心的命令浓缩成下边这个表插在第五部分末尾我想做什么敲这个命令拉取镜像docker pull nginx查看本地镜像docker images后台跑个服务docker run -d --name web -p 8080:80 nginx临时进系统调试docker run -it --rm ubuntu bash查看运行中的容器docker ps查看所有容器docker ps -a看日志docker logs -f 容器名停止容器docker stop 容器名启动容器docker start 容器名删除容器docker rm 容器名钻进容器内部docker exec -it 容器名 bash查看硬盘占用docker system df一键清理垃圾docker system prune第六部分数据持久化 —— 让数据不随容器消失新手必看绝大多数Docker新手都会踩一个致命坑误以为容器内的文件、配置、业务数据是永久保存的。Docker的核心设计特性之一就是容器临时性容器本质是基于镜像启动的临时运行环境所有读写操作默认都只存在于容器的临时文件系统中。一旦执行docker rm 删除容器、容器意外崩溃、重新部署新版本容器容器内部产生的所有数据数据库数据、修改的配置、自定义文件会全部彻底清空无法恢复。为了解决容器数据丢失问题Docker 官方提供了数据卷Volume机制实现容器数据持久化。简单理解把容器里需要永久保存的数据“搬运”到宿主机本地存储脱离容器独立存在。无论容器停止、重启、删除、重建只要宿主机的存储文件还在数据就不会丢失新容器可以直接复用原有数据。Docker 数据持久化主流分为两种方式分别适配开发环境和生产环境各司其职、场景明确。两种持久化方式详解新手必分清绑定挂载开发用 把电脑上的一个文件夹直接“插”到容器里当U盘用。你在电脑上改代码容器里立马变实时刷新不用重启。适合写代码时边改边看效果。命名数据卷生产用 让Docker自己创建一个专门的大仓库来存数据你不用管它放在电脑哪里。数据很安全可以整体备份或搬家适合上线后的正式项目比如存数据库。新手该选哪个看这张表对比项绑定挂载开发命名数据卷生产怎么用-v 你电脑的路径:容器路径先docker volume create创建再挂载修改文件直接在电脑上改容器立刻同步不能手动直接改需要通过容器操作优点实时生效调试超方便数据安全能迁移适合多台服务器缺点换台电脑可能路径不对不适合正式环境不适合频繁改文件本地开发会麻烦给你的选择建议如果是在自己电脑上写代码、调页面→ 用绑定挂载如果是要上线运行存用户数据或数据库→ 用命名数据卷手把手实操Nginx 挂载持久化演示直观可见效果我们用最直观的 Nginx 网页服务做演示通过绑定挂载实现本地文件修改、容器网页实时更新同时验证数据持久化效果。步骤1创建本地挂载目录在宿主机创建专门存放Nginx网页文件的文件夹用于和容器映射# 创建本地网页目录 mkdir -p ~/nginx-html # 进入目录 cd ~/nginx-html步骤2自定义本地网页文件创建自定义 index.html 页面替代Nginx默认首页echo h1Docker 数据持久化测试修改本地文件实时生效/h1 index.html步骤3启动带挂载的Nginx容器# 核心挂载命令本地目录映射容器网页目录 docker run -d \ --name nginx-volume-demo \ -p 8080:80 \ -v ~/nginx-html:/usr/share/nginx/html \ --restart always \ nginx步骤4验证实时同步效果浏览器访问localhost:8080可以看到我们自定义的网页内容本地直接修改~/nginx-html/index.html文件内容无需重启容器、无需刷新服务直接刷新浏览器页面内容立即更新。步骤5验证数据持久化核心删除当前Nginx容器docker rm -f nginx-volume-demo此时容器已彻底销毁但本地nginx-html文件夹的文件完全保留重新启动新的Nginx容器挂载同一个本地目录访问页面之前自定义的内容完全保留没有丢失。五、两种挂载方式快速总结挂载方式核心命令适用场景核心特点绑定挂载-v 本地路径:容器路径本地开发、调试代码实时同步、手动改文件方便、环境耦合高命名数据卷docker volume create 卷名生产环境、数据库存储Docker托管、数据安全、易迁移、稳定性强第七部分Docker Compose —— 搞定多容器协作先来感受一个真实场景 假设你要跑一个完整的博客项目需要Nginx前端 Python/Java后端 MySQL数据库 Redis缓存四个容器。如果每个都用docker run去启动你要敲多少参数端口映射、数据卷挂载、网络连接……光是记这些命令就要疯掉。更崩溃的是万一服务器重启了你要按什么顺序手动启动这 4 个容器先起数据库再起后端最后起前端——步骤错了服务就起不来。Docker Compose 就是来解决这个问题的。你只需要写一个docker-compose.yml配置文件把所有的容器定义、依赖关系、网络配置都写进去然后执行一条命令——所有容器就按照正确的顺序、正确的配置一键全部启动。Compose 让你像“点菜”一样把要用的容器和服务一次性全部列在菜单YAML 文件上然后服务员Compose 命令帮你一次性全部端上来。编写docker-compose.yml核心配置文件version: 3.8 services: # -------- 服务1Web 应用 -------- web: build: . # 从当前目录的 Dockerfile 构建镜像 ports: - 5000:5000 # 把宿主机的 5000 映射到容器的 5000 volumes: - .:/app # 挂载当前代码目录方便开发时热更新 depends_on: - redis # 声明依赖 redis启动时会先起 redis environment: - FLASK_ENVdevelopment # 设置环境变量可选 # -------- 服务2Redis 缓存 -------- redis: image: redis:alpine # 使用轻量级的 Redis 镜像alpine 版本很小 ports: - 6379:6379 # 暴露 Redis 端口调试时可用 restart: always # 意外挂了自动重启 volumes: - redis_data:/data # 挂载数据卷保存 Redis 数据 # -------- 定义数据卷在文件最外层 -------- volumes: redis_data: # 声明一个名为 redis_data 的数据卷 常用 Compose 命令全清单一个表搞定命令大白话对照原生 Docker 命令docker-compose up -d后台启动所有服务首次会先 build 镜像类似多个docker rundocker-compose up --build强制重新构建镜像后再启动改了 Dockerfile 后必用docker-compose down停止并删除所有容器但数据卷默认保留类似批量docker stopdocker rmdocker-compose down -v停止并删除所有容器同时删除数据卷数据会丢彻底清理慎用docker-compose ps查看当前项目下所有容器的状态类似docker ps -adocker-compose logs -f 服务名查看某个服务的实时日志类似docker logs -fdocker-compose exec 服务名 bash进入某个容器的内部不需要记容器ID类似docker exec -itdocker-compose restart 服务名重启某个服务改配置后常用docker-compose stop 服务名停止某个服务不用全部停docker-compose start 服务名启动某个服务与 stop 搭配使用docker-compose build重新构建所有服务的镜像不启动改 Dockerfile 后先执行这个docker-compose config验证 yml 文件格式是否正确遇到启动报错时先跑这个检查 最常用的三板斧新手记住这三个就够了# 启动 docker-compose up -d # 看状态 docker-compose ps # 停止并清理 docker-compose down 提示新版 Docker Desktop 和 Docker Enginev20.10中docker compose无横线已内置为子命令功能等同于docker-compose。如果你的环境中docker-compose提示命令找不到试试用docker compose代替。第八部分总结与下一步 回顾核心收获这篇文章带你走完了 Docker 从零到上手实操的完整路径镜像 菜谱模板容器 运行中的实例仓库 存镜像的云端docker run是一切容器的起点掌握-d、-p、-v、--name四个参数就够日常使用docker exec -it是排查问题的入口容器出问题先钻进去看数据卷Volume让数据不随容器消失开发用绑定挂载生产用命名数据卷Docker Compose一键编排多容器告别冗长的docker run命令串 建议的下一步阶段学习目标预计时间第 1 周把本文所有命令亲手敲一遍2-3 小时第 2 周写一个自己的Dockerfile构建镜像4-5 小时第 3 周用 Docker Compose 部署一个完整的项目1 天第 1 个月学习 Docker 网络、多阶段构建、资源限制1-2 周记住这句话Docker 不难难的是动手。把本文的每条命令都敲一遍你就超过了 80% 的收藏从不看的人。如果这篇文章对你有帮助欢迎点赞、收藏、转发。有任何问题欢迎在评论区交流讨论