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

Docker 从安装到一键上线:新手也能照着跑通的部署指南

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

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 一键部署流程通常如下:

  1. 准备服务器
  2. 安装 Docker 和 Docker Compose
  3. 配置镜像加速
  4. 准备项目代码
  5. 编写 Dockerfile
  6. 编写 docker-compose.yml
  7. 配置数据卷和环境变量
  8. 执行 docker compose up -d --build
  9. 查看容器状态和日志
  10. 配置防火墙、安全组和域名解析
  11. 配置 Nginx 反向代理和 HTTPS
  12. 编写部署脚本实现一键发布
  13. 定期备份数据和清理无用资源

如果只是部署一个简单应用,核心命令其实只有一条:

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 部署的核心思想不是“把命令写得更复杂”,而是“把环境封装起来,让部署变得可重复、可迁移、可自动化”。

只要掌握这套思路,你就可以在不同服务器、不同项目、不同环境中快速完成稳定可靠的一键部署。

目录结构
全文