Docker 部署项目到云服务器完整步骤

你需要一套从本地准备到云服务器落地的完整流程,以下步骤涵盖环境准备、项目打包、镜像构建 / 传输、容器运行全链路,适配绝大多数 Web 项目(Java、Python、Node.js 等)。
一、前置准备:国内国外云服务器与本地环境
1. 云服务器环境配置
首先确保云服务器满足基础要求:
-
操作系统:推荐 CentOS 7/8 或 Ubuntu 18.04+(主流云厂商均提供)
-
安装 Docker 环境(核心依赖): bash
运行
# 以 CentOS 为例 # 1. 卸载旧版本(如有) yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 2. 安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3. 添加 Docker 软件源 yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 4. 安装 Docker CE yum install -y docker-ce docker-ce-cli containerd.io # 5. 启动 Docker 并设置开机自启 systemctl start docker systemctl enable docker # 6. 验证安装成功 docker --versionbash
运行
# 以 Ubuntu 为例 apt update && apt install -y docker.io systemctl start docker systemctl enable docker docker --version -
开放项目所需端口(如 80、8080、3306 等):
- 云服务器控制台配置安全组(关键!):在阿里云 / 腾讯云 / 华为云控制台找到「安全组」,添加入方向规则,开放对应端口(例如 8080 端口,授权对象 0.0.0.0/0)
- 服务器本地防火墙开放端口(以 CentOS 为例):
bash
运行
firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --reload
2. 本地环境准备
- 安装 Docker(与服务器一致,用于本地构建镜像或测试)
- 项目代码已完成调试,确保本地可正常运行
- 准备好
Dockerfile(核心配置文件,用于构建镜像)
二、核心步骤:项目打包与 Docker 镜像构建
1. 项目打包(按项目类型区分)
先将项目打包为可执行文件 / 部署包,示例如下:
-
Java 项目(Spring Boot) :使用 Maven/Gradle 打包为 jar 包
bash
运行
# Maven mvn clean package -Dmaven.test.skip=true # 打包后在 target 目录下生成 xxx.jar 文件 -
Python 项目(Flask/Django) :无需打包(需携带
requirements.txt依赖文件) -
Node.js 项目 :打包为 dist 目录(前端项目)或携带
package.json(后端项目) -
PHP 项目:直接携带完整项目目录(需搭配 Nginx/Apache)
2. 编写 Dockerfile
在项目根目录下创建 Dockerfile(无后缀名),以下是 3 个主流项目的示例模板:
示例 1:Java Spring Boot 项目
dockerfile
# 基础镜像(对应项目的 JDK 版本,如 JDK 8)
FROM openjdk:8-jdk-alpine
# 作者信息(可选)
MAINTAINER yourname <your@email.com>
# 将本地 jar 包复制到容器内(左侧为本地 jar 包路径,右侧为容器内路径)
COPY target/xxx.jar /app.jar
# 暴露项目运行端口(与项目配置的端口一致,如 8080)
EXPOSE 8080
# 容器启动命令(运行 jar 包)
ENTRYPOINT ["java", "-jar", "/app.jar"]
示例 2:Python Flask 项目
dockerfile
# 基础镜像
FROM python:3.9-alpine
# 设置工作目录
WORKDIR /app
# 复制依赖文件
COPY requirements.txt /app/
# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目所有文件
COPY . /app/
# 暴露端口
EXPOSE 5000
# 启动命令
CMD ["python", "app.py"]
示例 3:前端 Vue/React 项目(Nginx 部署)
dockerfile
# 阶段 1:构建项目
FROM node:16-alpine as build
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
COPY . ./
RUN npm run build
# 阶段 2:使用 Nginx 部署
FROM nginx:alpine
# 复制构建后的 dist 目录到 Nginx 静态资源目录
COPY --from=build /app/dist /usr/share/nginx/html
# 复制自定义 Nginx 配置(可选)
# COPY nginx.conf /etc/nginx/conf.d/default.conf
# 暴露 80 端口
EXPOSE 80
# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]
3. 本地构建 Docker 镜像
在项目根目录(Dockerfile 所在目录)执行构建命令:
bash
运行
# 格式:docker build -t 镜像名称:标签 .
# 示例:构建名为 my-project,标签为 v1 的镜像
docker build -t my-project:v1 .
- 命令末尾的
.表示「当前目录」(Dockerfile 所在目录) - 构建完成后,执行
docker images可查看本地镜像列表
三、镜像传输:本地镜像推送到云服务器
有两种常用方式,按需选择:
方式 1:通过 Docker Hub (公共仓库,适合公开项目)
-
本地登录 Docker Hub(需先注册账号) bash
运行
docker login # 输入用户名和密码 -
给镜像打标签(格式:docker tag 本地镜像名:标签 你的 Docker Hub 用户名 / 镜像名:标签) bash
运行
docker tag my-project:v1 your-docker-username/my-project:v1 -
推送镜像到 Docker Hub bash
运行
docker push your-docker-username/my-project:v1 -
云服务器拉取镜像 bash
运行
docker pull your-docker-username/my-project:v1
方式 2:通过镜像导出 / 导入(私有项目推荐,无需仓库)
-
本地将镜像导出为 tar 包 bash
运行
# 格式:docker save -o 导出文件名.tar 镜像名:标签 docker save -o my-project-v1.tar my-project:v1 -
将 tar 包上传到云服务器(使用 scp 命令,Windows 可使用 Xshell/FTP 工具) bash
运行
# 格式:scp 本地tar包路径 服务器用户名@服务器IP:服务器保存路径 scp my-project-v1.tar root@123.45.67.89:/root/ -
云服务器导入镜像 bash
运行
# 格式:docker load -i 服务器上的tar包路径 docker load -i /root/my-project-v1.tar -
导入完成后,执行
docker images验证镜像是否存在
四、最终部署:云服务器启动 Docker 容器
在云服务器上执行容器启动命令,运行项目:
bash
运行
# 核心命令:docker run(后台运行+端口映射+容器命名)
# 格式:docker run -d --name 容器名称 -p 宿主端口:容器端口 镜像名:标签
# 示例:
# -d:后台运行容器
# --name my-app-container:给容器命名为 my-app-container
# -p 8080:8080:将服务器的 8080 端口映射到容器的 8080 端口(宿主端口:容器端口)
# my-project:v1:要运行的镜像名称和标签
docker run -d --name my-app-container -p 8080:8080 my-project:v1
关键参数说明
| 参数 | 作用 |
|---|---|
-d |
后台运行容器(守护进程模式),避免终端关闭后容器停止 |
--name |
给容器指定唯一名称,方便后续管理(如启动 / 停止 / 删除) |
-p |
端口映射(核心!):将云服务器的「宿主端口」映射到容器的「应用端口」,外部可通过「服务器 IP: 宿主端口」访问项目 |
-v |
数据卷挂载(可选,用于持久化数据,如数据库文件、配置文件):docker run -d --name my-app -p 8080:8080 -v /root/data:/app/data my-project:v1表示将服务器的 /root/data 目录挂载到容器的 /app/data 目录 |
验证部署成功
-
查看容器运行状态 bash
运行
# 查看所有运行中的容器 docker ps # 查看所有容器(包括停止的) docker ps -a -
访问项目:在本地浏览器输入
http://云服务器IP:宿主端口(如http://123.45.67.89:8080),能正常访问则部署成功 -
查看容器日志(排查问题用) bash
运行
# 格式:docker logs 容器名称/容器ID docker logs my-app-container # 实时查看日志 docker logs -f my-app-container
常用容器管理命令
bash
运行
# 停止容器
docker stop my-app-container
# 启动已停止的容器
docker start my-app-container
# 重启容器
docker restart my-app-container
# 删除容器(需先停止容器)
docker rm my-app-container
# 删除镜像(需先删除依赖该镜像的容器)
docker rmi my-project:v1
总结
- 核心流程:云服务器安装 Docker + 开放端口 → 本地项目打包 + 编写 Dockerfile + 构建镜像 → 镜像传输到云服务器 → 云服务器启动容器(端口映射)
- 关键文件:
Dockerfile是镜像构建的核心,需根据项目类型编写对应模板 - 关键命令:
docker build(构建镜像)、docker run -d -p(后台运行 + 端口映射)、docker ps(查看容器) - 镜像传输:私有项目优先用「导出 / 导入」,公开项目用 Docker Hub