当前位置: 首页 > article >正文

Docker Desktop 部署新项目详细步骤

Docker Desktop 部署新项目详细步骤我将详细介绍使用 Docker Desktop 部署一个新项目的完整流程以 Node.js 应用为例。一、前期准备1.1 环境检查# 检查 Docker 版本docker--versiondocker-compose--version# 启动 Docker Desktop# 确保 Docker Desktop 处于运行状态1.2 项目结构准备my-app/ ├── src/ │ └── app.js ├── package.json ├── Dockerfile ├── docker-compose.yml ├── .dockerignore └── README.md二、创建 Docker 配置文件2.1 编写 Dockerfile# 使用官方 Node.js 镜像作为基础镜像 FROM node:18-alpine AS builder # 设置工作目录 WORKDIR /app # 复制 package.json 和 package-lock.json COPY package*.json ./ # 安装依赖 RUN npm ci --onlyproduction # 第二阶段创建生产镜像 FROM node:18-alpine WORKDIR /app # 从构建阶段复制 node_modules COPY --frombuilder /app/node_modules ./node_modules # 复制应用程序代码 COPY src ./src COPY package.json ./ # 设置非root用户安全最佳实践 RUN addgroup -g 1001 -S nodejs \ adduser -S nodejs -u 1001 USER nodejs # 暴露端口 EXPOSE 3000 # 定义环境变量 ENV NODE_ENVproduction # 启动命令 CMD [node, src/app.js]2.2 创建 .dockerignore 文件node_modules npm-debug.log Dockerfile* docker-compose* .env .git .gitignore README.md .vscode *.md2.3 创建 docker-compose.yml可选用于多容器部署version:3.8services:app:build:.ports:-3000:3000environment:-NODE_ENVproduction-DATABASE_URLpostgres://user:passworddb:5432/mydbdepends_on:-dbvolumes:-./logs:/app/logsrestart:unless-stoppednetworks:-app-networkdb:image:postgres:15-alpineenvironment:-POSTGRES_DBmydb-POSTGRES_USERuser-POSTGRES_PASSWORDpasswordvolumes:-postgres_data:/var/lib/postgresql/dataports:-5432:5432networks:-app-networkrestart:unless-stoppednginx:image:nginx:alpineports:-80:80volumes:-./nginx.conf:/etc/nginx/nginx.confdepends_on:-appnetworks:-app-networkvolumes:postgres_data:networks:app-network:driver:bridge三、构建和运行容器3.1 构建 Docker 镜像# 进入项目目录cdmy-app# 构建镜像-t 指定标签名dockerbuild-tmy-app:latest.# 查看构建的镜像dockerimages# 如果有构建缓存问题使用 --no-cachedockerbuild --no-cache-tmy-app:latest.3.2 运行容器# 简单运行dockerrun-d-p3000:3000--namemy-app-container my-app:latest# 带环境变量运行dockerrun-d\-p3000:3000\--namemy-app-container\-eNODE_ENVproduction\-eDATABASE_URLpostgres://user:passwordlocalhost:5432/mydb\my-app:latest# 挂载卷运行用于开发dockerrun-d\-p3000:3000\--namemy-app-dev\-v$(pwd)/src:/app/src\-v/app/node_modules\my-app:latest3.3 使用 Docker Compose推荐# 启动所有服务docker-composeup-d# 查看运行状态docker-composeps# 查看日志docker-composelogs-fapp# 停止服务docker-composedown# 停止并删除卷docker-composedown-v四、使用 Docker Desktop GUI 管理4.1 镜像管理打开 Docker Desktop点击左侧 Images 标签可以看到所有本地镜像点击 “Run” 按钮可以图形化配置容器4.2 容器管理点击 Containers 标签查看运行中的容器可以启动/停止/重启/删除容器点击容器名称进入详情页查看日志、进入终端、检查配置4.3 使用 Volumes 标签管理数据卷查看所有数据卷可以创建、删除数据卷检查数据卷使用情况五、开发工作流5.1 开发环境热重载配置# docker-compose.dev.ymlversion:3.8services:app:build:context:.target:builder# 使用Dockerfile的多阶段构建ports:-3000:3000environment:-NODE_ENVdevelopmentvolumes:-./src:/app/src-/app/node_modulescommand:npm run devstdin_open:truetty:true5.2 启动开发环境# 使用开发配置docker-compose-fdocker-compose.yml-fdocker-compose.dev.yml up-d# 进入容器进行调试docker-composeexecappsh六、调试和故障排除6.1 常用调试命令# 查看容器日志dockerlogs my-app-containerdockerlogs-fmy-app-container# 实时日志# 进入容器内部dockerexec-itmy-app-containersh# 检查容器状态dockerpsdockerps-a# 查看所有容器包括停止的# 查看容器资源使用dockerstats# 查看容器详细信息dockerinspect my-app-container6.2 常见问题解决端口被占用# 查看端口使用情况netstat-an|grep3000# 或使用 Docker Desktop 修改端口映射# 停止容器 - 修改 docker-compose.yml - 重新启动镜像构建缓存问题# 清除构建缓存dockerbuilder prune# 强制重新构建docker-composebuild --no-cache权限问题# 在 Dockerfile 中正确处理权限 RUN chown -R nodejs:nodejs /app USER nodejs七、生产部署最佳实践7.1 多阶段构建优化# 第一阶段构建 FROM node:18-alpine AS build WORKDIR /app COPY package*.json ./ RUN npm ci COPY . . RUN npm run build # 第二阶段生产运行 FROM node:18-alpine WORKDIR /app COPY --frombuild /app/dist ./dist COPY --frombuild /app/node_modules ./node_modules COPY package.json . EXPOSE 3000 CMD [node, dist/main.js]7.2 使用 .env 文件管理环境变量# .env 文件NODE_ENVproductionDATABASE_URLpostgres://user:passworddb:5432/production_dbREDIS_URLredis://redis:6379# docker-compose.yml 中引用services:app:env_file:-.env7.3 健康检查配置# 在 Dockerfile 中添加 HEALTHCHECK --interval30s --timeout3s --start-period5s --retries3 \ CMD curl -f http://localhost:3000/health || exit 1# 或在 docker-compose.yml 中添加services:app:healthcheck:test:[CMD,curl,-f,http://localhost:3000/health]interval:30stimeout:10sretries:3start_period:40s八、清理和维护# 停止并删除所有容器docker-composedown# 删除未使用的镜像dockerimage prune# 删除未使用的卷dockervolume prune# 删除所有未使用的 Docker 对象dockersystem prune-a总结使用 Docker Desktop 部署新项目的关键步骤环境准备安装 Docker Desktop验证安装项目配置创建 Dockerfile、.dockerignore、docker-compose.yml镜像构建使用docker build构建应用镜像容器运行使用docker run或docker-compose up启动GUI 管理通过 Docker Desktop 可视化界面管理开发调试配置热重载使用日志和终端调试生产优化实施多阶段构建、健康检查等最佳实践Docker Desktop 提供了完整的一体化体验使得容器化应用的开发、部署和管理变得更加简单高效。

