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

Docker用Web应用实例深入容器

一、准备工作

在开始前,需要在你的Mac电脑中安装Docker。在官方网站上有各种环境下的安装指南,用Mac电脑的就看Install Docker Desktop on Mac。

安装Docker

安装步骤非常简单:

  1. 如果是M1芯片的arm64架构,就下载Docker for Mac with Apple silicon。

  2. 双击Docker.dmg文件,然后把鲸鱼图标拖放到Applications文件夹即可。

    image

运行Docker

在应用中找到Docker图标,点击运行。

image

运行后,在菜单栏会看到多了一个鲸鱼图标:

image

然后,在终端用命令查下Docker的版本:

docker --version

再查下docker info是不是也正常。如果都正常,就可以用Node.js编写web应用了。

在这里,我是用Nestjs写的应用程序,代码非常简单。也就是用Nestjs的cli工具生成的,创建应用的这一步就直接跳过了,直接上代码:

// app.controller.ts部分
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';@Controller()
export class AppController {constructor(private readonly appService: AppService) {}@Get()getHello(): string {return this.appService.getHello();}
}// app.module.ts部分
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';@Module({imports: [],controllers: [AppController],providers: [AppService],
})
export class AppModule {}// app.service.ts部分
import { Injectable } from '@nestjs/common';@Injectable()
export class AppService {getHello(): string {return 'Hello World!';}
}// main.ts部分
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';async function bootstrap() {const app = await NestFactory.create(AppModule);await app.listen(process.env.PORT ?? 3000);
}
bootstrap();

在上面的代码中,就是用Nest框架启动了一个Web服务器,只有一个简单的功能是:打印出“Hello World!”。

那么,将这样的一个应用程序容器化,第一步是制作容器镜像。

二、Docker的配置文件:Dockerfile

首先,我们在这个Nestjs的应用程序的根目录下创建一个文本文件,文件名是:Dockerfile,没有扩展名的。

# 使用官方提供的Node.js开发镜像作为基础镜像
FROM node:22-slim# 工作目录切换为 /usr/src/app
WORKDIR /usr/src/app# 将 package.json复制到当前目录下
COPY package.json ./RUN npm config set registry https://registry.npmmirror.com/
# 使用npm命令安装这个应用所需要的依赖
RUN npm installRUN npm install -g pnpmCOPY . .# 暴露给外界访问容器3000端口
EXPOSE 3000# 设置容器进程为:pnpm run start:dev,即:这个Node应用开发环境的启动命令
CMD ["pnpm", "run", "start:dev"]

通过Dockerfile的内容,可以看到是用一些标准的大写词语来描述Docker镜像。这些大写的词语就是按上面内容顺序来处理的。

三、制作Docker镜像

接下来,可以用Docker制作这个应用的镜像了,在当前目录执行:

docker build -t nestjs-app .

这个-t是给这个镜像加tag,也就是起个名儿。docker build会自动加载当前目录中的Dockerfile,然后按照里面的顺序一个个的执行其中的大写词语。在这个过程里面,实际上就等同于Docker使用基础镜像启动了一个容器,然后在这个容器中一个个执行Dockerfile中的大写词语。

在每次执行后,都会生成一个对应的镜像层。

Docker build操作完成后,可以用 docker image命令查下结果:

docker image ls REPOSITORY           TAG                     IMAGE ID       CREATED         SIZE
nestjs-app          latest                  2badda7aef21   2 hours ago     1.11GB

四、使用Docker镜像启动容器

使用这个镜像,用docker run命令来启动容器:

docker run nestjs-app

在镜像名的后面,什么都不用写,这是因为在Dockerfile中已经指定CMD了,不然,就得把进程的开发环境启动命令加在后面:

docker run -p 3000:8080 nestjs-app pnpm run start:dev

在容器启动了之后,可以用docker ps命令看一下:

docker psCONTAINER ID   IMAGE               COMMAND                   CREATED 
8015b4eac7eb   nestjs-app   "docker-entrypoint.s…"   23 seconds ago

在这个命令中,我通过-p 3000:8080告诉Docker,把容器中8080端口映射到宿主机的3000端口。

这样,访问宿主机的3000端口,就可以看到容器中应用程序返回的结果:

image

这是VSCode中的插件 Thunder client,类似用curl http://localhost:3000

这样,已经使用容器完成了一个web应用的开发与测试。

http://www.lryc.cn/news/603312.html

相关文章:

  • Go语言实战案例-判断二叉树是否对称
  • 本地安装 SQLite 的详细步骤
  • p5.js 矩形rect绘制教程
  • SpringBoot整合RocketMQ(rocketmq-client.jar)
  • Python day28
  • 【智能协同云图库】智能协同云图库第八弹:基于阿里云百炼大模型—实现 AI 扩图功能
  • 2025年科研算力革命:8卡RTX 5090服务器如何重塑AI研究边界?
  • 0基礎網站開發技術教學(一) --(前端篇)--
  • 思途SQL学习 0729
  • 【CUDA显存不足的问题】
  • ironSource Ads Bidding 现已正式加入TopOn 聚合平台
  • 博弈论03——混合纳什均衡的收益求法
  • 【Linux入坑(一)—全志T133开发板适配欣瑞达LVDS 7寸(800*480)屏幕】
  • 函数对象 vs 函数指针 vs lambda:该用哪个才高效?
  • python学习DAY26打卡
  • Java高级技术知识点
  • GitLab的安装及使用
  • 路由器路由协议详解:从 RIP 到 OSPF 的技术演进
  • 理解Transformer解码器
  • 【术语扫盲】MCU与MPU
  • 《HCIA-Datacom 认证》希赛三色笔记:Vlan间三层通信过程解析
  • 高级08-Java JVM调优:优化你的Java应用
  • 面向对象系统的单元测试层次
  • 医疗AI新基建:MCP与A2A协议的破局与前瞻
  • MySQL——MVCC
  • Django自带的加密算法
  • 汇总10个高质量免费AI生成论文网站,支持GPT4.0和DeepSeek-R1
  • 云端文档管理新纪元:Paperless-ngx与cpolar打造的无边界文件生态
  • PHP性能优化与高并发处理:从基础到高级实践
  • 深入理解Java Map的entrySet()方法