2026年Docker入门指南:从零开始部署你的第一个Web应用
2026年Docker入门指南:从零开始部署你的第一个Web应用
如果你是一名初学者,一定遇到过这样的场景:代码在自己电脑上运行完美,换到同事电脑就报错;明明按照文档一步步操作,环境就是配不起来。Docker正是解决这些问题的利器。本文将带你从零开始,用最简单的方式理解Docker,并亲手将一个Web应用部署到云端。
前言:为什么你需要了解Docker?
在2026年的今天,Docker已经成为软件开发中不可或缺的工具。它就像一个魔法盒子,能把你的应用程序连同它需要的所有东西打包在一起,无论在哪里打开,运行效果都一模一样。
想象一下:你开发了一个Web应用,需要Node.js 18、特定的依赖库、以及一些配置文件。以前,你要在新服务器上手动安装这些东西,稍有不慎就会出错。现在,你只需要把Docker“盒子”扔到服务器上,一键运行,一切就绪。
本文专为Docker零基础的你设计,全程动手操作,跟着做就能成功。
第一部分:Docker到底是什么?
在动手之前,我们先来搞懂三个核心概念。用厨房做菜的比喻来理解,会非常直观。
1. 镜像(Image):菜谱
镜像是一个只读的模板,里面包含了运行你的应用所需的一切:代码、运行环境、依赖库、配置文件。它就像一份菜谱,详细记录了做一道菜需要什么食材、怎么做。
关键特点:
- 镜像是静态的,不会改变
- 镜像是分层的,可以复用已有镜像作为基础(比如官方提供的Node.js镜像)
2. 容器(Container):做好的菜
容器是镜像的运行实例。当你按照菜谱(镜像)开始做菜时,那道正在做的菜就是容器。容器的特点是:
- 它是动态的,可以启动、停止、删除
- 每个容器都是隔离的,互不干扰
- 你可以从同一个镜像启动多个容器(就像按照同一份菜谱做多道菜)
3. 仓库(Registry):图书馆
仓库是用来存放和分享镜像的地方。最著名的是Docker Hub,里面有海量的官方镜像,比如Node.js、Python、MySQL等。你可以:
- 从仓库拉取(pull)别人做好的镜像
- 把自己做的镜像推送(push)到仓库,分享给团队或全世界
关系总结:
你从仓库(图书馆)拿到一份菜谱(镜像),按照菜谱做了一道菜(容器),这道菜被放在一个独立的盘子里(隔离环境)。
第二部分:实战准备——创建你的第一个Node.js应用
我们先用一个最简单的Node.js应用作为“食材”。
1. 创建项目文件夹
mkdir my-docker-app
cd my-docker-app
2. 创建package.json文件
{
"name": "my-docker-app",
"version": "1.0.0",
"description": "我的第一个Docker化应用",
"main": "src/index.js",
"scripts": {
"start": "node src/index.js"
},
"dependencies": {
"express": "^4.18.2"
}
}
3. 创建src/index.js文件
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello Docker!我的第一个容器化应用运行成功!');
});
app.listen(port, () => {
console.log(`应用运行在 http://localhost:${port}`);
});
此时,你的项目结构应该是:
my-docker-app/
├── package.json
└── src/
└── index.js
第三部分:编写Dockerfile——为你的应用制作“菜谱”
Dockerfile是一个文本文件,里面写着一系列指令,告诉Docker如何构建你的镜像。
第一步:创建一个初版Dockerfile
在项目根目录下创建名为Dockerfile的文件(注意没有后缀名),输入以下内容:
# 使用官方Node.js 18的轻量版作为基础镜像
FROM node:18-alpine
# 在镜像中创建工作目录
WORKDIR /app
# 复制所有文件到工作目录
COPY . .
# 安装依赖
RUN npm install
# 暴露应用运行的端口
EXPOSE 3000
# 启动命令
CMD ["node", "src/index.js"]
这个Dockerfile能工作,但不够好。我们来看看它的问题,然后优化。
第二步:优化版Dockerfile(多阶段构建)
把上面的Dockerfile替换成下面这个:
# 第一阶段:构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
# 先复制依赖文件(变化频率低)
COPY package*.json ./
# 只安装生产依赖
RUN npm ci --only=production
# 复制源代码
COPY . .
# 第二阶段:生产阶段
FROM node:18-alpine
WORKDIR /app
# 创建一个非root用户运行应用(更安全)
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
# 从构建阶段复制依赖和代码
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app ./
# 切换到非root用户
USER appuser
EXPOSE 3000
CMD ["node", "src/index.js"]
优化点说明:
- 利用缓存:先复制
package.json,只有依赖变化时才重新安装,大大加快构建速度 - 只装生产依赖:
npm ci --only=production只安装运行需要的包,镜像更小 - 多阶段构建:最终镜像只包含运行所需,不包含构建工具,体积更小
- 非root用户:提升安全性
第三步:创建.dockerignore文件
在项目根目录创建.dockerignore文件,排除不需要打包的文件:
node_modules
.git
*.log
.DS_Store
这会让构建更快,也避免把本地依赖打包进去。
第四部分:构建并运行容器
1. 构建镜像
打开终端,进入项目目录,执行:
docker build -t my-first-app:1.0 .
-t:给镜像打标签(名称:版本).:表示当前目录
构建成功后,可以用docker images查看本地所有镜像,你会看到my-first-app出现在列表里。
2. 运行容器
docker run -d -p 8080:3000 --name my-running-app my-first-app:1.0
-d:后台运行-p 8080:3000:把主机的8080端口映射到容器的3000端口--name:给容器起个名字
现在打开浏览器,地址栏输入 localhost:8080,你应该能看到“Hello Docker!”的欢迎信息。
3. 常用容器管理命令
| 命令 | 作用 |
|---|---|
docker ps |
查看运行中的容器 |
docker ps -a |
查看所有容器(包括已停止的) |
docker logs -f my-running-app |
实时查看容器日志 |
docker stop my-running-app |
停止容器 |
docker start my-running-app |
启动已停止的容器 |
docker rm my-running-app |
删除容器(需先停止) |
docker exec -it my-running-app /bin/sh |
进入容器内部 |
可以尝试最后一个命令,运行后进入容器,输入ls,你会发现里面有我们复制的文件。
第五部分:部署到云端——让全世界都能访问
本地运行成功后,我们来把它部署到云端。这里以Google Cloud Run为例,它是最简单的全托管容器运行平台,免费额度足够初学者使用。
准备工作
- 注册一个Google Cloud账号(需要信用卡,但免费额度足够)
- 安装Google Cloud CLI
步骤1:登录并配置项目
# 登录
gcloud auth login
# 设置你的项目ID(在GCP控制台创建)
gcloud config set project [你的项目ID]
步骤2:启用必要API
gcloud services enable artifactregistry.googleapis.com run.googleapis.com
步骤3:创建镜像仓库
gcloud artifacts repositories create my-app-repo \
--repository-format=docker \
--location=us-central1 \
--description="我的第一个Docker应用仓库"
步骤4:标记并推送镜像
# 为镜像打上云端仓库的标签
docker tag my-first-app:1.0 us-central1-docker.pkg.dev/[你的项目ID]/my-app-repo/my-first-app:1.0
# 配置Docker认证
gcloud auth configure-docker us-central1-docker.pkg.dev
# 推送镜像到云端
docker push us-central1-docker.pkg.dev/[你的项目ID]/my-app-repo/my-first-app:1.0
步骤5:部署到Cloud Run
gcloud run deploy my-first-app-service \
--image us-central1-docker.pkg.dev/[你的项目ID]/my-app-repo/my-first-app:1.0 \
--platform managed \
--region us-central1 \
--allow-unauthenticated
部署成功后,终端会返回一个网址,类似:https://my-first-app-service-xxxxxx-uc.a.run.app。点击它,你就看到自己的应用已经运行在云端了!
第六部分:高质量的博客是怎样炼成的?
写到这里,我其实一直在实践一篇高质量技术博客的三大要素:
1. 准确性与实用性
- 代码有详细注释,告诉你每行在做什么
- 明确标注版本号(如
node:18-alpine),避免版本差异带来的奇怪问题
2. 清晰的结构与逻辑
- 从概念到实践,循序渐进
- 用做菜的比喻降低理解门槛
- 每个部分都有小结,帮助回顾
3. 读者体验
- 语言平常、亲切
- 代码块带语法高亮,便于阅读
结语:你的容器化之旅才刚刚开始
恭喜你!你已经完成了:
- 理解了Docker的核心概念
- 编写了一个生产级的Dockerfile
- 在本地成功运行了容器化应用
- 将应用部署到了全球云平台
这只是Docker世界的冰山一角。下一步,你可以探索:
- Docker Compose:同时管理多个容器(比如应用+数据库)
- Kubernetes:容器编排的行业标准,用于大规模集群管理
- CI/CD:代码推送后自动构建、测试、部署
最重要的建议:别光看,打开终端跟着做一遍。如果遇到问题,查看日志(docker logs)是排错的首选项。
如果你在操作中遇到任何问题,欢迎在评论区留言,我会尽力解答。期待看到你的第一个容器化应用!🚀
- 点赞
- 收藏
- 关注作者
评论(0)