相关文章:

Docker Desktop 部署新项目详细步骤

Docker Desktop 部署新项目详细步骤 我将详细介绍使用 Docker Desktop 部署一个新项目的完整流程,以 Node.js 应用为例。 一、前期准备 1.1 环境检查 # 检查 Docker 版本 docker --version docker-compose --version# 启动 Docker Desktop # 确保 Docker Desktop 处…...

V4L2应用开发避坑指南:手把手教你用C语言采集USB摄像头图像(附完整代码)

V4L2实战:从零构建USB摄像头图像采集系统 在嵌入式开发和桌面应用中,Linux系统下的USB摄像头图像采集是一个常见需求。不同于复杂的驱动开发,大多数应用开发者更关注如何快速构建一个稳定高效的图像采集程序。本文将带你从设备识别到图像采集…...

Ansible 学习指南

Ansible 学习指南 一、Ansible 概述 1.1 什么是 Ansible? 自动化运维工具:用于配置管理、应用部署、任务自动化无代理架构:通过 SSH 或 WinRM 直接管理节点,无需在目标机器安装客户端声明式语言:使用 YAML 描述系统…...

从SPI到QSPI再到OSPI:嵌入式存储接口演进与选型指南(以W25Q64为例)

从SPI到QSPI再到OSPI:嵌入式存储接口演进与选型指南(以W25Q64为例) 在嵌入式系统设计中,存储接口的选择往往决定了整个产品的性能上限和成本结构。十年前,标准SPI接口还能满足大多数应用需求,但如今随着物联…...

Qwen3-VL-WEBUI跨平台访问配置:手机电脑都能用的AI工具

Qwen3-VL-WEBUI跨平台访问配置:手机电脑都能用的AI工具 1. 为什么需要跨平台访问AI工具 1.1 多设备协同的工作需求 在现代工作场景中,我们经常需要在不同设备间切换工作。可能是在办公室用电脑处理文档,回家路上用手机查看进度&#xff0c…...

5块钱的土壤湿度传感器,在Arduino项目里到底靠不靠谱?我的实测与长期使用报告

5元土壤湿度传感器实战评测:Arduino项目的真实表现与长期使用指南 当我在淘宝上看到标价仅5元的土壤湿度传感器时,第一反应是"这玩意儿能用吗?"——毕竟同类进口产品的价格通常在百元以上。出于好奇,我下单了10个不同批…...

【CVE-2023-49103】ownCloud graphapi第三方库敏感信息泄露漏洞深度剖析

