西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页 → 业内动态 → 业内资讯 → 第一次用Docker就把系统环境搞乱了:镜像、容器、数据卷该怎么理解

第一次用Docker就把系统环境搞乱了:镜像、容器、数据卷该怎么理解

相关软件相关文章发表评论 来源:本站整理时间:2026/11/2 10:21:17字体大小:A-A+

作者:xiix点击:2次评论:0次标签: Docker 容器化部署 Docker容器 数据卷 镜像

Docker Desktop电脑版3.2.2官方最新版
  • 类型:编程辅助大小:513M语言:中文 评分:10.0
  • 标签:
立即下载

部署服务这件事,折腾过的人都知道有多烦。在本地装一套 Nginx 教程、装一套 Java 教程、装个 MySQL 又来一遍,装到最后系统上乱七八糟的环境变量和依赖冲突不说,换一台服务器还得从头再来一遍。Docker 容器化就是冲着解决这个问题来的把软件连同它的运行环境打包成一个独立的「盒子」,扔到哪台机器上都能一模一样地跑起来。

如果你想自己找台云服务器练手、或者想把业务平滑迁到容器上运行,可以先看看这两家的机器:RackNerd(海外VPS与AI基础设施服务器)、狗云DOGYUN(高性价比云服务器,多机房可选),选 2 核 2G 起步就够跑 Docker 练手了,不用一上来就买大配置。

不过容器这套东西,术语确实有点绕。镜像、容器、数据卷、端口映射、网络……第一次听的人基本是懵的。所以这篇不讲大道理,就按你真正动手的顺序,一步一步把这几件事捋清楚。看完你至少能自己把一个网站跑起来,并且知道出问题时该往哪儿看。

Docker镜像与容器概念示意图

一、先理解镜像和容器的区别,这是整套体系的地基

这两个词被混着用的次数最多,但它们的区别其实一句话就能说清:镜像是模板,容器是镜像跑起来之后的实例。打个比方,镜像相当于一个系统安装盘,容器就是装好系统并且开着机的那台电脑。

这个比喻还能顺带解释另一个关键点:同一个镜像可以启动出好几个容器,它们之间互相隔离,但共享底层的镜像层。这就是为什么你用 Nginx 镜像可以同时开 3 个容器跑在同一个 80 端口上每个容器内部都以为自己独占 80 端口,靠端口映射把它们错开。

实际命令就三条,把这三个搞明白,后面全是细节:

docker pull nginx 拉取镜像(相当于下载安装盘);
docker images 看本地已经有哪些镜像;
docker ps -a 看所有容器,包括已经停止的。

新手最容易踩的第一个坑就在这:pull 完镜像,以为什么都没发生?因为镜像本身不跑东西,必须 run 成容器才有进程。run 的时候如果忘了加 -d(后台运行),终端会被占住,你以为程序卡死了,其实它跑得好好的。

服务器上运行Docker容器的实际场景

二、run 的时候参数怎么给:最常用的几个选项

真正写命令的时候,最常用的是这几组参数,按顺序理解就行:

-d 后台运行;
--name 给容器起个好认的名字,不然系统给你生成一串十六进制 ID,后面想 stop 都得先查;
-p 宿主机端口:容器端口 端口映射,这个后面细说;
-v 宿主机路径:容器路径 挂载数据卷;
-e KEY=VALUE 传环境变量;
--restart unless-stopped 让容器跟着开机自启。

所以一条完整的命令长这样:docker run -d --name mynginx -p 8080:80 -v /home/www/html:/usr/share/nginx/html --restart unless-stopped nginx。看着长,其实就是「后台跑、起名叫 mynginx、把宿主机的 8080 映射到容器里的 80、把网页目录挂进去、开机自动启动」这一串人话翻译过来。

Windows 和 macOS 上建议直接装 Docker Desktop,图形界面点几下就能跑起来,还能顺手开一个终端直接敲 docker 命令,比在裸机上手动装 Docker 舒服得多。Linux 服务器上则一条命令装 Docker Engine 就行,别在生产机上折腾 Docker Desktop 那套桌面环境,纯属给自己添麻烦。

Docker数据卷挂载与持久化存储示意图

三、数据卷:容器一删数据就没了,这个问题必须提前懂

这是第二个必须早点搞懂的点,也是新手最容易心碎的场景。你辛辛苦苦在容器里装了个数据库,传了几百兆数据,然后某天 docker rm 了一下,容器没了,数据也没了。

原因很简单:容器是临时的,它的可写层本来就是设计成随用随丢的。要让数据活下来,必须用数据卷(volume)把数据挪到容器外面存着。三种挂载方式,按用途分清楚就够了:

第一种是具名卷,最省心,Docker 帮你管理位置,写成 -v mydata:/var/lib/mysql,适合数据库、日志这类数据;

