Docker实战部署教程:从零打包 Flask 项目,附完整源码可直接上线
Docker Docker部署教程|附源码
在现代软件开发中,Docker 已经成为非常常见的部署工具。
它最大的价值在于:把应用和运行环境打包成一个标准镜像,无论你是在本地、测试服务器还是生产环境,只要 Docker 运行正常,应用就能以一致的方式启动。
本文将从零开始,带你完成一次完整的 Docker 部署实践,并附上一个可直接运行的示例源码。你可以把它理解为一篇“Docker 入门 + 实战部署教程”。
一、为什么要用 Docker
在没有 Docker 之前,我们部署项目经常会遇到这些问题:
- 本地能跑,服务器不能跑
- Java 版本不一致、Python 版本不一致
- 依赖包冲突
- 环境变量配置混乱
- 迁移服务器时重新安装环境很麻烦
而 Docker 的思路很简单:
应用 + 依赖 + 运行环境 = 镜像
镜像运行起来 = 容器
这样做的好处是:
- 环境一致:开发、测试、生产尽量保持一致
- 部署快速:一条命令即可启动
- 隔离性强:不同项目互不干扰
- 易迁移:镜像可以直接打包、分发、部署
- 便于扩展:配合 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 clonescp- 直接上传压缩包
例如:
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-slimalpineopenjdk: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,后续部署会轻松很多。
如果你愿意,我还可以继续帮你补充以下内容之一:
- Spring Boot 版 Docker 部署教程
- Node.js + Nginx 部署教程
- Docker Compose + MySQL + Redis 完整实战
- 将本文整理成适合公众号/博客发布的排版版本
如果你需要,我可以直接给你写下一篇。