新闻详情

新闻详情

首页 / 资讯中心 / 详情

Docker零基础入门:镜像、容器、数据卷与Compose编排实战

发布时间:2026/9/28 22:36:42来源:尧图网络
Docker零基础入门:镜像、容器、数据卷与Compose编排实战
说实话我第一次接触 Docker 是被“逼”的。当时领导丢给我一个老项目说另一台服务器环境崩了让我一天内把服务重新跑起来。我对着安装文档装了整整半天 Python、MySQL、Redis、Nginx各种版本冲突最后连启动脚本都是乱的。同事看我一脸生无可恋随手甩了三行命令十分钟后服务就起来了。那三行命令里全是 docker。那一刻我就意识到容器化不是“高 P 才需要学的东西”而是每个开发、运维、甚至测试迟早都要补的必修课。这篇内容就是照着“零基础”来写的。不堆术语不扯底层原理我会把镜像、容器、数据卷这些概念用最土的大白话说清楚再带着你完成 Windows / Linux 下的安装跑通 Nginx、MySQL 8.0、Redis 主从最后再讲 Compose 编排和常见排错。你不需要任何 Docker 基础只需要一台能上网的电脑和半小时耐心。1. Docker 到底是什么用一次“搬家”理解镜像、容器和仓库1.1 镜像、容器、仓库的通俗理解很多人一上来就被“镜像”“容器”“仓库”这仨词吓住了其实它们之间的关系拿装修房子来类比特别合适。镜像Image就是一张“装修图纸 全套建材清单”。它把操作系统的一部分、运行时、依赖库、配置文件全部打成一个只读的模板谁拿到这个模板都能盖出完全一样的房子。容器Container就是按照这张图纸实际装修出来的房间你可以住进去、改家具、写文件但房间本身是从图纸复制出来的。仓库Registry就像是房产平台或者图纸库你可以在上面下载别人上传的“全套装修方案”也可以把自己做的方案传上去分享。还有一个关键概念叫 Dockerfile。某种意义上它就是“图纸的生产过程记录”。假设你需要在某个基础镜像上装一堆依赖、改一堆配置这些操作写成 Dockerfile 后每次构建都会按同样的流程重新执行一遍结果就是一份可重复的镜像。这也是 Docker 能保证“换台机器结果一样”的根本原因。从技术角度说镜像是由一层一层的只读文件系统叠加起来的容器启动时会在这些只读层上挂一层可写层。你改容器里的文件改的只是可写层底层镜像没动。这也是为什么容器被删了以后你改过的东西也一起没了——这一点后面讲数据卷时会重点展开。1.2 三个让你离不开 Docker 的真实场景第一个场景是“环境一致性”。“在我电脑上是好的”大概是开发圈流传最广的梗。我之前有一个项目本地跑得好好的部署到服务器上就报缺库、缺模块折腾一晚上发现是服务器上某个系统库版本太新把兼容性搞坏了。用 Docker 之后开发、测试、生产都是同一个镜像连基础系统都锁死在同一个版本里这类“灵异事件”直接消失。第二个场景是“快速交付与复现”。新同事入职第一天与其让他照着几十页文档手动装环境不如直接给他一个 compose 文件。一条命令拉起来整个项目的依赖环境全齐。换服务器也一样docker save 导出镜像拷过去 docker load 导入十分钟完成“搬家”。我自己后来给公司的项目做迁移基本不再碰“手动装环境”这条路。第三个场景是“资源隔离和多版本共存”。同一个服务器上同时跑 MySQL 5.7 和 MySQL 8.0、Redis 6 和 Redis 7在传统方式下是件头疼事端口、目录、配置全要小心处理。但用容器就好办了每个容器有自己独立的文件系统、网络命名空间和配置环境只要你把端口映射错开它们就能井水不犯河水地共存。1.3 先明确零基础需要掌握到什么程度很多新手容易用力过猛一上来就啃《Docker 实战》、研究容器网络底层原理、学 Kubernetes结果半个月下来连镜像都没跑起来。我的建议是如果你只是想把 Docker 用到日常项目和部署中先掌握这些东西就够了会从仓库拉取镜像、运行和删除容器理解端口映射、数据卷、环境变量这三个核心参数会用 docker logs 和 docker exec 看日志、进容器排查会写简单的 Dockerfile 和 docker-compose.yml。至于容器网络底层、镜像分层优化、安全加固、K8s 调度这些都是后话。先把上面四件事练熟你已经能解决 80% 的实际问题了。基础打牢之后你会发现那些所谓的高深内容不过是在这四件事上做延伸而已。2. 第一道坎在不同操作系统上把 Docker 装起来2.1 Windows 10/11Docker Desktop WSL2 完整安装流程Windows 上最省事的方式是用 Docker Desktop但前提是 WSL2 和 Windows 虚拟机平台都打开。建议按下面的顺序操作第一步检查虚拟化是否开启。打开“任务管理器 - 性能”看左下角“CPU - 虚拟化”这一栏必须是“已启用”。如果显示“已禁用”需要进 BIOS 开启 Intel VT-x 或 AMD-V。很多新手卡在“virtualization support not detected”这个报错九成都是这一步没做。第二步安装 WSL2。以管理员身份打开 PowerShell 或 CMD执行wsl --install。如果系统比较旧也可以手动开启“适用于 Linux 的 Windows 子系统”和“虚拟机平台”两个功能然后重启。装完后建议执行wsl --set-default-version 2确保用的是 WSL2 而不是 WSL1。第三步下载并安装 Docker Desktop。安装过程中它会自动检测 WSL2装完以后首次启动可能会提示需要更新 WSL 内核按提示操作即可。启动后右下角托盘会出现 Docker 图标等鲸鱼图标稳定下来说明引擎起来了。这里要提醒一句如果你启动 Docker Desktop 后立刻在终端敲 docker 命令很可能会遇到 “failed to connect to the docker api at npipe:////./pipe/dockerDeskto…” 这类报错。这通常只是 Docker Desktop 还没完全启动等几秒钟再敲或者彻底退出重开一次。验证是否成功打开 PowerShell 或 CMD执行docker --version docker run hello-world如果能看到一堆英文说明最后出现 “Hello from Docker!”说明安装成功了。2.2 Ubuntu/Debian用 apt 快速安装Ubuntu 上安装 Docker 有两类方式。一类是直接用系统自带源sudo apt update sudo apt install -y docker.io sudo systemctl enable --now docker这种方式最快但镜像版本可能不是最新的对小白反而友好因为稳定、少坑。如果想要最新版 Docker Engine需要先配置官方源再安装 docker-ce。不过对零基础来说不是非要追求最新版能用、稳定才是第一位的。装完以后先验证一下sudo docker run hello-world如果权限没配置每条命令前面都要加 sudo。不想每次加 sudo可以执行下面两条命令把当前用户加进 docker 组sudo usermod -aG docker $USER newgrp docker退出终端重新登录后就不用再敲 sudo 了。这一步一定要做不然后面使用体验会非常难受。2.3 CentOS/RHEL安装 Docker CE 并配置开机自启CentOS 的安装方式和 Ubuntu 不太一样老版本默认源里没有 docker需要配置 docker-ce 的软件源。先装基础工具sudo yum install -y yum-utils然后添加仓库并安装 docker-cesudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo yum install -y docker-ce docker-ce-cli containerd.io启动并设置开机自启sudo systemctl start docker sudo systemctl enable docker验证方式同样是sudo docker run hello-world。需要说明的是CentOS 7 默认内核版本比较老有些新版 Docker 功能可能需要升级内核或者检查兼容性。和 Ubuntu 一样装完后建议立刻把当前用户加入 docker 组避免后续所有命令都得带 sudo。2.4 安装后的基础自检hello-world 到底在干什么docker run hello-world看似简单背后其实走了一整条完整流程。你可以把这条命令拆成四步理解本地有没有 hello-world 这个镜像没有去仓库拉取拉下来以后Docker 根据镜像创建一个容器容器启动后执行镜像内置的打印程序输出提示文字程序执行完毕容器状态变成 Exited生命周期结束。这条命令同时验证了你本地的 Docker 客户端能连上引擎、网络能访问仓库、容器运行链路是通的。如果这一步失败先不要急着往下学优先排查安装和网络问题。顺手可以敲几个热身命令感受一下docker images # 查看本地已有镜像 docker ps -a # 查看所有容器包括已经退出的 docker system df # 查看磁盘占用概览这些命令属于日常最高频的“老三样”后面所有章节基本都离不开它们。3. 第一次实操用三条命令跑起 Nginx、MySQL 8.0 和 Redis 主从3.1 Nginx理解端口映射、后台运行与日志跑一个 Nginx 容器是理解 Docker 运行机制最好的切片。执行docker run -d --name nginx-test -p 8080:80 nginx:latest拆开看参数-d后台运行不占用当前终端。如果少了这个参数容器会以前台方式运行CtrlC 一停容器就停了--name nginx-test给容器起个名字方便后面管理-p 8080:80把宿主机的 8080 端口映射到容器内的 80 端口。因为容器有自己独立的网络空间宿主机的 80 端口不一定空闲映射成 8080 可以避免冲突。访问http://localhost:8080就能看到 Nginx 默认页面nginx:latest指定镜像名和标签latest 表示默认最新版。这里解释一下为什么容器内是 80。Nginx 镜像的默认配置就是监听 80 端口容器内部不用改你只需要决定外面的哪个端口对应进来。这个“宿主端口:容器端口”的映射格式后面会反复出现建议一下记牢。接下来可以看日志docker logs nginx-test浏览器访问一次后再执行docker logs nginx-test你会在日志里看到 200 状态码和访问记录。查问题先看日志这是容器时代最重要的调试习惯。如果你想把自己的网页挂进去可以用-v参数做目录挂载docker run -d --name nginx-site -p 8081:80 -v /my-web:/usr/share/nginx/html nginx这里把宿主机/my-web目录映射到容器内 Nginx 的默认网站目录以后改宿主机文件容器里立刻生效不用重新构建镜像。3.2 MySQL 8.0数据卷与容器重建后的数据保留跑数据库容器最核心的一条规则是数据必须通过数据卷持久化。先看一条典型命令docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORD123456 \ -v mysql8-data:/var/lib/mysql \ mysql:8.0-e MYSQL_ROOT_PASSWORD是环境变量用来初始化 root 密码首次启动时必填。-v mysql8-data:/var/lib/mysql这一步最关键它声明了一个叫mysql8-data的具名数据卷把容器内部的 MySQL 数据目录映射到卷里。MySQL 8.0 镜像默认把数据存在/var/lib/mysql如果不挂卷你删掉容器后数据就跟着烟消云散挂了卷哪怕容器被删只要卷还在用同样的配置重新建一个容器数据就还在。这个“容器可以被随意删除重建但数据卷必须长命百岁”的认知是使用 Docker 跑有状态服务的前提。进入容器执行 MySQL 命令也很简单docker exec -it mysql8 mysql -uroot -p输密码后就能进入 MySQL 的交互界面。docker exec的意思是在容器内部执行命令-it表示进入交互模式后面会经常用到。额外提醒一个 8.0 的小坑MySQL 8.0 默认认证插件是caching_sha2_password有些老版本的客户端和可视化工具连不上去。遇到Authentication plugin caching_sha2_password cannot be loaded之类的报错可以在容器内执行下面这条 SQL 修改认证方式ALTER USER root% IDENTIFIED WITH mysql_native_password BY 123456;3.3 Redis 主从自定义网络与容器间通信Redis 主从是理解容器网络的好素材。如果直接用默认 bridge 网络两个容器之间的访问得靠 IP 或者额外配置但 Docker 提供了自定义网络同一网络内的容器可以直接用容器名互相访问这个特性比 IP 方便得多也符合微服务时代的服务发现思路。先创建一个自定义网络docker network create redis-net启动主节点docker run -d --name redis-master --network redis-net -p 6379:6379 redis:7 redis-server --appendonly yes启动一个从节点通过--replicaof指向主节点docker run -d --name redis-slave --network redis-net -p 6380:6379 redis:7 redis-server --replicaof redis-master 6379注意看--replicaof redis-master 6379这里填的不是 IP而是主节点的容器名。Docker 内置的 DNS 会帮我们解析到对应容器。把宿主机的 6380 端口映射到从节点的 6379这样从外部也能访问。验证主从状态docker exec -it redis-master redis-cli info replication输出里connected_slaves:1表示从节点已经连上来。这套“创建网络 - 起主节点 - 起从节点”的流程其实也是后面用 Compose 编排多服务的基础模板。3.4 容器生命周期管理停止、删除、进入容器跑起来三个容器之后你已经算半只脚入门了。剩下这些高频命令值得记熟docker stop nginx-test # 停止容器 docker start nginx-test # 启动已停止的容器 docker restart nginx-test # 重启容器 docker ps # 查看运行中的容器 docker ps -a # 查看所有容器含已停止 docker rm nginx-test # 删除容器需要先停止这里容易混淆的是镜像和容器docker images查的是镜像docker ps查的是容器。镜像不会被删掉除非你主动执行docker rmi容器只是镜像的实例可以随手删、随手建。调试或改配置时经常需要进容器里看一眼docker exec -it nginx-test bash容器里可能没有 vim、curl 这些工具这是正常现象。毕竟镜像追求最小化缺什么临时装或者把容器删了换个带调试工具的镜像。这种“用完即走、重建如新”的理念一开始可能不习惯但用顺手之后会觉得特别清爽。4. 镜像加速、镜像仓库与镜像瘦身4.1 拉镜像太慢配置 registry mirror新手最容易碰到的问题就是拉镜像特别慢尤其是大镜像下载动不动就卡住。Docker 默认从 Docker Hub 拉取在国内网络环境下速度不太理想。解决办法是给 Docker 配置镜像加速地址也就是 registry mirror。在 Linux 上编辑/etc/docker/daemon.json{ registry-mirrors: [https://你的加速地址] }这里不推荐直接抄网上别人随便写的公共地址因为这类公共镜像源本身不稳定而且可能存在供应链风险。比较稳妥的方式是去主流云厂商的容器镜像服务控制台申请一个个人镜像加速地址每家都会有按文档配置即可。你可以在“容器镜像服务”页面里找到“镜像加速器”把里面分配的 HTTPS 地址填进去。改完以后重启 Dockersudo systemctl daemon-reload sudo systemctl restart docker再用docker info查看 Registry Mirrors 一栏确认配置生效。说实话加速地址这个东西真的属于“用过就回不去”的配置没配置之前拉一个镜像五分钟配置之后经常几秒钟就完事。4.2 离线环境下导出与导入镜像有些服务器在内网环境无法直接访问 Docker Hub这时候需要用离线迁移的办法。先在一台能上网的机器上拉好镜像导出成 tar 包docker save -o nginx.tar nginx:latest把 tar 包拷贝到目标机器后导入docker load -i nginx.tardocker save和docker load是一对组合适合镜像迁移、内网部署、交付到客户现场这些场景。需要注意的是save 归档的是整个镜像体积可能很大建议配合压缩使用比如导出后用 gzip 压一道。还有一个小细节别人导出的镜像导入后需要确认标签是否正常必要时用docker tag重新打标签避免后续运行时因为标签不对找不到镜像。顺带提一下把自己构建的镜像推送到仓库通常是先打标签再推送docker tag my-app:v1 your-registry.com/my-app:v1 docker push your-registry.com/my-app:v1如果用的是 Docker Hub登录后推到自己账号名下即可如果是公司内网仓库把地址换成内网域名端口就行。4.3 Dockerfile 构建私有镜像与多阶段构建跑别人现成的镜像解决了“使用”问题但很多时候你需要封装自己的应用。这时候要写 Dockerfile。以一个最简单的 Python 应用为例FROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD [python, app.py]构建命令docker build -t my-python-app:v1 .docker build会按 Dockerfile 里的步骤逐层构建。这里有一个经验COPY requirements.txt和COPY . .分成了两步而不是一次性把整个目录拷贝进去。原因是 Docker 会利用构建缓存以后只要 requirements.txt 没变pip install 这一层就不会重新执行构建速度会快非常多。业务代码变大以后我强烈建议用多阶段构建来瘦身。很多前端 后端项目构建工具体积很大但运行时根本不需要这些工具。多阶段构建的思路是先用一个带编译环境的镜像完成构建再把产物拷贝到一个小体积的运行镜像里。以 Node.js 项目为例# 阶段一构建 FROM node:18-alpine AS builder WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 阶段二运行 FROM nginx:alpine COPY --frombuilder /app/dist /usr/share/nginx/html EXPOSE 80 CMD [nginx, -g, daemon off;]这样最终镜像里只剩 Nginx 和静态文件体积可以从几个 GB 缩小到几十 MB。还有一点不要忘写一个.dockerignore文件把node_modules、.git、dist这些目录排除在构建上下文之外否则COPY . .会把这些无关文件也拷进去既拖慢构建又撑大镜像。5. Docker Compose从“一条命令一个容器”到“一条命令一个项目”5.1 docker run 太散用 Compose 描述整个项目零基础跑通单个容器以后很快会撞上一堵墙项目一复杂docker run 命令就变得又长又散。启动一个服务要敲一行带一堆参数的命令多个服务之间还得保证顺序、网络、数据卷正确手动操作非常容易出错。Docker Compose 就是来解决这个问题的。它把一个项目涉及的所有服务、网络、数据卷写进一个docker-compose.yml文件之后一键启动、一键停止。你可以把 compose 文件理解成“项目的部署说明书”别人拿到这份文件不用看你敲过什么命令一条命令就能把整套环境拉起来。目前新版的 Docker Desktop 和 docker-compose v2 直接内置了 compose 能力Linux 上如果用的是 docker.io可能需要单独安装docker-compose-plugin或docker-compose装好后用docker compose version验证一下。5.2 一个完整的 web mysql 示例直接上手看一个结构比较典型的 compose 文件version: 3.9 services: app: build: . ports: - 8080:8080 depends_on: mysql: condition: service_healthy environment: DB_HOST: mysql DB_PORT: 3306 DB_USER: root DB_PASSWORD: secret mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: myblog volumes: - mysql-data:/var/lib/mysql healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 5s timeout: 3s retries: 10 volumes: mysql-data:启动命令docker compose up -d查看状态和日志docker compose ps docker compose logs -f停止并清理docker compose stop docker compose down -v逐个解释关键点build: .表示 app 服务用当前目录的 Dockerfile 构建不用提前手动 builddepends_on用来控制启动顺序。这里加了condition: service_healthy的条件意思是 MySQL 健康检查通过之后才启动 app能有效避免“app 启动时连不上数据库”的问题healthcheck是健康检查对于有依赖关系的服务非常有用volumes用mysql-data:声明了一个具名数据卷和-v mysql8-data:/var/lib/mysql的效果一致-d是让 compose 在后台运行如果去掉可以看到前台日志输出。这一套下来你会发现 docker run 那套经验完全平移到了 compose 里并没有多少新概念。多用几次后你会习惯“先看 compose 再动手”的部署方式。5.3 把 Redis 主从也放进 Compose项目级编排的通用套路前面手动用 docker run 创建 Redis 主从的过程也可以塞进 compose 里。其实一旦你理解了 5.2 的结构把任何服务资源通过image、environment、volumes、networks四个核心字段声明进去就可以了。很多社区项目比如 GitLab 社区版、Dify、DataX-WEB、青龙面板这类大体量项目它们官方提供的部署方案本质上也是 compose 文件——拉镜像、配置环境变量、挂数据卷、映射端口跑起来后你只需要关注业务本身基础设施的事交给 Docker 管。这里给一个最简的 Redis 主从 compose 写法方便你感受一下“编排”的思路version: 3.9 services: redis-master: image: redis:7 command: [redis-server, --appendonly, yes] ports: - 6379:6379 redis-slave: image: redis:7 command: [redis-server, --replicaof, redis-master, 6379] depends_on: - redis-master当然生产环境远不止这几个字段但底层逻辑是一样的。学会 compose 之后再接触 Kubernetes、Helm 这些编排方案你会发现它们解决的问题虽然更深但核心诉求——把部署过程变成可复用的描述文件——是完全一致的。6. 排错实录新手最容易翻车的几个现场6.1 启动失败virtualization support not detected / npipe 连接失败这是 Windows 用户刚安装 Docker Desktop 时最常见的两处卡点。第一处是 “virtualization support not detected”。这个报错分两种情况一种是 BIOS 里的虚拟化开关没开需要进 BIOS 开启 Intel VT-x 或 AMD-V另一种是已经开了但 Windows 的 Hyper-V / 虚拟机平台功能没有启用。建议先打开任务管理器确认“虚拟化”是否为“已启用”再去“控制面板 - 程序 - 启用或关闭 Windows 功能”里勾选“虚拟机平台”和“适用于 Linux 的 Windows 子系统”。第二处是开头提到的failed to connect to the docker api at npipe:////./pipe/dockerDesktopLinux。我记得第一次看到这个报错也慌了以为是安装出问题了。其实绝大多数情况下Docker Desktop 还处于启动加载中后台服务没有就绪。等一下再执行命令或者右键托盘图标重启 Docker Desktop基本都能解决。如果真的持续报错再考虑重置 WSL2 内核或重装 Docker Desktop。在 Linux 上遇到 docker 服务起不来的情况第一件事不是直接重装而是看日志systemctl status docker journalctl -u docker -n 50 --no-pager日志会告诉你到底是网络问题、存储驱动问题还是某个依赖服务没起来。盲猜方向没有意义日志才是唯一可信的依据。6.2 权限问题为什么 docker 命令需要 sudo很多人在 Ubuntu 上装完 Docker 后执行docker ps会看到permission denied。原因其实很简单Docker 引擎默认需要 root 权限当前用户不在 docker 组里所以需要 sudo 提权。解决办法就是前面提过的sudo usermod -aG docker $USER执行后一定要退出终端重新登录或者执行newgrp docker否则不会生效。这里提醒一下给用户加 docker 组相当于授予了接近 root 的权限因为 docker 组里的用户可以通过挂载宿主目录等方式控制宿主机。个人开发机这样做没问题但公司多用户环境要谨慎别随便给所有人都加上。6.3 端口冲突与容器间网络不通端口冲突是最常见的启动失败场景。docker run -p 8080:80报port is already allocated说明 8080 端口已经被其他程序或容器占用。先查是谁占的sudo lsof -i:8080或者用 Windows 上的netstat -ano | findstr 8080找到进程后要么停掉进程换一个端口要么换一个宿主端口映射。我的习惯是尽量用不常见的端口段比如 18080、28080降低冲突概率。容器间网络不通也是高频问题。如果你创建的是默认 bridge 网络两个容器之间不能用容器名访问你需要自定义网络。前面 Redis 主从的例子已经演示过docker network create redis-net之后把两个容器都放入同一网络容器名就会自动解析。排查网络问题可以看容器到底在哪个网络里docker inspect redis-master | grep -A 10 Networks docker network inspect redis-net如果容器启动时忘了指定网络可以用docker network connect把它补挂进去不用重建容器。6.4 MySQL / Redis 卷目录权限问题跑数据库容器时如果你用的是“绑定挂载”也就是把宿主机某个目录直接映射进容器很容易遇到Permission denied或 MySQL 初始化失败。原因通常是宿主机目录的属主和权限跟容器内运行用户不匹配。具名卷-v mysql-data:/var/lib/mysql能绕开大多数权限问题因为 Docker 会自动管理目录权限。如果必须用绑定挂载最简单的办法是给目录开放足够权限或者显式调整属主mkdir -p /data/mysql chmod 777 /data/mysql在生产环境更规范的做法是找到镜像里 MySQL 运行用户的 UID用chown -R UID:GID去设置目录属主。对新手来说记住“优先使用具名卷”这条原则能少踩很多坑。6.5 容器内时区不对、数据丢了怎么办时区问题是很容易被忽视的“非功能性问题”。默认情况下很多镜像的时区是 UTC比北京时间慢 8 小时日志时间看起来就“穿越”了。解决办法是在运行容器时注入时区环境变量docker run -d --name app -e TZAsia/Shanghai your-image在 compose 文件里同样是在environment下面加一行TZ: Asia/Shanghai。如果镜像没有内置 tzdata可能还需要在 Dockerfile 里安装对应时区包然后设置环境变量。数据丢失的应急处理也要了解。万一你忘了挂数据卷容器已经被删了不要慌只要容器不是被docker rm -f强删后彻底不可恢复还有救。请记住容器删了就没了但容器里还残留文件时可以用docker cp把文件从容器里拷出来再抢救。例如docker cp mysql8:/var/lib/mysql /backup/mysql但真正治本的办法永远是有状态服务必须挂数据卷并且养成定时备份的习惯。容器随时可以重建数据卷才是你的“真金白银”。最后分享一点我的体会带过不少新人之后我发现零基础学 Docker 最大的障碍其实不是命令多而是心态上的“急于求成”。建议你按照这条路径走先把镜像、容器、数据卷这三个概念吃透然后照着本文的命令把 Nginx、MySQL、Redis 各跑一遍再尝试把几个服务写进一个 compose 文件最后遇到问题养成“先查日志、再改配置、最后重装”的排查习惯。若能做到这些你已经可以把容器化用到日常项目和部署里了。至于更复杂的生产级设计等你真的需要时再学也不迟——那时候你会发现脚下的地基已经足够牢固。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

