上一篇 下一篇 分享链接 返回 返回顶部

Docker 从入门到上手:用一条命令完成项目部署

发布人:慈云数据-客服中心 发布时间:19小时前 阅读量:4

Docker 新手入门指南|一键部署

在现代软件开发与运维中,Docker 已经成为非常重要的基础工具。无论你是后端开发、前端开发、测试工程师,还是运维人员,只要涉及项目部署、环境管理、服务编排,Docker 都能显著提升效率。

很多新手第一次接触 Docker 时,常常会有这样的疑问:

  • Docker 到底是什么?
  • 它和虚拟机有什么区别?
  • 为什么大家都说 Docker 部署项目很方便?
  • 如何通过 Docker 实现一键部署?
  • 我该从哪些命令开始学习?

本文将以新手视角,从基础概念讲起,带你了解 Docker 的核心思想、常用命令、镜像与容器的关系,并通过一个简单示例演示如何使用 Docker 完成项目的一键部署。


一、Docker 是什么?

简单来说,Docker 是一种容器化技术

它可以把应用程序以及运行应用所需的环境、依赖、配置文件等打包到一个标准化的单元中,这个单元就叫做 容器

你可以把 Docker 理解为一个“应用打包和运行工具”。通过 Docker,我们可以做到:

在我的电脑上能运行,在服务器上也能运行;在测试环境能运行,在生产环境也能运行。

这解决了软件开发中非常经典的问题:环境不一致导致项目无法正常运行

例如,一个项目可能依赖:

  • Node.js 18
  • MySQL 8
  • Redis 7
  • Nginx
  • 特定版本的系统库
  • 某些环境变量配置

如果手动在每台服务器上安装这些环境,不仅繁琐,而且容易出错。而 Docker 可以把这些依赖环境写进配置文件中,让部署过程标准化、自动化。


二、Docker 和虚拟机有什么区别?

很多新手会把 Docker 和虚拟机混淆。它们确实都能实现环境隔离,但实现方式不同。

1. 虚拟机

虚拟机会模拟一整套完整的操作系统。例如你在 Windows 电脑上安装 VMware,然后在里面运行 Ubuntu。这个 Ubuntu 拥有自己的内核、系统服务和资源。

虚拟机的特点是:

  • 隔离性强
  • 启动较慢
  • 占用资源较多
  • 系统镜像通常较大
  • 适合运行完整操作系统环境

2. Docker 容器

Docker 容器并不会启动一个完整的操作系统,而是共享宿主机的内核,在隔离的环境中运行应用进程。

Docker 的特点是:

  • 启动速度快
  • 占用资源少
  • 镜像体积相对较小
  • 更适合应用部署
  • 便于快速扩容和迁移

可以简单理解为:

虚拟机像是一台完整的电脑,Docker 容器像是一个独立运行的应用盒子。


三、为什么要使用 Docker?

Docker 的流行不是偶然的,它解决了很多实际问题。

1. 解决环境不一致问题

开发人员本地使用的是 macOS,测试环境是 Linux,生产服务器也是 Linux,但系统版本、依赖版本可能完全不同。传统部署方式经常出现:

  • 本地运行正常,服务器启动失败
  • 缺少某个依赖库
  • 版本不兼容
  • 配置文件路径不同
  • 服务端口冲突

Docker 可以把运行环境和应用一起打包,减少环境差异带来的问题。

2. 部署更简单

传统部署项目可能需要:

  1. 登录服务器
  2. 安装运行环境
  3. 安装依赖
  4. 修改配置文件
  5. 启动服务
  6. 配置进程守护
  7. 配置日志目录
  8. 配置 Nginx 反向代理

而使用 Docker 后,部署过程可以变成:

docker compose up -d

一条命令即可启动所有服务。

3. 方便迁移

如果你的应用已经容器化,那么从一台服务器迁移到另一台服务器时,只需要复制 Docker 配置文件,然后重新启动即可。

4. 便于扩展

Docker 常常和 Kubernetes、Docker Compose 等工具配合使用,可以非常方便地实现多服务管理、集群部署、负载均衡等能力。

5. 保持系统干净

使用 Docker 后,很多依赖都安装在容器内部,不会污染宿主机系统。删除容器和镜像后,相关环境也可以一起清理。


四、Docker 的核心概念

学习 Docker,首先要理解几个核心概念:镜像、容器、仓库、Dockerfile、Docker Compose


1. 镜像 Image

镜像可以理解为一个应用运行环境的模板。

