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

Docker实战部署教程:从零打包 Flask 项目,附完整源码可直接上线

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

Docker Docker部署教程|附源码

在现代软件开发中,Docker 已经成为非常常见的部署工具。
它最大的价值在于:把应用和运行环境打包成一个标准镜像,无论你是在本地、测试服务器还是生产环境,只要 Docker 运行正常,应用就能以一致的方式启动。

本文将从零开始,带你完成一次完整的 Docker 部署实践,并附上一个可直接运行的示例源码。你可以把它理解为一篇“Docker 入门 + 实战部署教程”。


一、为什么要用 Docker

在没有 Docker 之前,我们部署项目经常会遇到这些问题:

  • 本地能跑,服务器不能跑
  • Java 版本不一致、Python 版本不一致
  • 依赖包冲突
  • 环境变量配置混乱
  • 迁移服务器时重新安装环境很麻烦

而 Docker 的思路很简单:

应用 + 依赖 + 运行环境 = 镜像
镜像运行起来 = 容器

这样做的好处是:

  1. 环境一致:开发、测试、生产尽量保持一致
  2. 部署快速:一条命令即可启动
  3. 隔离性强:不同项目互不干扰
  4. 易迁移:镜像可以直接打包、分发、部署
  5. 便于扩展:配合 Docker Compose、K8s 可轻松做多服务编排

二、Docker 的核心概念

在正式部署之前,先弄清几个基本概念:

1. 镜像(Image)

镜像是一个只读模板,包含了运行应用所需的所有内容,比如系统环境、依赖、代码等。

2. 容器(Container)

容器是镜像运行后的实例。一个镜像可以启动多个容器。

3. Dockerfile

Dockerfile 是用来构建镜像的脚本,里面定义了镜像构建步骤。

4. Docker Compose

Docker Compose 用于管理多个容器,适合 Web 项目 + 数据库 + 缓存等场景。


三、环境准备

本文示例使用一个简单的 Python Flask Web 项目,演示如何打包并部署到 Docker。

需要准备的环境:

  • Docker
  • Docker Compose(可选,但强烈推荐)
  • 一台 Linux 服务器或本地电脑

你可以先检查 Docker 是否安装成功:

docker -v
docker compose version

如果输出版本号,说明安装成功。


四、项目结构

下面是本文示例项目结构:

docker-demo/
├── app.py
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
└── .dockerignore

五、源码示例

1)app.py

这是一个最简单的 Flask Web 服务,访问后会返回一段文本。

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello Docker! Flask application is running."

@app.route("/health")
def health():
    return {"status": "ok"}

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

2)requirements.txt

这里写明项目依赖。

Flask==3.0.3

3)Dockerfile

这是最关键的文件,用于构建镜像。

# 使用轻量级 Python 镜像
FROM python:3.11-slim

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装依赖
RUN pip install --no-cache-dir -r requirements.txt

# 复制项目代码
COPY . .

# 暴露端口
EXPOSE 5000

# 启动命令
CMD ["python", "app.py"]

4).dockerignore

这个文件用于排除不需要打包进镜像的内容,减少镜像体积。

__pycache__
*.pyc
*.pyo
*.pyd
.git
.gitignore
venv
.env

5)docker-compose.yml

如果你希望以后扩展数据库、Redis 等服务,建议直接使用 Compose。

version: "3.9"

services:
  web:
    build: .
    container_name: flask_docker_demo
    ports:
      - "5000:5000"
    restart: always

六、构建镜像

进入项目目录后,执行下面命令构建镜像:

docker build -t flask-docker-demo .

参数说明:

  • docker build:构建镜像
  • -t flask-docker-demo:给镜像命名
  • .:当前目录作为构建上下文

如果一切正常,你会看到镜像构建成功。


七、启动容器

方式一:使用 docker run

docker run -d \
  --name flask-demo \
  -p 5000:5000 \
  flask-docker-demo

参数说明:

  • -d:后台运行
  • --name:容器名称
  • -p 5000:5000:端口映射,宿主机 5000 端口映射到容器 5000 端口

访问:

http://localhost:5000

你会看到:

Hello Docker! Flask application is running.

访问健康检查接口:

http://localhost:5000/health

返回:

{"status":"ok"}

方式二:使用 Docker Compose

如果使用 Compose,执行:

docker compose up -d

查看运行状态:

docker compose ps

查看日志:

docker compose logs -f

停止并删除容器:

docker compose down

八、部署到 Linux 服务器