1. 漏洞背景与影响范围 ownCloud作为一款广泛使用的开源私有云解决方案,近期曝出的CVE-2023-49103漏洞让不少企业捏了把冷汗。这个高危漏洞的核心在于graphapi组件对第三方库GetPhpInfo.php的调用机制存在设计缺陷。我在实际安全评估中发现,受影响版本会…...

51单片机实战指南:独立按键与LED交互设计(消抖优化篇)

1. 独立按键硬件原理与消抖必要性 当你第一次把手指按在51单片机的独立按键上时,可能会发现LED灯的反应不太"听话"——明明只按了一次,灯却闪烁了好几下。这种现象背后藏着机械按键的一个小秘密:触点抖动。 机械按键内部就像两个会…...

告别复杂配置!用Wan2.2-I2V-A14B镜像,三步搞定图生视频,效果惊艳

告别复杂配置!用Wan2.2-I2V-A14B镜像,三步搞定图生视频,效果惊艳 1. 为什么选择Wan2.2-I2V-A14B镜像 1.1 专业级视频生成能力 Wan2.2-I2V-A14B是一款由通义万相开源的高效视频生成模型,拥有50亿参数的专业级视频生成能力。这个…...

BECKHOFF TwinCAT3 中文字符乱码问题解析与解决方案

1. TwinCAT3中的字符串类型:STRING与WSTRING的本质区别 第一次用TwinCAT3做项目时,我在HMI上显示中文遇到了头疼的乱码问题。折腾了好几天才发现,根本原因是没搞懂STRING和WSTRING的区别。这里我用最直白的语言解释给你听。 STRING就像老式手…...

从‘绝对乘’到向量点积:程序员如何用类比和代码验证数学公式?

从‘绝对乘’到向量点积:程序员如何用类比和代码验证数学公式? 数学公式的推导过程常常让程序员感到头疼——那些抽象符号和严谨证明似乎与我们的工程思维格格不入。但当我第一次听到同事用"绝对乘"这个虚构运算来调侃数学定义时,突…...

SOONet模型MySQL安装配置与数据持久化实战

SOONet模型MySQL安装配置与数据持久化实战 如果你正在部署SOONet这类视频生成或处理模型,可能会遇到一个头疼的问题:模型跑出来的视频、生成的日志、用户的操作记录,这些数据该怎么存?总不能每次都重新生成吧。 没错&#xff0c…...

vLLM-v0.17.1从零开始:多LoRA支持与前缀缓存企业级应用教程

vLLM-v0.17.1从零开始:多LoRA支持与前缀缓存企业级应用教程 1. vLLM框架简介 vLLM是一个专为大语言模型(LLM)设计的高性能推理和服务库,以其卓越的速度和易用性著称。这个项目最初诞生于加州大学伯克利分校的天空计算实验室,如今已经发展成…...

从qrc到可执行文件:CMAKE_AUTORCC的编译内幕与资源嵌入实战

1. Qt资源系统与.qrc文件的前世今生 第一次接触Qt资源系统时,我完全被这个神奇的设计震撼到了。作为一个长期在Windows平台开发的程序员,习惯了使用.rc资源文件来管理图标、字符串等资源,Qt的.qrc文件给我打开了一扇新的大门。记得当时为了给…...

告别爆显存!GLM-4.7-Flash部署优化指南,4卡并行效率提升85%

告别爆显存!GLM-4.7-Flash部署优化指南,4卡并行效率提升85% 1. 模型概述与技术优势 1.1 GLM-4.7-Flash核心特性 GLM-4.7-Flash是智谱AI推出的新一代开源大语言模型,采用创新的MoE(混合专家)架构设计。该模型总参数量…...

CPU也能流畅运行!OpenDataLab MinerU轻量文档解析工具体验

CPU也能流畅运行!OpenDataLab MinerU轻量文档解析工具体验 1. 引言:轻量级文档解析新选择 在日常办公和学术研究中,我们经常需要处理各种文档格式——PDF报告、扫描合同、学术论文、PPT演示稿等。传统OCR工具虽然能提取文字,但面…...

技术选型指南:从OpenGL到Skia,主流绘图引擎的核心特性与适用场景剖析

