2026/5/20 23:56:23
网站建设
项目流程
整站优化费用,周末做兼职上什么网站找,套做网站,响应式网站开发原理#x1f9d0; 为什么需要 Docker#xff1f;(那个著名的“甩锅”现场)
在 Docker 出现之前#xff0c;开发和运维之间经常发生这样的争吵#xff1a;
开发 (Dev)#xff1a;“代码我写好了#xff0c;在我电脑上跑得好好的#xff01;” #x1f624;运维 (Ops)#x… 为什么需要 Docker(那个著名的“甩锅”现场)在 Docker 出现之前开发和运维之间经常发生这样的争吵开发 (Dev)“代码我写好了在我电脑上跑得好好的” 运维 (Ops)“放屁部署到服务器上直接报错缺这个库缺那个包跑不起来” 这就是环境一致性问题。你的电脑是 Mac服务器是 Linux你装了 Node 18服务器只有 Node 14。每次部署运维都要手动安装一堆环境极其容易出错。 救星来了集装箱 (Container)Docker 的灵感来自于海运集装箱。以前 (散货)码头工人要搬运钢琴、香蕉、汽车。有的怕压有的怕水很难堆叠搬运效率极低。现在 (集装箱)不管货物是什么统统装进一个标准尺寸的铁盒子里。吊车不需要知道盒子里装的是什么只管吊盒子。轮船不需要专门改造只管堆盒子。Docker 就是软件行业的集装箱。它把你的代码、依赖库、操作系统环境、配置文件统统打包进一个“盒子”里。无论在这个盒子里装了什么乱七八糟的东西到了服务器上只需要把盒子跑起来就行️ 核心概念Docker 三剑客Docker 的世界里有三个最重要的概念一定要分清1. 镜像 (Image) “安装光盘” 只读的。它就像是一个打包好的Windows.iso安装文件或者游戏的安装包。里包含了代码运行所需的一切代码 Node.js Linux 系统精简版。比喻它是冻结的不会变的。2. 容器 (Container) “运行中的程序” ♂️可读写的。当你运行镜像时就产生了一个容器。你可以基于一个镜像启动 10 个相同的容器就像用一张光盘安装了 10 台电脑。比喻它是活的可以随时创建、随时销毁。3. 仓库 (Repository) “应用商店” 存放镜像的地方。最著名的是Docker Hub。你可以从上面下载别人写好的镜像如 Nginx, Redis, MySQL也可以把自己写的镜像传上去。⚔️ Docker vs 虚拟机 (VM)很多人问“这不就是虚拟机吗”大错特错特性虚拟机 (VM)Docker 容器原理盖一栋楼隔一个胶囊房重量巨重 (几 GB)超轻 (几 MB - 几百 MB)启动速度慢 (几分钟)秒级⚡️资源消耗独占 CPU/内存浪费严重共享宿主机内核按需使用包含内容完整的 Guest OS (Windows/Linux)只有代码和必要的库总结Docker 比虚拟机轻量得多因为它不需要模拟硬件也不需要完整的操作系统它只是在宿主机上隔离出了一块小空间。 实战把 Vue 项目装进 Docker假设你写好了一个 Vue 项目怎么用 Docker 部署我们需要写一个说明书Dockerfile。1. 编写 Dockerfile这是一个文本文件告诉 Docker 怎么打包你的项目。# 第一阶段构建 (Build) # 找一个装了 Node.js 的环境作为基础 FROM node:18 as build-stage # 设置工作目录 WORKDIR /app # 把 package.json 复制进去 COPY package.json ./ # 安装依赖 (npm install) RUN npm install # 把所有代码复制进去 COPY . . # 开始打包 (npm run build) RUN npm run build # -------------------------------------------------- # 第二阶段运行 (Run) # 找一个 Nginx 环境作为基础 (因为 Vue 打包后是静态文件) FROM nginx:stable-alpine as production-stage # 把刚才第一阶段打包好的 dist 文件夹复制到 Nginx 的目录里 COPY --frombuild-stage /app/dist /usr/share/nginx/html # 暴露 80 端口 EXPOSE 80 # 启动 Nginx CMD [nginx, -g, daemon off;]2. 制作镜像 (Build Image)在终端执行# 把当前目录打包成一个叫 my-vue-app 的镜像dockerbuild-tmy-vue-app.3. 运行容器 (Run Container)# 在后台运行 (-d)# 把宿主机的 8080 端口映射到容器的 80 端口 (-p 8080:80)dockerrun-d-p8080:80 my-vue-app现在访问http://localhost:8080你的 Vue 项目就跑起来了无论你把这个镜像发给谁只要他装了 Docker运行结果绝对和你一模一样。 图解Docker 工作流️ 服务器/电脑编写docker builddocker runpushpull 开发者 Dockerfile 镜像 (Image)♂️ 容器 (Container)☁️ 仓库 (Docker Hub) 进阶知识不仅仅是“跑起来”1. 数据去哪了(数据卷 Volume)你可能会问“如果我把 MySQL 容器删了我的数据还在吗”答案是不在了 容器就像一个临时酒店房间退房删除容器后里面的东西都会被清空。为了保存数据比如数据库文件、用户上传的图片我们需要数据卷 (Volume)。它的原理很简单把宿主机你的电脑的一个文件夹挂载到容器里。# -v 宿主机路径:容器路径dockerrun-d-v/my/data:/var/lib/mysql mysql这样即使容器炸了数据还在你的电脑硬盘里。2. 如果不止一个容器(Docker Compose)真实项目通常包含前端(Vue) 后端(Node) 数据库(MySQL)。如果每次都要手动敲 3 个docker run命令还要配置它们怎么互相通信太累了。Docker Compose就是一个乐团指挥家。你只需要写一个docker-compose.yml文件version:3services:web:image:my-vue-appports:-8080:80api:image:my-node-apidb:image:mysqlvolumes:-./data:/var/lib/mysql然后敲一行命令docker-composeup-d三个容器就全部整整齐齐地跑起来了️ 常用命令速查命令作用docker ps查看正在跑的容器docker ps -a查看所有容器包括挂掉的docker stop id停止容器docker rm id删除容器 (必须先停止)docker rmi id删除镜像docker logs id查看容器日志 (报错时必看)docker exec -it id sh进入容器内部 (像 SSH 一样) 总结Docker解决了“环境不一致”的千古难题。它像集装箱一样把代码和环境打包在一起。它比虚拟机更轻、更具、更省资源。它是现代DevOps和微服务的基石。