返回技术资讯

Docker容器化部署入门实战:十堰开发者从本地到生产环境的完整指南

Docker容器化部署十堰开发者运维教程网站建设

为什么十堰的开发者绕不开 Docker

在十堰,很多软件团队承接的是来自武汉、西安乃至长三角的项目,交付节奏快、服务器数量少、人手精简。过去我们的部署流程往往是:本地写好代码 → FTP 上传 → 登录服务器手动装 Node.js / PHP / MySQL → 改配置 → 重启。结果就是经典的那句话——"在我电脑上明明能跑"。

问题的根源不在于代码,而在于环境不一致:本地是 Node 20,服务器是 Node 16;本地 MySQL 8.0,服务器还是 5.7;系统里装了一个全局依赖,另一台机器没有。Docker 的核心价值,就是把"应用 + 它的运行环境 + 依赖版本"一起打包成镜像(Image),换任何一台服务器只要拉取镜像就能启动,真正做到一次构建、到处运行。对于人手有限的十堰本地技术团队来说,这意味着部署时间从半天缩短到几分钟,回滚也只是一个命令的事。

Docker 的三个核心概念:用一句话讲清楚

镜像 Image

镜像是只读模板,好比一张"光盘"。它里面包含操作系统基础层、运行环境和你的应用代码。例如 node:20-alpine 就是一张自带 Node.js 20 的精简系统光盘,体积只有几十 MB。

容器 Container

容器是镜像运行起来的实例,好比光盘放进播放器里播放。一个镜像可以启动无数个互不干扰的容器,每个容器都有独立的进程、网络和文件系统。

仓库 Registry

仓库是存放镜像的地方,好比应用商店。官方仓库 Docker Hub 免费公开,企业也可以自建私有仓库(如 Harbor)来存放内部镜像。

第一步:在 Linux 服务器上安装 Docker

以主流的 Ubuntu 22.04 / 24.04 为例,使用官方一键脚本最省事:

# 下载并执行官方安装脚本
curl -fsSL https://get.docker.com | bash -s docker

# 启动并设置开机自启
systemctl enable --now docker

# 验证安装是否成功
docker version
docker run hello-world

如果看到 Hello from Docker! 的输出,说明环境已经就绪。国内服务器拉取镜像慢时,可以配置镜像加速器,在 /etc/docker/daemon.json 中写入 registry-mirrors 地址后执行 systemctl restart docker 即可。

实战案例一:用 Docker 部署一个 Node.js 网站

假设我们为一家十堰本地的制造企业做了一个官网后台接口,项目根目录需要新建一个名为 Dockerfile 的文件(注意没有后缀):

# 1. 基于 Node 20 精简版镜像
FROM node:20-alpine

# 2. 设置容器内的工作目录
WORKDIR /app

# 3. 先拷贝依赖清单,利用缓存加速构建
COPY package*.json ./
RUN npm install --production

# 4. 再拷贝其余源码
COPY . .

# 5. 暴露容器端口
EXPOSE 3000

# 6. 容器启动命令
CMD ["node", "server.js"]

解释一下为什么要"先拷贝 package.json 再拷贝源码":Docker 是分层构建的,只要依赖清单没变,npm install 这一层就会命中缓存,后续改代码时构建速度能快好几倍。构建并运行:

# 构建镜像,-t 指定名字和标签
docker build -t shiyan-web-api:1.0 .

# 后台运行容器,把宿主机 80 端口映射到容器 3000
docker run -d --name web-api -p 80:3000 --restart=always shiyan-web-api:1.0

# 查看运行状态和日志
docker ps
docker logs -f web-api

其中 --restart=always 非常关键,它保证服务器重启或容器崩溃后自动拉起服务,这对无人值守的生产环境至关重要。

实战案例二:docker-compose 一键编排 Web + 数据库

真实项目里,一个网站往往同时需要应用服务和数据库。逐个 docker run 太麻烦,Docker Compose 用一份 YAML 文件就能把整套环境描述清楚。新建 docker-compose.yml:

version: "3.9"
services:
  web:
    build: .
    ports:
      - "80:3000"
    environment:
      - DB_HOST=db
      - DB_USER=appuser
      - DB_PASS=StrongPass_2026
    depends_on:
      - db
    restart: always

  db:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=RootPass_2026
      - MYSQL_DATABASE=shiyan_site
      - MYSQL_USER=appuser
      - MYSQL_PASSWORD=StrongPass_2026
    volumes:
      - ./mysql-data:/var/lib/mysql
    restart: always

然后在同目录执行一条命令即可启动整套服务:

# 后台启动所有服务
docker compose up -d

# 查看服务状态
docker compose ps

# 停止并移除(不删数据卷)
docker compose down

注意 depends_on 只保证启动顺序,不保证数据库已经"可用",生产环境建议在应用里加一段连接重试逻辑,避免容器启动瞬间数据库还没初始化完成而报错。

数据持久化:别让容器一删数据就没了

容器本身是"无状态"的,一旦执行 docker rm,里面的文件就消失了。所以数据库、上传文件、日志必须通过 数据卷(Volume) 或 绑定挂载(Bind Mount) 保存到宿主机。上面例子里的 ./mysql-data:/var/lib/mysql 就是绑定挂载,把数据库文件写到服务器当前目录下。备份时直接打包这个目录即可:

# 备份数据库到宿主机
docker exec shiyan-web-db mysqldump -uroot -p shiyan_site > backup_$(date +%F).sql

日常运维必备命令速查

  • docker ps -a:列出所有容器(含已停止)
  • docker images:查看本地镜像列表
  • docker exec -it 容器名 sh:进入容器内部排查问题
  • docker logs --tail 100 容器名:查看最近 100 行日志
  • docker system prune -a:清理无用的镜像和容器,释放磁盘
  • docker stats:实时查看各容器 CPU / 内存占用

生产环境的三条硬性建议

第一,不要把密码写死在 Dockerfile 里,改用环境变量或 .env 文件,并把它加入 .gitignore,防止密钥随代码泄露到仓库。第二,使用多阶段构建压缩镜像体积,把编译环境和运行环境分开,最终镜像往往能从 1GB 降到 150MB 以内。第三,做好日志与监控,配置日志轮转(max-size、max-file),避免日志把服务器磁盘写满导致服务宕机。

结语

Docker 不是什么高深的技术,它是每个十堰开发者都应该掌握的基础工程能力。它解决的正是"部署靠玄学、回滚靠祈祷"的老问题。建议你先在一台测试服务器上跑通本文的两个实战案例,再逐步把公司现有项目容器化。当你能用一条 docker compose up -d 就把整套网站环境拉起来时,你就已经迈过了从"写代码"到"能交付"的关键一道门槛。对于十堰的软件开发团队而言,容器化不仅是技术升级,更是承接更大项目、提升交付质量的底气。

准备好开始您的项目了吗?

无论是软件开发、网站建设还是APP定制,我们都能为您提供专业解决方案