1. 绘图引擎技术选型的核心考量因素 选择适合项目的绘图引擎就像挑选一辆车——不同场景需要不同的性能配置。在开始对比OpenGL、Vulkan、Cairo等具体技术前,我们需要先明确几个关键决策维度: 性能需求是首要考虑点。实时渲染场景(如游戏、VR…...

手把手教你用Verilog实现一个32位浮点乘法器(附Modelsim仿真与避坑指南)

手把手教你用Verilog实现一个32位浮点乘法器(附Modelsim仿真与避坑指南) 浮点运算在数字信号处理、图形渲染和科学计算等领域无处不在。对于FPGA开发者来说,理解并实现一个符合IEEE 754标准的浮点乘法器是掌握数字设计的重要里程碑。本文将从…...

SAP SRM采购管理平台:从战略寻源到供应商协同的全流程解析

1. SAP SRM采购管理平台的核心价值 第一次接触SAP SRM系统是在2015年,当时我参与一个制造业客户的数字化转型项目。这个客户有300多家供应商,每年采购金额超过50亿,但采购流程完全依赖Excel和邮件,经常出现供应商报价丢失、合同版…...

深度剖析:为什么Android选择了Binder

深度剖析:为什么Android选择了Binder 一、Android 的进程间通信需求 在 Android 系统里,每个应用通常都运行在独立的进程中,就像一个个独立的小世界,拥有自己专属的内存空间和系统资源 。这种进程隔离机制,就像是给每个…...

Modelsim仿真总报错?可能是你的Quartus Testbench生成姿势不对(附问题排查清单)

Modelsim仿真报错全攻略:从Quartus Testbench生成到问题排查 每次看到Modelsim那个鲜红的报错窗口弹出,是不是感觉血压瞬间飙升?作为数字电路设计流程中不可或缺的一环,仿真环节的顺畅与否直接关系到开发效率。但现实往往是&#…...

用C语言在Windows控制台写个飞机大战:从gotoxy到游戏循环的保姆级拆解

用C语言在Windows控制台写个飞机大战:从gotoxy到游戏循环的保姆级拆解 当现代游戏引擎被Unreal和Unity统治的时代,用C语言在控制台窗口实现一个实时交互游戏,听起来像是技术考古。但正是这种"简陋"的环境,能让我们彻底理…...

IntelliJ IDEA 中Maven配置失效:深入解析settings.xml路径之谜

1. 为什么IDEA找不到你的Maven配置? 刚接触Java开发的新手经常会遇到一个诡异现象:明明在本地配置了Maven的settings.xml文件,但在IntelliJ IDEA里死活不生效。这个问题我十年前第一次用IDEA时就遇到过,当时花了整整一个下午才搞…...

【YOLO数据预处理实战】图片尺寸归一化与标签坐标转换的误区与正解

1. 为什么YOLO标签不需要随图片缩放而修改? 很多刚接触YOLO算法的开发者容易陷入一个思维误区:当原始图片尺寸发生变化时,标签文件中的坐标也需要同步调整。这个认知来源于传统图像处理经验,但在YOLO的标准化流程中却是个典型的错…...

Claude Code每日更新速览(v2.1.108)-2026/04/15

目录 更新内容: 分类总结: 一、功能新增 二、体验增强 三、稳定性与安全性 本文小结: 最新版本:v2.1.108 提交时间:2026-04-14 19:12 UTC 更新内容: 添加了“ENABLE_PROMPT_CACHING_1H”环境变量以…...

RV1109与hi3861L SD卡槽WiFi驱动移植实战:内核适配与调试技巧

1. 从零开始的WiFi驱动移植挑战 最近在做一个智能家居网关项目,需要把海思hi3861L WiFi模块移植到瑞芯微RV1109平台上。刚开始接到这个任务时,我整个人都是懵的——两个不同架构的芯片,内核版本还差这么多(hi3861L驱动基于Linux 4…...

MinerU文档理解服务保姆级教程:错误识别案例复盘与提示词优化

MinerU文档理解服务保姆级教程:错误识别案例复盘与提示词优化 1. 引言:为什么你的文档识别总出错? 你是不是也遇到过这种情况:上传一份重要的合同文档,想让AI帮你提取关键条款,结果它却把甲方乙方搞混了&…...

MQ2/MQ7传感器PPM转换公式详解:从原理到代码实现(含校准指南)

MQ2/MQ7传感器PPM转换公式详解:从原理到代码实现(含校准指南) 在智能家居和工业监测领域,气体传感器的精准度直接决定了整个系统的可靠性。MQ系列传感器因其成本优势和广泛适用性,成为众多开发者的首选。但很多初学者在…...

别再死记硬背了!用‘虚短虚断’一招搞定运放放大倍数计算(附四种负反馈电路详解)

运放电路设计的思维革命:用虚短虚断破解四大负反馈迷宫 记得第一次接触运算放大器时,教授在黑板上写满了各种负反馈电路的放大倍数公式,要求我们全部背下来。考试时面对稍作变化的电路,我却大脑一片空白——这种经历恐怕不少电子工…...

Zynq 开发中的工程文件管理

Zynq 开发(Vivado、PetaLinux、Linux、U-Boot、驱动等),基本都会遇到的一个问题: 工程文件越来越多,但真正需要长期保存的东西其实没那么多。如果不把边界划清楚, Git 仓库很容易变成“源码 编译产物 工具…...