Docker 一键部署实战:从安装到 Compose 编排,轻松搞定上线
Docker Docker部署教程|一键部署
在现代软件开发与运维中,Docker 已经成为非常重要的基础工具。它能够把应用程序及其运行环境一起打包,做到“一次构建,到处运行”。对于开发者来说,这意味着环境不再依赖个人电脑配置;对于运维人员来说,这意味着部署更标准、更稳定、更容易复制。
如果你正在寻找一种快速、可重复、低成本的部署方式,那么 Docker 的“一键部署”思路非常适合你。本文将从零开始,带你了解 Docker 的基本概念、安装方法、常见命令、docker-compose 编排方式,以及如何通过一个简单的项目实现真正意义上的一键部署。
一、为什么选择 Docker
在传统部署方式中,我们往往会遇到这些问题:
- 项目在开发环境能跑,到了服务器就报错
- 不同项目之间依赖冲突,比如 Python 版本、Node 版本、Java 环境不一致
- 部署时需要手动安装数据库、缓存、Nginx 等服务,步骤繁琐
- 回滚困难,一旦升级失败,恢复成本很高
而 Docker 的核心优势就是:
1. 环境一致
无论是开发机、测试机还是生产机,只要镜像相同,运行环境基本一致。
2. 部署快速
镜像构建好后,服务器上只需要拉取镜像并启动容器即可。
3. 便于隔离
每个容器都是独立的,不会互相干扰。
4. 易于扩展
配合 docker-compose 或 Kubernetes,可以轻松管理多个服务。
5. 更适合自动化
Docker 很适合和 CI/CD 集成,实现自动构建、自动发布、自动回滚。
二、Docker 的核心概念
在正式部署前,先理解几个关键概念。
1. 镜像(Image)
镜像可以理解为“应用模板”。它包含了运行程序所需的代码、依赖、系统库等内容。
2. 容器(Container)
容器是镜像运行后的实例。镜像像“安装包”,容器像“正在运行的软件”。
3. Dockerfile
Dockerfile 是用来构建镜像的脚本文件。你可以通过它定义基础镜像、复制代码、安装依赖、暴露端口、启动命令等。
4. 仓库(Registry)
镜像仓库用于存放镜像,比如 Docker Hub、阿里云镜像仓库、私有仓库等。
5. Docker Compose
Docker Compose 用于定义和管理多个容器服务。它适合同时部署 Web、数据库、缓存、消息队列等多个组件。
三、Docker 安装教程
下面以常见的 Linux 服务器为例进行说明。由于生产环境通常部署在 CentOS、Ubuntu、Debian 等 Linux 系统上,这里以 Ubuntu 为例演示。
如果你使用的是 CentOS、Rocky Linux 或其他发行版,步骤类似,主要差异在于安装命令不同。
1. 更新系统包
sudo apt update
sudo apt upgrade -y
2. 安装必要依赖
sudo apt install -y ca-certificates curl gnupg lsb-release
3. 添加 Docker 官方 GPG 密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
4. 添加 Docker 软件源
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
5. 安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
6. 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
7. 验证安装
docker version
docker run hello-world
如果能看到欢迎信息,说明 Docker 已安装成功。
四、Docker 基础命令速查
下面这些命令在日常部署中非常常用。
查看 Docker 版本
docker version
查看正在运行的容器
docker ps
查看所有容器
docker ps -a
拉取镜像
docker pull nginx
运行容器
docker run -d -p 8080:80 nginx
含义:
-d:后台运行-p 8080:80:将宿主机 8080 端口映射到容器 80 端口
停止容器
docker stop 容器ID
启动容器
docker start 容器ID
删除容器
docker rm 容器ID
删除镜像
docker rmi 镜像ID
查看日志
docker logs -f 容器ID
进入容器内部
docker exec -it 容器ID /bin/bash
五、什么是“一键部署”
很多人说 Docker 可以“一键部署”,其实这个概念并不神秘。
所谓一键部署,通常是指:
- 服务器安装好 Docker 和 Docker Compose
- 准备好项目的
Dockerfile和docker-compose.yml - 通过一个命令或一个脚本完成拉取、构建、启动、更新
比如只需要执行:
docker compose up -d
就可以完成:
- 启动应用
- 启动数据库
- 启动缓存
- 自动连接网络
- 自动挂载数据卷
这就是 Docker 一键部署最常见的实现方式。
六、使用 Docker 部署一个简单项目
下面我们以一个常见的 Web 项目为例,演示如何实现一键部署。
这个项目包含三个部分:
- Web 应用
- MySQL 数据库
- Nginx 反向代理
为了便于理解,这里使用一个通用结构,你可以把它替换成自己的项目。
七、项目目录结构
建议按下面方式组织项目文件:
project/
├── app/
│ ├── Dockerfile
│ ├── package.json
│ └── src/
├── nginx/
│ └── default.conf
├── docker-compose.yml
└── .env
如果是 Java、Python、Go 项目,目录结构会略有不同,但整体思路一致。
八、编写 Dockerfile
下面是一个通用的前端或 Node.js 应用 Dockerfile 示例。
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["npm", "run", "start"]
说明:
FROM:指定基础镜像WORKDIR:设置工作目录COPY:复制文件到容器内RUN npm install:安装依赖EXPOSE 3000:暴露端口CMD:启动命令
如果是 Python 项目,可以改成:
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["python", "app.py"]
九、编写 docker-compose.yml
docker-compose.yml 是一键部署的核心文件。它负责定义服务、网络、端口、数据卷等。
下面给出一个完整示例:
version: "3.9"
services:
web:
build: ./app
container_name: demo-web
restart: always
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DB_HOST=mysql
- DB_PORT=3306
- DB_NAME=demo
- DB_USER=root
- DB_PASSWORD=123456
depends_on:
- mysql
networks:
- demo-network
mysql:
image: mysql:8.0
container_name: demo-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: demo
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
networks:
- demo-network
nginx:
image: nginx:alpine
container_name: demo-nginx
restart: always
ports:
- "80:80"
volumes:
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- web
networks:
- demo-network
volumes:
mysql_data:
networks:
demo-network:
driver: bridge
十、Nginx 配置示例
在 nginx/default.conf 中配置反向代理:
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://web:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
作用
- 用户访问服务器 80 端口
- Nginx 将请求转发到
web容器 - Web 服务内部再连接 MySQL
这样就实现了前端访问统一入口、后端服务独立运行。
十一、环境变量配置
建议把敏感信息放在 .env 文件中,避免直接写死在配置里。
例如:
MYSQL_ROOT_PASSWORD=123456
MYSQL_DATABASE=demo
然后在 docker-compose.yml 中引用:
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
这样做的好处是:
- 配置更灵活
- 方便区分开发、测试、生产环境
- 密码修改更加方便
十二、一键部署命令
当所有文件准备好后,只需要在项目根目录执行:
docker compose up -d --build
这条命令的含义是:
up:启动服务-d:后台运行--build:先构建镜像再启动
如果你是第一次部署,这就是最典型的一键部署方式。
十三、更新部署怎么做
如果项目代码更新了,通常只需执行:
docker compose up -d --build
如果想清理旧容器并重新部署,可以先执行:
docker compose down
docker compose up -d --build
如果数据库数据已经挂载到 volume 中,通常不会丢失数据。
十四、常见部署场景
Docker 不只是适合单体应用,也非常适合以下场景:
1. 个人博客
例如 WordPress + MySQL + Nginx
2. 后台管理系统
例如 Vue 前端 + Spring Boot 后端 + MySQL
3. 微服务环境
多个服务分别容器化,通过网络互联
4. 测试环境
快速拉起一套与生产相似的环境
5. CI/CD 自动化发布
代码提交后自动构建镜像并部署到服务器
十五、Docker 部署中的常见问题
1. 端口冲突
如果提示端口已被占用,可以使用:
sudo lsof -i :80
或者修改 docker-compose.yml 中的端口映射。
2. 容器启动后立即退出
通常是启动命令错误、配置文件缺失或依赖未安装。可查看日志:
docker logs 容器ID
3. 数据库连接失败
检查以下几点:
- 服务名是否写对
- 端口是否正确
- 数据库是否启动完成
- 密码是否一致
4. Nginx 反代失败
确认 proxy_pass 的目标服务名是否与 Compose 中的 service 名一致。
5. 文件权限问题
挂载本地目录时,可能会出现权限不足。可以检查宿主机目录权限,或使用合适的用户启动容器。
十六、Docker 一键部署的最佳实践
1. 使用数据卷保存数据
数据库、日志、上传文件等重要数据不要只放在容器内部。
2. 镜像尽量轻量
优先选择 alpine、slim 等轻量基础镜像。
3. 固定镜像版本
不要随便使用 latest,建议指定明确版本,避免版本漂移。
4. 使用健康检查
可以通过 healthcheck 判断服务是否真正可用。
5. 分离配置和代码
把环境变量、密钥、配置文件独立管理,便于维护和安全控制。
6. 日志集中管理
生产环境建议统一收集容器日志,便于排查问题。
十七、一个更实用的一键部署脚本
如果你想进一步简化操作,可以编写一个部署脚本,比如 deploy.sh:
#!/bin/bash
echo "开始部署..."
docker compose down
docker compose pull
docker compose up -d --build
echo "部署完成!"
docker compose ps
使用方法:
chmod +x deploy.sh
./deploy.sh
这样就把多条命令封装成了一个脚本,真正接近“一键部署”。
十八、如何让部署更自动化
如果你希望更专业,可以将 Docker 部署与以下工具结合:
1. GitHub Actions
代码提交后自动构建镜像并推送到仓库。
2. GitLab CI/CD
适合企业内部持续集成与持续交付。
3. Jenkins
经典的自动化构建部署工具。
4. 阿里云镜像仓库 / Docker Hub
统一管理镜像版本,便于拉取和回滚。
5. Ansible
适合批量管理多台服务器,实现自动化分发与部署。
十九、生产环境部署建议
如果你要把 Docker 用在正式生产环境,建议注意以下几点:
- 使用独立服务器或云主机
- 关闭不必要的端口
- 定期备份数据库和数据卷
- 设置防火墙和安全组
- 使用 HTTPS
- 限制容器资源,如 CPU、内存
- 及时更新镜像与安全补丁
- 监控容器状态和服务可用性
二十、总结
Docker 的价值,不只是“把应用跑起来”,更重要的是让部署变得标准化、自动化、可复制。对于个人开发者来说,Docker 可以减少环境配置的麻烦;对于团队来说,Docker 可以提高协作效率;对于企业来说,Docker 可以提升交付速度和系统稳定性。
如果你希望实现真正的一键部署,建议你掌握以下三件事:
- 学会编写
Dockerfile - 学会使用
docker-compose.yml - 学会用脚本或 CI/CD 自动执行部署流程
只要掌握这些内容,你就可以把复杂的部署过程简化成一条命令,甚至一个按钮。
附:一键部署最小模板
最后附上一套最简化的一键部署思路:
1. Dockerfile
FROM nginx:alpine
COPY ./dist /usr/share/nginx/html
2. docker-compose.yml
version: "3.9"
services:
web:
build: .
ports:
- "8080:80"
restart: always
3. 部署命令
docker compose up -d --build
这就是最基础的一键部署模型。虽然简单,但思路是通用的,你可以在此基础上扩展数据库、缓存、消息队列、反向代理等更多服务。
如果你愿意,我还可以继续为你补充一篇:
- Docker 部署 Spring Boot 项目教程
- Docker 部署 Vue + Nginx 项目教程
- Docker Compose 一键部署 MySQL + Redis + Nginx 实战
- Linux 服务器 Docker 环境从零搭建教程
你只要回复标题,我可以直接继续写。