例如:

  • nginx 镜像包含 Nginx 服务
  • mysql 镜像包含 MySQL 数据库
  • redis 镜像包含 Redis 服务
  • node 镜像包含 Node.js 运行环境
  • openjdk 镜像包含 Java 运行环境

镜像本身是静态的,不能直接运行。它更像是一个“安装包”或者“模板”。

查看本地镜像:

docker images

拉取一个镜像:

docker pull nginx

删除一个镜像:

docker rmi nginx

2. 容器 Container

容器是由镜像创建出来的运行实例。

如果说镜像是类,那么容器就是对象;如果说镜像是模板,那么容器就是通过模板创建出的实际运行环境。

运行一个 Nginx 容器:

docker run -d -p 8080:80 --name my-nginx nginx

参数说明:

  • -d:后台运行
  • -p 8080:80:将宿主机的 8080 端口映射到容器的 80 端口
  • --name my-nginx:给容器命名
  • nginx:使用的镜像名称

访问:

http://服务器IP:8080

查看正在运行的容器:

docker ps

查看所有容器:

docker ps -a

停止容器:

docker stop my-nginx

启动容器:

docker start my-nginx

删除容器:

docker rm my-nginx

3. 仓库 Registry

Docker 镜像通常存放在镜像仓库中。

常见仓库有:

  • Docker Hub
  • 阿里云镜像仓库
  • 腾讯云容器镜像服务
  • 华为云镜像仓库
  • GitHub Container Registry

拉取镜像时,Docker 默认会从 Docker Hub 获取。例如:

docker pull redis

如果你自己构建了镜像,也可以推送到远程仓库,方便服务器拉取部署。


4. Dockerfile

Dockerfile 是用来构建镜像的配置文件。

它描述了镜像如何生成,包括:

  • 基于哪个基础镜像
  • 复制哪些文件
  • 安装哪些依赖
  • 暴露哪些端口
  • 容器启动时执行什么命令

一个简单的 Node.js 项目 Dockerfile 示例:

FROM node:18-alpine

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

说明:

  • FROM node:18-alpine:使用 Node.js 18 的轻量级镜像
  • WORKDIR /app:设置工作目录
  • COPY package*.json ./:复制依赖文件
  • RUN npm install:安装依赖
  • COPY . .:复制项目代码
  • EXPOSE 3000:声明容器内部端口
  • CMD ["npm", "start"]:容器启动命令

构建镜像:

docker build -t my-node-app .

运行镜像:

docker run -d -p 3000:3000 --name node-app my-node-app

5. Docker Compose

Docker Compose 是 Docker 官方提供的多容器编排工具。

当项目只有一个服务时,使用 docker run 还比较简单。但现实项目往往包含多个服务,例如:

  • Web 应用
  • MySQL
  • Redis
  • Nginx
  • 消息队列
  • 后台任务服务

如果每个服务都手动执行 docker run,命令会非常长,而且不方便维护。

Docker Compose 可以通过一个 docker-compose.yml 文件统一管理这些服务。

启动所有服务:

docker compose up -d

停止所有服务:

docker compose down

查看日志:

docker compose logs -f

五、Docker 安装指南

不同操作系统安装 Docker 的方式略有不同。


1. Windows 安装 Docker

Windows 用户推荐安装 Docker Desktop

步骤:

  1. 访问 Docker 官网
  2. 下载 Docker Desktop for Windows
  3. 安装并启动
  4. 根据提示启用 WSL2
  5. 重启电脑
  6. 打开终端验证安装

验证命令:

docker version

如果能看到客户端和服务端版本信息,说明安装成功。


2. macOS 安装 Docker

macOS 用户同样推荐安装 Docker Desktop。

安装完成后,在终端执行:

docker version

如果输出 Docker 版本信息,则说明安装成功。


3. Linux 安装 Docker

以 Ubuntu 为例:

sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker

查看版本:

docker version

如果不想每次都使用 sudo,可以将当前用户加入 docker 用户组:

sudo usermod -aG docker $USER

然后退出当前终端并重新登录。


六、Docker 常用命令速查

下面整理一些新手最常用的 Docker 命令。


1. 镜像相关命令

docker pull nginx

拉取镜像。

docker images

查看本地镜像。

docker rmi 镜像名或镜像ID

删除镜像。

docker build -t 镜像名 .

根据 Dockerfile 构建镜像。


2. 容器相关命令

docker run -d -p 8080:80 --name my-nginx nginx

创建并运行容器。

docker ps

查看正在运行的容器。

docker ps -a

查看所有容器。

docker stop 容器名或容器ID

停止容器。

docker start 容器名或容器ID

