Docker 从安装到一键上线:新手也能照着跑通的部署指南
Docker 部署完整教程|一键部署
在现代软件开发与运维体系中,Docker 已经成为最常用的应用部署方案之一。无论是个人项目、企业服务、微服务架构,还是测试环境、生产环境,Docker 都可以帮助我们快速构建、交付和运行应用。
相比传统部署方式,Docker 最大的优势在于:环境一致、部署简单、迁移方便、资源占用低、扩展能力强。只要你将应用打包成镜像,就可以在任何安装了 Docker 的服务器上运行,避免“在我电脑上能跑”的尴尬问题。
本文将以一篇完整教程的形式,带你从 Docker 基础概念开始,逐步完成 Docker 安装、镜像使用、容器运行、Dockerfile 编写、Docker Compose 编排,以及常见项目的一键部署方式。即使你是新手,也可以跟着本文完成一个完整的 Docker 部署流程。
一、Docker 是什么?
Docker 是一个开源的容器化平台,它可以将应用程序及其依赖环境打包到一个独立的“容器”中运行。
你可以把 Docker 理解为一种轻量级虚拟化技术。传统虚拟机需要模拟完整的操作系统,而 Docker 容器共享宿主机内核,因此启动速度更快,占用资源更少。
1. Docker 的核心概念
在学习 Docker 部署之前,先了解几个重要概念。
1)镜像 Image
镜像可以理解为应用运行环境的模板。
例如:
nginx镜像包含 Nginx Web 服务运行环境mysql镜像包含 MySQL 数据库运行环境redis镜像包含 Redis 缓存服务运行环境- 自定义镜像可以包含你的 Java、Node.js、Python、Go 等应用
镜像是只读的,不能直接修改。
2)容器 Container
容器是镜像运行后的实例。
如果镜像是“类”,那么容器就是“对象”。一个镜像可以启动多个容器,每个容器之间相互隔离。
3)仓库 Registry
仓库用于存储和分发 Docker 镜像。
常见仓库包括:
- Docker Hub
- 阿里云容器镜像服务
- 腾讯云容器镜像服务
- Harbor 私有镜像仓库
4)Dockerfile
Dockerfile 是用于构建镜像的脚本文件。
它定义了应用镜像的构建步骤,例如使用什么基础镜像、复制哪些文件、安装哪些依赖、暴露哪些端口、启动命令是什么。
5)Docker Compose
Docker Compose 是 Docker 官方提供的多容器编排工具。
如果你的项目依赖多个服务,比如:
- Web 应用
- MySQL
- Redis
- Nginx
使用 Docker Compose 可以通过一个 docker-compose.yml 文件统一管理这些容器,实现一键启动、一键停止、一键重启。
二、为什么推荐使用 Docker 部署?
传统部署方式通常需要手动安装运行环境,例如:
- 安装 JDK
- 安装 Node.js
- 安装 Python
- 安装 MySQL
- 配置 Nginx
- 设置环境变量
- 处理依赖冲突
这些步骤不仅繁琐,而且容易因为系统版本、依赖版本不同导致部署失败。
Docker 部署则可以将这些环境全部封装到镜像中,实现统一交付。
Docker 部署的优势
1)环境一致
开发环境、测试环境、生产环境使用同一个镜像,极大减少环境差异。
2)部署快速
传统部署可能需要几十分钟甚至几个小时,而 Docker 容器通常几秒钟即可启动。
3)回滚简单
如果新版本出现问题,只需要停止当前容器,重新运行旧版本镜像即可。
4)扩容方便
同一个镜像可以快速启动多个容器实例,适合负载均衡和微服务场景。
5)易于迁移
只要服务器安装 Docker,就可以运行同一个镜像,不依赖具体系统环境。
三、Docker 安装教程
下面以 Linux 服务器为例进行说明。生产环境中最常见的系统是 Ubuntu、Debian、CentOS、Rocky Linux、AlmaLinux 等。
四、在 Ubuntu / Debian 上安装 Docker
1. 更新软件源
sudo apt update
2. 安装必要依赖
sudo apt install -y ca-certificates curl gnupg lsb-release
3. 添加 Docker 官方 GPG 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
如果你使用的是 Debian,需要将上面的 ubuntu 替换为 debian。
4. 添加 Docker 软件源
Ubuntu 示例:
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-buildx-plugin docker-compose-plugin
6. 启动 Docker
sudo systemctl start docker
sudo systemctl enable docker
7. 验证安装
docker version
如果能看到 Client 和 Server 信息,说明安装成功。
也可以运行官方测试镜像:
sudo docker run hello-world
五、在 CentOS / Rocky Linux 上安装 Docker
1. 卸载旧版本
sudo yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2. 安装依赖
sudo yum install -y yum-utils
3. 添加 Docker 官方源
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
4. 安装 Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
5. 启动并设置开机自启
sudo systemctl start docker
sudo systemctl enable docker
6. 查看 Docker 状态
sudo systemctl status docker
六、配置 Docker 镜像加速
在国内服务器上拉取 Docker Hub 镜像可能较慢,可以配置镜像加速器。
编辑配置文件:
sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json
写入以下内容:
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://hub.rat.dev",
"https://docker.m.daocloud.io"
]
}
保存后重启 Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
查看是否生效:
docker info
如果在输出信息中看到 Registry Mirrors,说明配置成功。
注意:镜像加速地址可能会变化,实际使用时建议优先使用云厂商提供的专属加速地址,例如阿里云、腾讯云、华为云等。
七、Docker 常用命令
掌握以下命令,基本就能完成日常部署工作。
1. 查看 Docker 版本
docker version
2. 查看 Docker 系统信息
docker info
3. 搜索镜像
docker search nginx
4. 拉取镜像
docker pull nginx
5. 查看本地镜像
docker images
6. 删除镜像
docker rmi nginx
如果镜像正在被容器使用,需要先删除容器。
7. 运行容器
docker run -d --name my-nginx -p 80:80 nginx
参数说明:
-d:后台运行--name my-nginx:容器名称-p 80:80:端口映射,宿主机 80 端口映射到容器 80 端口nginx:使用的镜像名称
8. 查看运行中的容器
docker ps
9. 查看所有容器
docker ps -a
10. 停止容器
docker stop my-nginx
11. 启动容器
docker start my-nginx
12. 重启容器
docker restart my-nginx
13. 删除容器
docker rm my-nginx
强制删除运行中的容器:
docker rm -f my-nginx
14. 查看容器日志
docker logs my-nginx
实时查看日志:
docker logs -f my-nginx
15. 进入容器
docker exec -it my-nginx /bin/bash
如果容器没有 bash,可以使用 sh:
docker exec -it my-nginx /bin/sh
八、使用 Docker 部署 Nginx
Nginx 是最常见的 Web 服务器之一,我们先用它演示 Docker 部署流程。
1. 拉取 Nginx 镜像
docker pull nginx
2. 启动 Nginx 容器
docker run -d \
--name nginx-demo \
-p 80:80 \
nginx
3. 访问测试
在浏览器访问:
http://服务器IP
如果看到 Nginx 欢迎页面,说明部署成功。
4. 挂载自定义网页目录
创建本地目录:
mkdir -p /data/nginx/html
创建测试页面:
echo "Hello Docker Nginx
" > /data/nginx/html/index.html
启动容器:
docker run -d \
--name nginx-web \
-p 80:80 \
-v /data/nginx/html:/usr/share/nginx/html \
nginx
参数说明:
-v /data/nginx/html:/usr/share/nginx/html表示目录挂载- 宿主机目录内容会映射到容器内 Nginx 默认网页目录
九、使用 Docker 部署 MySQL
数据库容器化非常常见,但生产环境中一定要注意数据持久化。
1. 拉取 MySQL 镜像
docker pull mysql:8.0
2. 创建数据目录
mkdir -p /data/mysql/data
mkdir -p /data/mysql/conf
mkdir -p /data/mysql/logs
3. 启动 MySQL 容器
docker run -d \
--name mysql8 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/mysql/data:/var/lib/mysql \
-v /data/mysql/conf:/etc/mysql/conf.d \
-v /data/mysql/logs:/var/log/mysql \
--restart=always \
mysql:8.0
参数说明:
-e MYSQL_ROOT_PASSWORD=123456:设置 root 密码-v /data/mysql/data:/var/lib/mysql:持久化数据库数据--restart=always:容器异常退出或服务器重启后自动启动
4. 进入 MySQL 容器
docker exec -it mysql8 mysql -uroot -p
输入密码后即可进入 MySQL。
十、使用 Docker 部署 Redis
Redis 通常用于缓存、消息队列、分布式锁等场景。
1. 拉取 Redis 镜像
docker pull redis:7
2. 创建目录
mkdir -p /data/redis/data
mkdir -p /data/redis/conf
3. 创建 Redis 配置文件
vim /data/redis/conf/redis.conf
写入以下内容:
appendonly yes
requirepass 123456
bind 0.0.0.0
protected-mode no
4. 启动 Redis 容器
docker run -d \
--name redis7 \
-p 6379:6379 \
-v /data/redis/data:/data \
-v /data/redis/conf/redis.conf:/usr/local/etc/redis/redis.conf \
--restart=always \
redis:7 redis-server /usr/local/etc/redis/redis.conf
5. 连接 Redis
docker exec -it redis7 redis-cli
认证:
auth 123456
十一、Dockerfile 编写教程
当我们需要部署自己的项目时,通常需要编写 Dockerfile 构建自定义镜像。
下面分别以常见项目为例。
十二、部署 Spring Boot 项目
假设你的 Spring Boot 项目已经打包生成:
app.jar
1. 编写 Dockerfile
在 app.jar 同级目录下创建 Dockerfile:
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY app.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
2. 构建镜像
docker build -t springboot-demo:1.0 .
3. 运行容器
docker run -d \
--name springboot-demo \
-p 8080:8080 \
--restart=always \
springboot-demo:1.0
4. 查看日志
docker logs -f springboot-demo
十三、部署 Node.js 项目
假设你的 Node.js 项目目录如下:
node-demo/
├── package.json
├── package-lock.json
├── app.js
└── Dockerfile
1. 编写 Dockerfile
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --registry=https://registry.npmmirror.com
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
2. 构建镜像
docker build -t node-demo:1.0 .
3. 启动容器
docker run -d \
--name node-demo \
-p 3000:3000 \
--restart=always \
node-demo:1.0
十四、部署 Vue / React 前端项目
前端项目通常需要先构建静态文件,再通过 Nginx 提供访问。
下面以 Vue 或 React 项目为例。
1. 编写 Dockerfile
FROM node:20-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm install --registry=https://registry.npmmirror.com
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
如果是 React 项目,构建目录可能是 build,则改为:
COPY --from=build /app/build /usr/share/nginx/html
2. 构建镜像
docker build -t frontend-demo:1.0 .
3. 启动容器
docker run -d \
--name frontend-demo \
-p 80:80 \
--restart=always \
frontend-demo:1.0
十五、Docker Compose 一键部署
当项目中包含多个服务时,推荐使用 Docker Compose。例如一个常见的后端项目可能需要:
- Spring Boot 应用
- MySQL 数据库
- Redis 缓存
- Nginx 反向代理
如果使用 docker run,命令会比较多,也不好维护。使用 Docker Compose 可以将所有配置写在一个文件中,然后通过一条命令启动全部服务。
十六、一键部署示例:Spring Boot + MySQL + Redis
假设项目目录如下:
deploy-demo/
├── app.jar
├── Dockerfile
└── docker-compose.yml
1. Dockerfile
FROM openjdk:17-jdk-slim
WORKDIR /app
COPY app.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
2. docker-compose.yml
services:
app:
build: .
container_name: springboot-app
ports:
- "8080:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/demo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
SPRING_DATASOURCE_USERNAME: root
SPRING_DATASOURCE_PASSWORD: 123456
SPRING_REDIS_HOST: redis
SPRING_REDIS_PORT: 6379
SPRING_REDIS_PASSWORD: 123456
depends_on:
- mysql
- redis
restart: always
mysql:
image: mysql:8.0
container_name: mysql8
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: demo
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/logs:/var/log/mysql
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
restart: always
redis:
image: redis:7
container_name: redis7
ports:
- "6379:6379"
command: redis-server --appendonly yes --requirepass 123456
volumes:
- ./redis/data:/data
restart: always
3. 一键启动
在 docker-compose.yml 所在目录执行:
docker compose up -d
如果你的系统安装的是旧版本 Compose,也可能使用:
docker-compose up -d
4. 查看服务状态
docker compose ps
5. 查看日志
查看全部服务日志:
docker compose logs -f
查看指定服务日志:
docker compose logs -f app
6. 停止服务
docker compose down
7. 重新构建并启动
如果修改了代码或 Dockerfile,可以执行:
docker compose up -d --build
十七、编写一键部署脚本
为了进一步简化部署流程,可以编写一个 deploy.sh 脚本,实现自动拉取代码、构建镜像、启动容器。
1. deploy.sh 示例
#!/bin/bash
echo "=============================="
echo "开始 Docker 一键部署"
echo "=============================="
PROJECT_DIR="/data/deploy-demo"
cd $PROJECT_DIR || exit
echo "1. 拉取最新代码"
git pull
echo "2. 停止旧服务"
docker compose down
echo "3. 构建并启动新服务"
docker compose up -d --build
echo "4. 清理无用镜像"
docker image prune -f
echo "=============================="
echo "部署完成"
echo "=============================="
docker compose ps
2. 授权脚本
chmod +x deploy.sh
3. 执行部署
./deploy.sh
这样就可以实现真正意义上的一键部署。
十八、生产环境部署建议
Docker 部署虽然简单,但生产环境仍然需要注意安全性、稳定性和可维护性。
1. 不要使用弱密码
示例中的 123456 只适合测试环境。生产环境中应使用复杂密码,并尽量通过环境变量或密钥管理系统配置。
2. 数据必须持久化
数据库、Redis、上传文件等重要数据必须挂载到宿主机目录或使用独立存储卷。
3. 不要随意暴露端口
例如 MySQL 的 3306、Redis 的 6379 不建议直接暴露到公网。可以只允许内网访问,或者通过安全组限制来源 IP。
4. 配置自动重启
关键服务建议添加:
restart: always
这样服务器重启后容器会自动恢复。
5. 定期备份数据
尤其是 MySQL、PostgreSQL、MongoDB 等数据库容器,必须建立定期备份机制。
MySQL 备份示例:
docker exec mysql8 mysqldump -uroot -p123456 demo > demo_backup.sql
6. 控制日志大小
长期运行的容器日志可能占用大量磁盘空间,可以配置 Docker 日志限制。
编辑:
sudo vim /etc/docker/daemon.json
加入:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
重启 Docker:
sudo systemctl restart docker
7. 使用固定镜像版本
生产环境不建议直接使用 latest 标签,因为它可能随着时间变化,导致部署结果不可控。
推荐使用:
mysql:8.0
redis:7
nginx:1.25
十九、Docker 常见问题排查
1. 端口被占用
错误类似:
Bind for 0.0.0.0:80 failed: port is already allocated
查看端口占用:
sudo lsof -i:80
或:
sudo netstat -tunlp | grep 80
解决方式:
- 停止占用端口的程序
- 修改 Docker 端口映射
例如:
-p 8080:80
表示宿主机 8080 端口映射到容器 80 端口。
2. 容器启动后立即退出
查看日志:
docker logs 容器名
常见原因:
- 启动命令错误
- 配置文件错误
- 环境变量缺失
- 应用程序报错
- 依赖服务未启动
3. 镜像拉取失败
可能原因:
- 网络问题
- Docker Hub 访问受限
- 镜像名称错误
- 镜像加速器不可用
解决方式:
docker pull nginx:alpine
或者更换镜像源。
4. 容器无法访问宿主机服务
在 Linux 中,可以尝试使用宿主机网关 IP,或在 Compose 中添加:
extra_hosts:
- "host.docker.internal:host-gateway"
然后容器内访问:
host.docker.internal
5. 数据丢失
如果容器删除后数据也没了,通常是因为没有挂载数据卷。
正确方式:
-v /data/mysql/data:/var/lib/mysql
这样数据存储在宿主机目录中,即使容器删除,数据仍然存在。
二十、Docker 部署最佳实践
1. 一个容器只运行一个主进程
例如 MySQL 单独一个容器,Redis 单独一个容器,应用单独一个容器。这样更容易管理和扩展。
2. 使用 Docker Compose 管理多服务
对于中小型项目,Docker Compose 足够强大,配置清晰,维护简单。
3. 镜像构建尽量小
可以使用 Alpine 版本基础镜像,例如:
FROM nginx:alpine
FROM node:20-alpine
镜像越小,传输越快,安全风险也相对更低。
4. 使用 .dockerignore
构建镜像时,不需要把所有文件都复制进去。可以创建 .dockerignore 文件:
.git
node_modules
target
logs
*.md
这样可以减少镜像构建上下文,提高构建速度。
5. 配置健康检查
生产环境建议为关键服务配置健康检查。
示例:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/actuator/health"]
interval: 30s
timeout: 10s
retries: 3
6. 配合 CI/CD 使用
Docker 非常适合与 Jenkins、GitLab CI、GitHub Actions 等工具结合,实现自动构建、自动测试、自动部署。
典型流程:
提交代码
↓
自动构建镜像
↓
推送镜像仓库
↓
服务器拉取镜像
↓
Docker Compose 更新服务
二十一、完整一键部署流程总结
一个成熟的 Docker 一键部署流程通常如下:
- 准备服务器
- 安装 Docker 和 Docker Compose
- 配置镜像加速
- 准备项目代码
- 编写 Dockerfile
- 编写 docker-compose.yml
- 配置数据卷和环境变量
- 执行
docker compose up -d --build - 查看容器状态和日志
- 配置防火墙、安全组和域名解析
- 配置 Nginx 反向代理和 HTTPS
- 编写部署脚本实现一键发布
- 定期备份数据和清理无用资源
如果只是部署一个简单应用,核心命令其实只有一条:
docker compose up -d --build
这也是 Docker 部署最迷人的地方:复杂的环境准备工作被封装在镜像和配置文件中,最终运维只需要执行一条命令即可完成部署。
结语
Docker 极大降低了应用部署的复杂度。对于开发者来说,它可以保证开发、测试、生产环境一致;对于运维人员来说,它可以提升部署效率、降低维护成本;对于企业团队来说,它可以配合 CI/CD、微服务和云原生架构,实现更标准化的软件交付流程。
如果你是初学者,建议先从 Nginx、MySQL、Redis 这些基础服务开始练习,熟悉镜像、容器、端口映射、数据卷等概念。随后再尝试为自己的 Java、Node.js、Python 或前端项目编写 Dockerfile,并使用 Docker Compose 进行统一编排。
当你能够熟练使用 Dockerfile + docker-compose.yml + deploy.sh 这套组合后,就已经具备了搭建中小型项目自动化部署方案的能力。
最后再记住一句话:
Docker 部署的核心思想不是“把命令写得更复杂”,而是“把环境封装起来,让部署变得可重复、可迁移、可自动化”。
只要掌握这套思路,你就可以在不同服务器、不同项目、不同环境中快速完成稳定可靠的一键部署。