ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

用VsCode从零完成项目部署:Flask、SpringBoot与Docker实战

2026/9/29 17:18:36 拓冰建站 浏览量
用VsCode从零完成项目部署:Flask、SpringBoot与Docker实战 什么是部署说白了就是让你本地辛辛苦苦敲出来的代码跑到一台“不关机的电脑”上让任何人在任何时间、任何地点都能通过浏览器访问到。而VsCode在这个过程中扮演的角色绝不只是“写代码的编辑器”它更像是一个可移动的驾驶舱——你可以在里面写代码、跑脚本、连服务器、传文件、看日志甚至直接把容器管理起来。我写这篇教程不是想告诉你某一个固定的部署套路而是想把“用VsCode完成一次项目部署”这件事的完整链路拆开讲清楚。不管你是刚学Python刚写完第一个Flask应用还是被SpringBoot前后端分离项目折腾得焦头烂额又或者是照着网上帖子用Docker部署却总在某个环节卡住这篇内容都能给你一条能走通的路线。我会把我在实际部署中踩过的坑、反复试过才明白的门道一并放进这篇文本里。1. 部署前的思路拆解先搞清楚你到底在部署什么很多朋友在部署这件事上栽跟头不是操作不对而是思路混乱。部署不是一个动作而是一连串决策的结果。你先得想明白几件事后面的路才走得通。1.1 你手里的项目到底是什么形态在动手之前先回答这个问题你手上这个项目是纯静态页面、后端接口服务、前后端分离项目还是需要特定运行时环境的完整应用纯静态页面HTML、CSS、JS文件不需要编译扔到Nginx或者任意Web服务器下就能跑。后端服务Python的Flask/Django、Java的SpringBoot、Node.js的Express这类项目需要一个运行时环境并且通常监听一个端口提供接口服务。前后端分离前端是Vue/React构建的静态资源后端是独立接口服务部署时需要分别处理两部分。数据库依赖型项目比如TPSHOP商城这类PHP项目除了代码本身还要有MySQL数据库部署时得把数据结构和初始数据也迁移过去。1.2 部署方案选型本地跑起来和服务器跑起来是两码事我发现不少新手对“部署”和“本地运行”分不清楚。本地跑通只是第一步只代表代码逻辑没问题。真正的部署至少要满足三个条件长时间稳定运行、能被外部网络访问、环境差异不会导致崩溃。拿Flask项目来说本地开发时你用app.run()跑的是开发服务器它自带reload功能但性能有限。部署到服务器上你得考虑用Gunicorn或uWSGI这种WSGI服务器来承载请求前面再加一层Nginx做反向代理。这就像你在家里试做一道菜和给餐厅供应这道菜完全是两个标准。部署方案无非以下几条路线方案适用场景优点缺点本地服务器直接跑小项目、内网使用、快速验证简单直接、无需额外依赖不稳定、重启即失效、外网难访问服务器直接部署生产环境、中小项目可控性强、资源直接环境配置繁琐、迁移麻烦Docker容器化任何环境的标准化交付环境一致、迁移简单需要理解容器概念有一定学习成本云平台托管快速上线、无运维团队省心、自动扩缩容长期成本高于自建、自由度受限1.3 VsCode在整个部署流程中扮演什么角色这是这篇文本的核心认知调整。VsCode表面上是编辑器实际部署时你是拿着一把多功能军刀在工作。它能做到通过Remote-SSH插件直接编辑服务器上的文件和编辑本地文件没有区别。通过内置终端执行服务器命令不需要在多个窗口来回切换。通过Source Control直接管理代码版本部署前确认提交状态。通过Dev Containers插件进入容器内部修改代码、看日志调试发挥到极致。通过SFTP插件直接同步本地代码到服务器比手动上传省无数倍时间。你就把VsCode理解成整个部署过程的指挥中心。你不需要记一堆复杂的命令行很多操作在图形界面上就能完成。但前提是你得把环境和插件配好。2. 从零准备开发环境VsCode安装与关键配置万事开头难但如果开头是“安装VsCode”就没那么难。难的是你装完以后不知道还要装什么、配置什么。这一章我带你走完全套基础配置。2.1 下载安装与汉化别在这上面浪费时间我见过不少人在“VsCode官方下载入口”这个问题上纠结半天甚至下载到第三方修改版。记住只有Visual Studio Code官网code.visualstudio.com下载的才是官方版本Windows、macOS、Linux都有对应的安装包。安装时有三个容易被忽略的勾选项“添加到PATH”如果你希望在任意终端里直接用code .快速打开项目这个必须勾选。“通过在Code中打开”的集成菜单选项装上以后在文件夹上右键就能直接用VsCode打开省去先开软件再找文件夹的流程。安装完成后在帮助菜单里选择“切换为中文语言包”安装并重启界面就变中文了。这个不配也不影响使用但中文界面确实对新手少一层心理门槛。2.2 运行时环境配置不是装完VsCode就完事了VsCode本质上是一个编辑器外壳你需要它支持哪种语言就得给电脑装对应的运行时和扩展。这就像你买了一把电动螺丝刀但不能拧空气你得有螺丝。以Python为例你至少需要Python解释器建议直接到python.org下载系统PATH里勾上“Add Python to PATH”。VsCode扩展里搜“Python”安装微软官方出的那个。按CtrlShiftP输入Python: Select Interpreter选中你安装的解释器路径。以C/C为例很多人问“为什么VsCode写C没有代码提示”你得安装编辑器扩展C/C扩展包微软出的那个包含IntelliSense、调试和浏览功能。编译器Windows上装MinGW-w64macOS上直接xcode-select --installLinux上用apt install gcc g。配置tasks.json和launch.json这才有编译和F5调试的功能。以Java/SpringBoot为例热词里高频出现的springboot部署安装Extension Pack for Java。安装JDK建议JDK 17起步。装Maven或Gradle作为构建工具。2.3 必装插件清单部署时真正救命的那些网上那些“100个VsCode插件推荐”的帖子看看就好很多时候装一大堆用不上反而是拖累。我列几个对部署真的有用的别的不敢打包票。插件名用途为什么值得装Remote - SSH远程连接Linux服务器在本地VsCode窗口里直接编辑远程文件、执行远程命令几乎是运维标配Docker查看和管理容器、镜像部署时能直接看到容器状态和日志省得敲一堆命令SFTP本地代码同步到服务器配置好以后按一下F1就能上传比FileZilla拖拽方便太多Live Server本地起一个静态服务器前端调试利器改完代码浏览器自动刷新GitLens查看代码提交历史与作者部署前确认哪个版本是线上版本避免打错包Code Runner一键运行各种脚本快速验证一个脚本能否跑通PythonPython语言支持配合解释器选择和调试器部署前本地自测靠它这些插件装完以后你的VsCode就已经不是“记事本加强版”了而是一个可以动手打仗的实战工具。3. 本地部署走一遍以Flask项目为例跑通全流程说再多不如直接动手。我选Flask项目做例子是因为它轻量、适合教学而且热词里频繁出现“Windows下Flask项目部署到服务器上附件路径错误”这类问题。一次跑通后面很多坑都提前避开了。3.1 创建项目与虚拟环境写代码之前先隔离环境假设你现在要从零写一个带文件上传功能的Flask应用先不要急着pip install flask。先建虚拟环境。虚拟环境的作用是把这个项目依赖的包和系统全局的包隔离开避免“这台电脑上好好的那台电脑上一坨屎”的尴尬。在VsCode里打开终端敲这几个命令mkdir my-flask-app cd my-flask-app python -m venv venv在Windows下激活虚拟环境venv\Scripts\activate在Linux或macOS下激活虚拟环境source venv/bin/activate激活以后终端前面会出现一个(venv)前缀。这时候你在VsCode里按CtrlShiftP输入Python: Select Interpreter选择./venv/Scripts/python.exe或./venv/bin/python。这样VsCode的终端、调试器、代码提示全都指向这个虚拟环境。3.2 一个带文件上传的最小Flask应用直接写一个最小但完整的例子注意看文件上传部分——这是后面Windows和Linux部署差异最大的地方。# app.py import os from flask import Flask, request, jsonify, render_template from werkzeug.utils import secure_filename app Flask(__name__) # 重点不要用相对路径写死附件目录 UPLOAD_FOLDER os.path.join(os.path.dirname(os.path.abspath(__file__)), uploads) os.makedirs(UPLOAD_FOLDER, exist_okTrue) app.config[UPLOAD_FOLDER] UPLOAD_FOLDER app.route(/) def index(): return render_template(index.html) app.route(/upload, methods[POST]) def upload(): file request.files.get(file) if not file: return jsonify({error: 没有文件}), 400 filename secure_filename(file.filename) file.save(os.path.join(app.config[UPLOAD_FOLDER], filename)) return jsonify({message: 上传成功, filename: filename}) if __name__ __main__: app.run(host0.0.0.0, port5000, debugTrue)注意这里我做了两件你可能觉得“多此一举”的事UPLOAD_FOLDER用os.path.abspath(__file__)动态获取项目路径而不是写死./uploads。为什么因为你在VsCode终端里运行项目时工作目录可能是任意位置一旦用相对路径文件就不知道存到哪里去了。这就是热词里“Windows部署Flask项目到服务器上附件路径错误”的绝大多数根源。os.makedirs(UPLOAD_FOLDER, exist_okTrue)确保目录存在。你不写这行第一次上传就给你报FileNotFoundError。3.3 本地跑通并调试在VsCode里按F5选择Flask调试配置或者直接在终端里python app.py然后打开浏览器访问http://127.0.0.1:5000就能看到页面了。但我强烈建议用F5走调试器的方式。为什么因为部署和本地最大的区别在于环境你在本地调试时可以把断点打在upload函数的file.save()那行看看os.path.join(UPLOAD_FOLDER, filename)最终生成的路径到底长什么样。这个路径理解透了到服务器上就不会因为Linux根路径结构和Windows不同而懵。3.4 把前端一起跑起来Vue项目与VsCode的配合如果你的项目是前后端分离前端用的是Vue那你部署前在本地也是两套流程后端Flask或SpringBoot按上面方式本地跑起来监听某个端口。前端Vue项目在VsCode里打开安装依赖后执行npm run serve或者npm run dev开发服务器会自动打开浏览器预览页面。但要注意本地跨域问题前端访问后端接口时如果端口不一致浏览器会拦截。你需要在Vue项目的vue.config.js里配代理或者在后端加CORS头。这也是部署前后区别最大的地方之一因为生产环境里前端和后端通常走同一个域名通过Nginx路径分流就不存在跨域了。4. 远程服务器部署实战从本地到Linux服务器用VsCode一把梭本地跑通了接下来就是真正“上服务器”。我强烈建议你手里的服务器是Linux系统因为生产环境中十有八九就是LinuxWindows服务器的问题和坑只会更多。4.1 Remote-SSH连接服务器这一步是VsCode对部署流程最大的贡献没有之一。首先在VsCode安装Remote - SSH扩展。然后按F1输入Remote-SSH: Connect to Host选择 Add New SSH Host输入ssh root你的服务器公网IP按回车它会让你选择保存SSH配置的文件位置默认就放在用户目录下的.ssh/config里不要改。然后会弹出一个新窗口让你输入服务器密码推荐直接配SSH密钥登录一劳永逸但那是另一个话题了这边不展开。连接成功后VsCode的左下角会显示“SSH: 你的服务器IP”左侧的资源管理器变成远程服务器的文件系统。这时候你体验到的就是“直接在服务器上写代码”的感觉——你会发现下载文件夹、打开文件、修改配置全都不需要再开一个终端去做。4.2 把代码传到服务器没有够用原则够干净才能长久代码怎么传到服务器很多人第一反应是下载一个FileZilla。但你已经用了VsCode装个SFTP插件就够了。在.vscode文件夹下建一个sftp.json{ name: my-server, host: 你的服务器IP, protocol: sftp, port: 22, username: root, remotePath: /var/www/my-flask-app, uploadOnSave: true, ignore: [vscode/**, .git/**, node_modules/**, venv/**, uploads/**] }配置好以后右键文件或文件夹就能选择SFTP: Upload上传。如果你勾了uploadOnSave每次保存本地文件它会自动同步到服务器。听起来很方便对吧但我必须提醒你保存即上传这个功能在单人开发、本地验证好了之后是神器在多人协作或者你还没写完代码就去上传的情况下就是炸弹。建议平时关掉这个开关只在确定某个文件要上线时才手动上传。4.3 到服务器上把项目跑起来以刚才的Flask项目为例连上远程服务器后打开终端这个终端已经是你服务器的bash了执行cd /var/www/my-flask-app python -m venv venv source venv/bin/activate pip install -r requirements.txt这里有一个新手常犯的错误数据库和上传目录的文件不属于代码。你在本地生成的上传目录、SQLite数据库文件上服务器时要单独上传或者手动创建。如果服务器上的目录权限不够写入就会报Permission denied。然后启动服务。正常来说你直接在终端里跑python app.py服务确实起了。但你一关终端服务就没了。这就引出下一个话题怎么让服务稳定地在后台跑。4.4 用Gunicorn跑Flask服务并做后台守护在服务器上开发用的Flask内置服务器性能很差而且不支持并发。生产环境里我们用Gunicorn来跑pip install gunicorn gunicorn -w 4 -b 0.0.0.0:5000 app:app这行命令的意思是启动4个worker进程监听所有网卡的5000端口加载app.py里的app对象。但上面这个命令一旦你关掉SSH会话还是会死。你需要用nohup或者更好的方式用systemd服务来托管。在/etc/systemd/system/下创建一个myflask.service文件[Unit] DescriptionMy Flask App Afternetwork.target [Service] Userroot WorkingDirectory/var/www/my-flask-app ExecStart/var/www/my-flask-app/venv/bin/gunicorn -w 4 -b 127.0.0.1:5000 app:app Restartalways [Install] WantedBymulti-user.target然后执行sudo systemctl daemon-reload sudo systemctl enable myflask sudo systemctl start myflask现在你的Flask服务就在后台稳定运行了。直接访问http://服务器IP:5000就能看到你的网站。这时候你才算是完成了一次真正的部署。4.5 配置Nginx反向代理把端口藏起来直接暴露5000端口给用户访问既不好看也不安全。标准做法是让Nginx监听80端口遇到特定路径时把请求转发给5000端口。在/etc/nginx/sites-available/default里配置server { listen 80; server_name yourdomain.com; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /uploads/ { alias /var/www/my-flask-app/uploads/; } }这里location /uploads/是关键配置它让用户上传的图片或附件可以直接通过http://你的域名/uploads/xxx.jpg访问而不用经过Flask处理。这样做的好处是文件由Nginx直接返回速度快、省后端资源。如果你不配这个Flask就得自己处理静态文件的读取和响应性能差一大截。重启Nginx以后用户直接访问80端口完全不知道后端是5000端口在跑。5. 容器化部署的进阶路子用Docker把环境打包上云直接部署到服务器有一个痛点你在本地调试好的环境和服务器上手动搭出来的环境不一定完全一致。今天这台机器搞定了明天换台服务器又有环境变量、系统依赖的小问题。Docker的存在就是解决这个问题的。5.1 为什么Docker部署对VsCode用户特别友好Docker的核心思想是“基础设施即代码”。你的整个运行环境——操作系统基础镜像、系统依赖、Python包、启动命令——都以文本文件的形式存在仓库里。配合VsCode的Docker插件你可以在图形界面里看到所有容器和镜像的状态点一下就能看日志、进终端。而且VsCode有一个Dev Containers插件它允许你直接在容器内部打开工作区像平时连远程服务器一样。这带来的好处是你可以在容器环境里调试代码确保部署时不会因为环境差异翻车。5.2 一个最小可用的Dockerfile还是拿刚才的Flask项目举例。在项目根目录创建DockerfileFROM python:3.11-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . EXPOSE 5000 CMD [gunicorn, -w, 4, -b, 0.0.0.0:5000, app:app]然后在项目里创建一个.dockerignore文件把不需要打进镜像的内容排除掉venv/ __pycache__/ .git/ uploads/ .vscode/关键点解析python:3.11-slim是官方精简版镜像比python:3.11少了几百MB体积但够用了。生产环境讲究小而快。先复制requirements.txt再复制代码这是利用Docker的层缓存机制只要依赖文件没变这层缓存就不会清空每次构建都会快很多。COPY . .会把所有符合.dockerignore之外的文件拷进镜像。如果像上面那样排除掉venv构建时就不会误把你的本地虚拟环境也复制进去。5.3 用VsCode的Docker插件来做容器管理装好Docker和VsCode插件后按CtrlShiftP输入Docker: Build Image它会自动执行docker build。构建完成后在侧边栏的Docker面板里你能看到镜像已经生成了。启动容器前你还需要一个docker-compose.yml因为一个完整的项目通常不止一个容器。你要数据库那就需要MySQL容器你上传的文件得落在宿主机那就要挂载卷。version: 3.8 services: flask: build: . ports: - 5000:5000 volumes: - ./uploads:/app/uploads environment: - FLASK_ENVproduction restart: always这行volumes: - ./uploads:/app/uploads的意思是把宿主机上的./uploads目录映射到容器里的/app/uploads目录。这样即便容器被删除重建上传的文件也不会丢。热词里那些“项目部署后附件路径错误”的问题在容器化场景下更是常见因为容器内文件系统是临时性的文件必须挂载出去。然后在这个文件所在的目录执行docker-compose up -d服务就起来了。你在VsCode的Docker面板里能看到这个容器点击右键可以查看日志、进入容器终端。以后更新代码只需要重新build并重启容器即可。5.4 本地远程都适用Docker回滚与版本管理有了Docker之后部署变成了“构建镜像→推送镜像→拉取镜像→启动容器”这么四步。版本管理天然地比文件混乱的服务器目录要清晰。我说一个我实际用过的流程你可以照抄在VsCode里改完代码本地docker build验证能跑通。docker tag给镜像打标签格式建议myflask:20250615-v1这样。docker push到私有仓库或者Docker Hub。在服务器上直接docker pull然后docker-compose重启。如果新版本有问题docker-compose yml里改回上一个镜像标签再重启一次10秒钟回滚。这个过程配合VsCode的GitLens看提交记录你完全能追溯到任何一个线上版本对应的源码状态。6. 常见问题与排查技巧实录部署路上反复踩过的坑说句实话部署教程满网都是但真正有价值的是那些别人踩过、而你还没踩进去的坑。这几节内容我建议你截图保存。6.1 端口占用与防火墙项目没弹出来先别急着改代码你在本地启动Flask、SpringBoot或者Tomcat的时候起不来或者启动到一半就崩第一个可能性就是端口被占用。Windows下排查netstat -ano | findstr :5000看到有进程在监听5000端口记下PID然后taskkill /PID 进程号 /FLinux下排查lsof -i :5000或者ss -lntp | grep 5000你使用kill -9 PID结束掉占用进程。但更常见的情况是你上次的服务没关干净或者别的服务默认占了端口。改端口前先确认一下别盲目换端口因为前端如果配置好了代理路径端口一换链路上哪个环节忘了同步又得排查半天。另外还有一层就是云服务商的安全组策略。我之前帮朋友排查一个项目服务器上什么都正常Nginx也转了就是外网访问不到。最后发现是云控制台的安全组没有放行80端口。这个问题在网上搜不出来因为你的服务器本身没毛病。这一条值得记下本地部署出问题时先查代码远程部署出问题时先查安全组和防火墙。6.2 附件路径错误与中文文件名乱码热词里专门提到了“Windows下Flask项目部署到服务器上附件路径错误”这几乎是我见过问得最多的问题。常见路径错误有两种一是相对路径问题本地运行时当前目录恰好正确部署到服务器后工作目录变了相对路径指向就不对了。解决办法就是我前面讲的用os.path.abspath(__file__)获取项目绝对路径在此基础上拼接。二是Windows路径分隔符和Linux不一致。Windows路径反斜杠\Linux正斜杠/。如果你在Windows上调试时用split(\\)处理路径到了服务器上就失效。解决办法是统一使用os.path.join让它原生处理分隔符不要自己拼字符串。中文文件名问题也算此类。Windows和Linux对文件编码的处理方式不同你本地看到的中文名.jpg在Linux服务器上可能变成一片乱码甚至直接报编码错误。secure_filename()这个函数会把文件名转成ASCII安全格式也就是把中文全部变成下划线保证安全但可读性就差了。如果你确实需要保留中文文件名需要自己处理Unicode编码并且在数据库里存一份原始文件名上传文件本身还是用唯一的英文标识符。6.3 虚拟环境无效装了一堆包还是提示ModuleNotFoundError这是VsCode用户特有的坑。很多人开了终端在终端里明明显示(venv)前缀但还是提示找不到模块。你八成是遇到了这个问题VsCode默认使用的Python解释器不是虚拟环境里的那个。因为plugin加载解释器的时机和终端激活虚拟环境的时机对不上。解决办法很简单重新执行一遍deactivate然后重新venv\Scripts\activateWindows或source venv/bin/activateLinux/macOS。再不行就直接按CtrlShiftPPython: Select Interpreter手动选虚拟环境路径。这是最稳妥的方式没有之一。还有一个更隐蔽的情况你用Pip安装包时提示成功但运行时报ModuleNotFoundError。大概率是终端使用的pip和解释器不是同一个。检查命令which python which pip如果两个路径不一致你要么用python -m pip install来保证安装到当前解释器要么直接把解释器切换一致。我自己一律用python -m pip install就是为了避开这个混乱。6.4 远程服务器上VsCode卡顿或无法连接Remote-SSH连不上先区分两种情况。如果你用的是密码登录确认服务器端的密码认证有没有开启。在/etc/ssh/sshd_config里检查PasswordAuthentication yes。如果你是用密钥登录确认客户端公钥有没有放到服务器的~/.ssh/authorized_keys。VsCode远程卡顿的问题通常不是VsCode本身是服务器网络带宽和磁盘IO。远程编辑文件时VsCode需要实时同步文件变更如果服务器在境外延迟就会明显。解决办法是把项目放到一个配合度比较高的目录比如用SSD盘存储热点文件或者你干脆只在服务器上做部署操作代码写作用本地项目完成再上传。另外一个很容易被忽略的点是连接Remote-SSH后VsCode会向服务器安装一个vscode-server的依赖。如果你的服务器内存只有512MB安装或启动vscode-server可能直接失败。解决办法是提前确认free -m看内存另外也可以在服务器上配置swap分区兜底。6.5 排查命令速查表现象排查命令或操作常规解法网站打不开curl -I http://localhost:5000或curl -I http://服务器IP/本地通而外网不通查安全组/防火墙Flask附加路径报错打印os.path.join(UPLOAD_FOLDER, filename)改绝对路径、目录建好再存SpringBoot启动即退journalctl -u 服务名 -f看日志多半端口占用或数据库配置错误后端接口通了前端白屏浏览器F12看Network请求跨域配置、Nginx代理转错地址Docker容器反复重启docker logs 容器名 --tail 50看启动日志多半是启动命令或环境变量问题服务器重启后服务消失systemctl is-enabled 服务名启用systemd自启动或者docker-compose配restart alwaysNginx代理502tail -f /var/log/nginx/error.log后端服务没起或监听地址写错了7. 几条真心话部署这件事的底层逻辑部署这条路本质上是在和三种不确定性做斗争环境的不确定性、代码与环境的差异性、以及你自己的遗忘曲线。我见过太多人拿着一个本地好端端的项目部署到服务器上就懵了。归根结底是因为他们只看到了“部署”的表面动作没有建立起“环境一致性”的意识。你与其纠结某个具体命令记不记得住不如养成一个习惯每一次本地跑通以后立刻用文本文档记下三类关键信息——我用了什么版本的运行时、我改了哪些配置、我用什么命令启动的服务。这三件事在部署时全部用得上。另一点是不要迷信任何“一键部署”工具。一键部署的本质是把你手工做的事自动化了但自动化无法自动理解你的业务逻辑。你至少得手工走通一次才知道自动化的脚本干了什么。有了这一次手工操作的经验后面你选择Docker也好、选择云平台的持续集成工具也好都能判断出来它们是在帮你省钱还是在给你埋雷。所以这篇教程你可以收藏起来作为从零到一的手册。第一次照着做第二次脱稿做第三次你就可以不看任何参考直接在VsCode里连接服务器、改配置、看日志把一次部署控制在十分钟以内。愿你的项目早日上线不再被“部署”这两个字绊住脚。