Docker 从入门到上手:用一条命令完成项目部署
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. 部署更简单
传统部署项目可能需要:
- 登录服务器
- 安装运行环境
- 安装依赖
- 修改配置文件
- 启动服务
- 配置进程守护
- 配置日志目录
- 配置 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。
步骤:
- 访问 Docker 官网
- 下载 Docker Desktop for Windows
- 安装并启动
- 根据提示启用 WSL2
- 重启电脑
- 打开终端验证安装
验证命令:
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 会完成以下事情:
- 使用 Node.js 18 作为基础环境
- 创建
/app工作目录 - 复制依赖配置文件
- 安装项目依赖
- 复制项目源码
- 暴露 3000 端口
- 启动应用
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
这条命令会自动完成:
- 构建 Web 应用镜像
- 拉取 MySQL 镜像
- 创建网络
- 创建数据卷
- 启动 Web 容器
- 启动 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,可以按照下面路线循序渐进:
- 理解镜像和容器的关系
- 学会使用
docker run启动常见服务 - 学会查看日志和进入容器排查问题
- 学会编写 Dockerfile
- 学会使用 Docker Compose
- 学会配置数据卷和网络
- 尝试部署真实项目
- 学习镜像优化和安全配置
- 了解 CI/CD 自动构建镜像
- 进一步学习 Kubernetes
对于新手来说,不需要一开始就掌握所有高级概念。先把一个项目成功容器化并部署起来,比死记命令更重要。
十四、总结
Docker 的核心价值在于:统一环境、简化部署、提升效率、方便迁移。
对于新手来说,最重要的是掌握以下几个点:
- 镜像是模板,容器是运行实例
- Dockerfile 用来构建镜像
- Docker Compose 用来管理多容器项目
- 数据卷用于持久化数据
- 容器之间可以通过服务名通信
- 一键部署通常依赖
docker compose up -d
如果你只记住一条部署命令,那就是:
docker compose up -d
它代表了 Docker 部署体验中最重要的特点:简单、快速、可重复。
当你熟悉 Docker 后,无论是部署个人博客、后端接口、前端项目、数据库服务,还是搭建测试环境,都会变得更加高效。Docker 不只是一个工具,更是一种标准化的软件交付方式。
对于开发者而言,掌握 Docker 已经不再是加分项,而是越来越接近必备技能。只要从基础命令开始,逐步理解镜像、容器、网络、数据卷和 Compose,你就能真正感受到 Docker 在项目开发与部署中的强大价值。