启动容器。

docker restart 容器名或容器ID

重启容器。

docker rm 容器名或容器ID

删除容器。


3. 日志与调试命令

docker logs 容器名

查看容器日志。

docker logs -f 容器名

实时查看日志。

docker exec -it 容器名 sh

进入容器内部。

如果容器中有 bash,也可以使用:

docker exec -it 容器名 bash

查看容器资源占用:

docker stats

4. 清理命令

删除停止状态的容器:

docker container prune

删除无用镜像:

docker image prune

删除无用网络:

docker network prune

清理所有未使用资源:

docker system prune

如果需要更彻底清理:

docker system prune -a

注意:清理命令可能会删除未使用的镜像和容器,生产环境请谨慎执行。


七、使用 Docker 一键部署 Nginx

我们先从最简单的 Nginx 开始体验一键部署。

执行命令:

docker run -d \
  --name nginx-demo \
  -p 8080:80 \
  nginx

然后访问:

http://服务器IP:8080

如果看到 Nginx 欢迎页面,说明部署成功。

停止服务:

docker stop nginx-demo

删除容器:

docker rm nginx-demo

这个例子说明,只要服务器安装了 Docker,我们不需要手动安装 Nginx,只需要一条命令即可运行一个 Nginx 服务。


八、使用 Docker Compose 实现一键部署

下面我们用一个更贴近实际项目的示例,演示如何通过 Docker Compose 部署一个 Web 应用和 MySQL 数据库。

假设项目目录结构如下:

my-app/
├── app/
│   ├── Dockerfile
│   ├── package.json
│   └── src/
├── docker-compose.yml
└── .env

1. 编写 Dockerfile

app/Dockerfile 中写入:

FROM node:18-alpine

WORKDIR /app

COPY package*.json ./

RUN npm install --registry=https://registry.npmmirror.com

COPY . .

EXPOSE 3000

CMD ["npm", "start"]

这个 Dockerfile 会完成以下事情:

  1. 使用 Node.js 18 作为基础环境
  2. 创建 /app 工作目录
  3. 复制依赖配置文件
  4. 安装项目依赖
  5. 复制项目源码
  6. 暴露 3000 端口
  7. 启动应用

2. 编写 docker-compose.yml

在项目根目录创建 docker-compose.yml

services:
  web:
    build:
      context: ./app
    container_name: my-app-web
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=mysql
      - DB_PORT=3306
      - DB_USER=root
      - DB_PASSWORD=123456
      - DB_NAME=myapp
    depends_on:
      - mysql
    restart: always

  mysql:
    image: mysql:8.0
    container_name: my-app-mysql
    ports:
      - "3306:3306"
    environment:
      - MYSQL_ROOT_PASSWORD=123456
      - MYSQL_DATABASE=myapp
    volumes:
      - mysql-data:/var/lib/mysql
    restart: always

volumes:
  mysql-data:

配置说明:

  • web:表示 Web 应用服务
  • mysql:表示 MySQL 数据库服务
  • build.context:指定从哪个目录构建镜像
  • ports:端口映射
  • environment:环境变量
  • depends_on:指定服务启动依赖
  • volumes:数据持久化
  • restart: always:容器异常退出后自动重启

3. 一键启动项目

在项目根目录执行:

docker compose up -d

这条命令会自动完成:

  1. 构建 Web 应用镜像
  2. 拉取 MySQL 镜像
  3. 创建网络
  4. 创建数据卷
  5. 启动 Web 容器
  6. 启动 MySQL 容器

查看运行状态:

docker compose ps

查看日志:

docker compose logs -f

停止项目:

docker compose down

如果需要连同数据卷一起删除:

docker compose down -v

注意:-v 会删除数据库数据,生产环境请谨慎使用。


九、Docker 数据持久化

容器本身是可以删除和重建的。如果数据库数据只保存在容器内部,那么删除容器后数据可能会丢失。

因此,Docker 提供了数据卷 Volume 机制,用于持久化数据。

例如 MySQL 配置:

volumes:
  - mysql-data:/var/lib/mysql

这表示把 MySQL 容器内的 /var/lib/mysql 数据目录挂载到 Docker 管理的数据卷 mysql-data 中。

查看数据卷:

docker volume ls

删除数据卷:

docker volume rm 数据卷名称

除了 Volume,也可以使用宿主机目录挂载:

volumes:
  - ./mysql-data:/var/lib/mysql

区别是:

  • Volume 由 Docker 管理,适合大多数场景
  • 目录挂载更直观,方便直接查看文件
  • 生产环境通常需要结合备份策略使用