下面讲一下常见的服务器部署流程。

1)上传项目代码

可以通过以下方式上传:

  • git clone
  • scp
  • 直接上传压缩包

例如:

git clone https://github.com/yourname/docker-demo.git
cd docker-demo

2)构建镜像

docker build -t flask-docker-demo .

如果服务器性能较差,构建时间可能稍长。


3)启动服务

docker run -d \
  --name flask-demo \
  -p 80:5000 \
  --restart unless-stopped \
  flask-docker-demo

这里将容器的 5000 端口映射到服务器 80 端口,这样用户就可以直接通过域名或 IP 访问。

例如:

http://你的服务器IP

4)查看运行情况

docker ps

如果想查看日志:

docker logs -f flask-demo

九、常用 Docker 命令

下面整理一些最常用的命令,部署时非常实用。

查看镜像

docker images

查看容器

docker ps -a

停止容器

docker stop flask-demo

启动容器

docker start flask-demo

删除容器

docker rm -f flask-demo

删除镜像

docker rmi flask-docker-demo

进入容器

docker exec -it flask-demo /bin/sh

十、Docker 部署时的注意事项

1)容器内服务必须监听 0.0.0.0

很多新手会把服务写成 127.0.0.1,这样容器外无法访问。

错误示例:

app.run(host="127.0.0.1", port=5000)

正确写法:

app.run(host="0.0.0.0", port=5000)

2)要注意端口映射

容器内端口和宿主机端口不是一回事,必须正确映射。

例如:

-p 8080:5000

表示宿主机使用 8080 端口访问容器 5000 端口。


3)尽量使用轻量镜像

例如:

  • python:3.11-slim
  • alpine
  • openjdk:17-jdk-slim

镜像越小,构建越快,安全性通常也更好。


4)合理使用 .dockerignore

如果不排除无关文件,镜像会变大,构建也会变慢。


5)生产环境建议加重启策略

比如:

--restart unless-stopped

这样服务器重启后,容器会自动拉起。


十一、如何更新部署版本

当你修改了代码后,通常需要重新构建并部署。

更新步骤:

docker build -t flask-docker-demo .
docker stop flask-demo
docker rm flask-demo
docker run -d --name flask-demo -p 80:5000 --restart unless-stopped flask-docker-demo

如果使用 Docker Compose:

docker compose up -d --build

这样会自动重新构建并启动新版本。


十二、扩展:加入数据库服务

很多实际项目不仅仅是一个 Web 服务,还会配数据库。
例如 Flask + MySQL / Redis / PostgreSQL。

Docker Compose 的优势就在这里体现出来了。你可以很方便地扩展多个服务,例如:

version: "3.9"

services:
  web:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - redis

  redis:
    image: redis:7
    ports:
      - "6379:6379"

这样就能快速搭建一套完整环境。


十三、完整项目源码汇总

app.py

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello Docker! Flask application is running."

@app.route("/health")
def health():
    return {"status": "ok"}

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=5000)

requirements.txt

Flask==3.0.3

Dockerfile

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 5000

CMD ["python", "app.py"]

.dockerignore

__pycache__
*.pyc
*.pyo
*.pyd
.git
.gitignore
venv
.env

docker-compose.yml

version: "3.9"

services:
  web:
    build: .
    container_name: flask_docker_demo
    ports:
      - "5000:5000"
    restart: always

十四、总结

Docker 的核心不是“把项目装进容器”这么简单,而是帮助我们建立一套标准化、可复制、可迁移的部署方式。
对于个人项目、公司服务、微服务架构来说,Docker 都是非常值得掌握的技能。

本文通过一个最简单的 Flask 示例,演示了:

  • Docker 的基本概念
  • 项目如何编写 Dockerfile
  • 如何构建镜像
  • 如何启动容器
  • 如何使用 Docker Compose
  • 如何部署到 Linux 服务器

如果你是 Docker 新手,建议先把本文的示例完整跑通,再逐步扩展到自己的 Java、Node.js、Spring Boot、Go 项目中。只要掌握了 Dockerfile 和 Compose,后续部署会轻松很多。


如果你愿意,我还可以继续帮你补充以下内容之一:

  1. Spring Boot 版 Docker 部署教程
  2. Node.js + Nginx 部署教程
  3. Docker Compose + MySQL + Redis 完整实战
  4. 将本文整理成适合公众号/博客发布的排版版本

如果你需要,我可以直接给你写下一篇。

目录结构
全文