从零开始玩转 Docker:手把手教你开发环境搭建与镜像打包实战

为什么你的开发机总是一团糟?

💡 推荐阅读:别再看配置单了!手把手教你5步测出云服务器真实性能,钱不白花

相信不少朋友都有过这样的经历:新换一台电脑,光是把 Node、Python、MySQL、Redis 这些环境装齐,就得折腾大半天。更别提版本冲突、依赖地狱,还有那句经典的“在我机器上明明是好的”。

其实,解决这些痛点的钥匙,就是 开发 docker。Docker 不是生产环境的专属工具,它更是开发者手中的瑞士军刀。今天,笔者(站长)就带大家从零开始,把开发环境彻底容器化,让你的项目真正做到“一次构建,处处运行”。

第一步:开发 Docker 的核心思维转变

在敲命令之前,我们先要把脑子里的那根弦拨正。在传统开发里,我们习惯把环境装进系统里;而在 Docker 的世界里,我们要把环境装进“盒子”里。

  • 镜像(Image): 相当于一个只读的模板,里面包含了代码运行所需的一切(系统库、运行时、依赖)。
  • 容器(Container): 镜像运行起来的实例,你可以把它看作是一个轻量级的虚拟机,但它启动只需毫秒级。
  • 数据卷(Volume): 用来持久化数据,否则容器一删,数据就跟着没了。

理解了这三个核心概念,接下来的操作就会非常顺理成章。

第二步:开发环境的快速搭建(以 Node.js 为例)

很多朋友觉得 Docker 笨重,其实是因为没掌握挂载目录的技巧。开发时,我们最需要的是热更新。下面这套组合拳,能让你在本地写的代码,实时同步到容器里执行。

2.1 编写优雅的 Dockerfile

在项目根目录创建一个名为 Dockerfile 的文件(注意没有后缀名),内容如下:

# 指定基础镜像,这里用 Node 18 版本
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 先将 package.json 复制进来,利用 Docker 的缓存机制
COPY package*.json ./

# 安装依赖
RUN npm install

# 将当前目录下的所有文件复制进镜像(开发环境通常用挂载替代)
COPY . .

# 暴露端口
EXPOSE 3000

# 启动命令
CMD ["npm", "run", "dev"]

这里有个小细节:先把 package.json 复制进去再执行 npm install,是为了利用 Docker 的层缓存。如果你先复制全部代码再安装依赖,那么每次改代码都会重新安装依赖,非常浪费时间。

2.2 使用 docker-compose 一键拉起

光有 Node 还不够,项目往往还需要数据库。这时候 docker-compose.yml 就该登场了。它能让你用一条命令,同时启动前端、后端和数据库。

version: '3.8'
services:
  web:
    build: .
    ports:
      - "3000:3000"
    volumes:
      - .:/app
      - /app/node_modules
    environment:
      - NODE_ENV=development
    depends_on:
      - db

  db:
    image: mysql:8.0
    ports:
      - "3306:3306"
    environment:
      MYSQL_ROOT_PASSWORD: root123
    volumes:
      - db_data:/var/lib/mysql

volumes:
  db_data:

注意看 volumes 里的 .:/app,这是把当前目录挂载到容器的 /app 目录。这意味着你本地保存代码,容器里立刻生效,配合 nodemon 等工具,热更新毫无压力。而 /app/node_modules 这个匿名卷,是为了防止本地的 node_modules 覆盖掉容器里安装的依赖(因为 Linux 和 Mac/Windows 的原生模块可能不兼容)。

第三步:镜像瘦身与多阶段构建

开发搞定了,接下来要上线。如果你直接把开发镜像推到生产环境,那镜像体积可能高达 1GB+,不仅拉取慢,还容易暴露源码。这时候,多阶段构建就是你的救命稻草。

# 第一阶段:构建阶段
FROM node:18-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build

# 第二阶段:运行阶段
FROM nginx:alpine
# 将构建好的静态文件复制到 nginx 目录
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

这种写法的好处是,最终的镜像里只包含 Nginx 和构建好的静态文件,没有任何源代码和 node_modules,体积直接从 1GB 降到几十 MB,安全又高效。

第四步:开发 Docker 时的常见坑与避坑技巧

笔者在刚开始用 Docker 开发时,也踩过不少坑,这里挑几个最典型的分享给大家。

常见问题 原因分析 解决方案
容器内时间不对 基础镜像默认 UTC 时区 在 Dockerfile 中加入 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
端口映射后无法访问 容器内应用监听了 127.0.0.1 确保应用监听 0.0.0.0,而非 localhost
挂载目录后权限报错 容器内用户 UID 与宿主机不一致 运行容器时加 --user $(id -u):$(id -g) 参数

第五步:让 Docker 开发体验更丝滑的小工具

工欲善其事,必先利其器。这里推荐几个笔者常用的工具,能极大提升开发效率:

  • Docker Desktop: Mac/Windows 用户必装,自带图形化管理界面。
  • VSCode Dev Containers: 直接让 VSCode 连接进容器里写代码,语法提示和调试体验与本地无异。
  • Lazydocker: 终端下的 Docker 管理神器,查看日志、切换容器只需按几个键。

写在最后的建议

掌握了开发 Docker 的技巧,你的开发效率会有质的飞跃。不过,Docker 本身只是工具,真正让它跑得飞快的,是一台性能强劲的服务器。如果你需要一台用于构建、测试或部署的云主机,笔者(站长)建议选择配置均衡的云服务器,比如 4核8G 起步的机型,内存充足才能同时跑起多个容器而不卡顿。

另外,如果你打算把 Docker 镜像推送到云端供团队使用,记得选择一个稳定、快速的镜像仓库服务,这样才能保证 docker pull 的速度。

希望这篇文章能帮你打开 Docker 开发的新世界大门。如果你在实操中遇到任何问题,欢迎在评论区留言,我们一起探讨解决。

延伸阅读

💡 【高性价比独享云服务器限时 1 折起】

新手搭建网站或部署容器,推荐选择高性价比独享云服务器。点击下方通道可享受限时折扣与专属优惠券:

👉 点此前往领取云服务器限时优惠券

🎁 全套实操配置文件与 AI 提效资料包免费下载

本文涉及的全套 Docker Compose 配置文件、服务器运维避坑手册及 AI 提效指令库已完整打包上传至夸克网盘,可直接免费极速转存:

👉 点击前往夸克网盘免费极速转存获取

💡 提示:推荐使用手机【夸克网盘 App】打开保存,新用户首月免费赠送 1TB 超大空间与免流量极速下载特权。

滚动至顶部