第二种是绑定挂载,直接指定宿主机的目录,-v /home/www/html:/usr/share/nginx/html,适合挂代码和静态文件,改完立刻生效,不用重新 build 镜像;

第三种是tmpfs,挂到内存里,容器一停就没,适合放临时缓存。

用之前先确认一下路径到底对不对,这是个很常见的翻车点:Mac 的 Docker Desktop 里,/Users/xxx 这个路径是能直接用的,但 /home/xxx 这种 Linux 路径在绑定挂载时可能指向的是虚拟机内部,不是你的 Mac 本机。遇到「挂进去了但目录是空的」,先回来查这一条。

Docker端口映射与容器网络示意图

四、端口映射:为什么必须是 -p 而不是把两边写反

容器里的服务,监听的是容器内部网络的那套地址,从宿主机外面是访问不到的。端口映射就是给容器开一扇门,把宿主机某个端口接到容器里的某个端口上。

规则是 -p 宿主机端口:容器端口,左边是外面能访问到的,右边是容器内部真正监听的。写反了是新手最经典的错误比如 Nginx 容器内部监听 80,你写 -p 80:8080,那外面访问 80 端口就会发现根本没服务。写反的时候 Docker 有时会报端口占用冲突,那种反而好解决;怕的是它不报错,你访问出来一个空页面,排查半天。

几个实用建议:线上服务别用 80 直接对外,尽量映射到 8080、3000 这种高位端口,前面再挂个 Nginx 做统一入口和证书;一个宿主机端口同一时间只能被一个容器占用,所以起第二个相同服务时记得换端口,比如 -p 8081:80。

五、镜像拉不动怎么办:配置镜像加速

国内用户第一次 docker pull 官方镜像,经常卡在半天下不来,或者直接超时。这不是配置错了,是默认源到国内的网络问题。

解决办法是配一个镜像加速地址。Linux 下直接写配置文件 /etc/docker/daemon.json,里面加上 registry-mirrors 这一项,填上加速地址,再顺手把 log-driver 设成 json-file、把 max-size 限成 100m、max-file 限成 3。改完执行 systemctl restart docker 生效。改完记得用 docker info 确认一下 Registry Mirrors 那栏真的出现地址了,没生效的话多半是配置文件格式写错了JSON 不能有注释,末尾也不能留逗号。

顺便说个容易被忽略的点:上面顺手配的日志大小限制是有用的,不配的话某个容器疯狂打日志能把磁盘塞满。容器化不是把问题消灭了,只是把问题挪了个地方,该管的还得管。

六、几个日常运维命令,够用就行

容器化好上手的地方在于,排查和运维基本就是几条命令的事,不用 SSH 进机器里翻目录:

看日志:docker logs -f 容器名,加了 -f 实时跟,这个应该排在第一位,出问题第一个用它;
看端口占用和状态:docker ps,输出的 PORTS 一栏直接告诉你端口映射到了哪里;
进容器里排查:docker exec -it 容器名 bash,有些镜像没有 bash,就用 sh;
重启:docker restart 容器名;
停止并删除:docker stop 容器名 && docker rm 容器名;
清理没人用的僵尸容器和镜像:docker system prune -a,这个命令会删掉所有停止的容器和没有被使用的镜像,慎用,别手抖。

如果你想在本地把一堆容器用配置文件统一管理、点几下就能看日志和终端,Docker项目管理软件DockStation 这类图形化工具比纯命令行省事,尤其适合刚入门阶段建立直观认知。

七、什么时候该上容器,什么时候先别上

最后说点实在的。容器不是银弹,我一般这么判断:如果你这台机器上要跑好几个互相依赖的服务,或者需要频繁换机器做测试、灰度、迁移,容器的收益就非常明显环境一致、启动快、回滚容易。

反过来,如果你就是一台机器跑一个静态页面,或者跑一个一年都不动几次的小脚本,折腾 Docker 反而增加了学习成本,还多了一层网络排查的麻烦(尤其是端口映射出问题的时候,明明本机访问没问题,外部就是访问不到,很容易怀疑人生)。

还有一点必须提醒:容器不等于虚拟机,也别指望容器能替代备份。数据卷里的东西,Docker 不会自动帮你备份,真出事还是得靠定时任务把卷导出或者同步到别的地方去。

好了,Docker 入门需要的东西大概就是这些。先在本机装个 Docker Desktop,用 Nginx 镜像跑一个静态页面出来,把端口映射和数据卷这两个坑亲手踩一遍,再上服务器,很多东西就自然通了。整个过程不用一天,比一次次折腾系统环境省下来的时间多得多。

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶顶
    • 1 难过难过
    • 5 囧囧
    • 3 围观围观
    • 2 无聊无聊

    发表评论

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