十、Docker 网络基础

Docker Compose 默认会为项目创建一个独立网络。同一个 Compose 项目中的服务可以通过服务名互相访问。

例如在上面的示例中,Web 应用连接 MySQL 时,数据库地址不是 localhost,而是:

mysql

原因是 mysql 是 Compose 中定义的服务名。

新手很容易犯一个错误:在容器里连接数据库时写 localhost

需要注意:

容器内部的 localhost 指的是容器自己,而不是宿主机,也不是其他容器。

所以在 Compose 场景下,服务之间应该使用服务名通信。


十一、Docker 部署中的常见问题

1. 端口被占用

如果运行容器时报错:

port is already allocated

说明宿主机端口已经被其他程序占用。

可以查看端口占用情况:

lsof -i:8080

或者换一个端口:

docker run -d -p 8081:80 nginx

2. 容器启动后马上退出

查看日志:

docker logs 容器名

常见原因包括:

  • 启动命令错误
  • 配置文件错误
  • 依赖安装失败
  • 数据库连接失败
  • 环境变量缺失

3. 修改代码后没有生效

如果代码已经打进镜像,需要重新构建:

docker compose up -d --build

如果使用的是目录挂载,则需要确认挂载路径是否正确。


4. 数据库连接失败

排查方向:

  • 数据库容器是否正常运行
  • 用户名和密码是否正确
  • 数据库名是否存在
  • Web 服务连接地址是否写成了服务名
  • 数据库是否已经初始化完成

有时 Web 服务启动太快,而数据库还没完全准备好。此时可以在应用中加入重试机制,或者使用健康检查。


十二、生产环境部署建议

Docker 很方便,但生产环境不能只追求“能跑”,还要考虑安全性、稳定性和可维护性。

1. 不要把敏感信息写死

例如数据库密码、密钥、Token 等,不建议直接写在代码或公开仓库中。

可以使用:

  • .env 文件
  • Docker secrets
  • 云厂商密钥管理服务
  • CI/CD 环境变量

2. 使用固定版本镜像

不建议生产环境长期使用:

image: mysql:latest

更推荐:

image: mysql:8.0

因为 latest 可能会随着时间变化,导致部署结果不可控。


3. 配置日志和监控

至少需要关注:

  • 容器是否存活
  • CPU 使用率
  • 内存占用
  • 磁盘空间
  • 应用错误日志
  • 数据库连接数

可以配合 Prometheus、Grafana、ELK、Loki 等工具。


4. 定期备份数据

尤其是数据库服务,必须建立备份机制。Docker 数据卷不是备份方案,只是持久化方案。

可以定期执行数据库导出,并上传到对象存储或备份服务器。


5. 控制容器权限

生产环境尽量避免容器使用过高权限,例如:

privileged: true

除非确实必要,否则不要开启特权模式。


十三、适合新手的学习路线

如果你刚开始学习 Docker,可以按照下面路线循序渐进:

  1. 理解镜像和容器的关系
  2. 学会使用 docker run 启动常见服务
  3. 学会查看日志和进入容器排查问题
  4. 学会编写 Dockerfile
  5. 学会使用 Docker Compose
  6. 学会配置数据卷和网络
  7. 尝试部署真实项目
  8. 学习镜像优化和安全配置
  9. 了解 CI/CD 自动构建镜像
  10. 进一步学习 Kubernetes

对于新手来说,不需要一开始就掌握所有高级概念。先把一个项目成功容器化并部署起来,比死记命令更重要。


十四、总结

Docker 的核心价值在于:统一环境、简化部署、提升效率、方便迁移

对于新手来说,最重要的是掌握以下几个点:

  • 镜像是模板,容器是运行实例
  • Dockerfile 用来构建镜像
  • Docker Compose 用来管理多容器项目
  • 数据卷用于持久化数据
  • 容器之间可以通过服务名通信
  • 一键部署通常依赖 docker compose up -d

如果你只记住一条部署命令,那就是:

docker compose up -d

它代表了 Docker 部署体验中最重要的特点:简单、快速、可重复

当你熟悉 Docker 后,无论是部署个人博客、后端接口、前端项目、数据库服务,还是搭建测试环境,都会变得更加高效。Docker 不只是一个工具,更是一种标准化的软件交付方式。

对于开发者而言,掌握 Docker 已经不再是加分项,而是越来越接近必备技能。只要从基础命令开始,逐步理解镜像、容器、网络、数据卷和 Compose,你就能真正感受到 Docker 在项目开发与部署中的强大价值。

目录结构
全文