如何把Lucebox接入你现有的任何应用:OpenAI兼容API与流式推理完整使用指南 2026/9/29 2:27:44

如何把Lucebox接入你现有的任何应用:OpenAI兼容API与流式推理完整使用指南

如何把Lucebox接入你现有的任何应用:OpenAI兼容API与流式推理完整使用指南 【免费下载链接】lucebox LLM speculative inference server for heterogeneous hardware & consumer GPUs 项目地址: https://gitcode.com/gh_mirrors/lu/lucebox Lucebox 是一…

阅读更多 →
NoneBot2 事件类型与重载机制:按平台与场景精细化处理事件 2026/9/29 2:27:44

NoneBot2 事件类型与重载机制:按平台与场景精细化处理事件

后端即时通讯 【免费下载链接】nonebot2 跨平台 Python 异步聊天机器人框架 / Asynchronous multi-platform chatbot framework written in Python 项目地址: https://gitcode.com/gh_mirrors/no/nonebot2 点击查看 免费下载 NoneBot2 中,事件&#xff…

阅读更多 →
AGENTS.md 使用指南:从“无用”到“失控”的避坑实践(TaoToken 配置版) 2026/9/29 2:27:44

AGENTS.md 使用指南:从“无用”到“失控”的避坑实践(TaoToken 配置版)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
光耦继电器电路设计避坑指南:从选型到PCB的实战分析 2026/9/29 2:27:44

光耦继电器电路设计避坑指南:从选型到PCB的实战分析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
GLM-5.1 重磅上线,编程能力剑指 Claude Opus 4.6,用 TaoToken 统一 Key 接入 Coding plan 实战 2026/9/29 2:27:44

GLM-5.1 重磅上线,编程能力剑指 Claude Opus 4.6,用 TaoToken 统一 Key 接入 Coding plan 实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Vue 与 WebRTC 音视频直播:从信令到调优实战 2026/9/29 2:27:38

Vue 与 WebRTC 音视频直播:从信令到调优实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