【Python系列】Python 项目 Docker 部署指南

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
img

  • 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老
  • 导航
    • 檀越剑指大厂系列:全面总结 java 核心技术,jvm,并发编程 redis,kafka,Spring,微服务等
    • 常用开发工具系列:常用的开发工具,IDEA,Mac,Alfred,Git,typora 等
    • 数据库系列:详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 新空间代码工作室:提供各种软件服务,承接各种毕业设计,毕业论文等
    • 懒人运维系列:总结好用的命令,解放双手不香吗?能用一个命令完成绝不用两个操作
    • 数据结构与算法系列:总结数据结构和算法,不同类型针对性训练,提升编程思维,剑指大厂

非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

博客目录

    • 一.基础介绍
      • 1. Docker 简介
      • 2. 环境准备
      • 3. 创建 Dockerfile
      • 4. 构建 Docker 镜像
      • 5. 运行 Docker 容器
      • 6. 访问应用
      • 7. 数据持久化
      • 8. 容器管理
      • 9. Docker Compose
    • 二.实现步骤
      • 1.Dockerfile
      • 2.base_run.sh
      • 3.启动脚本
    • 三.总结

随着容器化技术的兴起,Docker 成为了一种流行的应用部署方式。它通过将应用及其依赖环境打包在一起,解决了"在我机器上可以运行"的问题,使得应用能够在任何支持 Docker 的环境中无缝运行。本文将详细介绍如何将 Python 项目部署到 Docker 容器中。
在这里插入图片描述

一.基础介绍

1. Docker 简介

Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及应用的运行环境到一个可移植的容器中。Docker 使用 Linux 容器(LXC)技术,但提供了比传统容器更加易用的工作流和用户界面。

2. 环境准备

在开始之前,请确保你的开发机器上已经安装了 Docker。你可以访问 Docker 官网下载并安装适合你操作系统的 Docker 版本。

3. 创建 Dockerfile

Dockerfile 是一个文本文件,包含了一系列的指令,用于自动化构建 Docker 镜像。以下是一个基本的 Python 项目的 Dockerfile 示例:

# 使用官方 Python 运行时作为父镜像
FROM python:3.8-slim

# 设置工作目录
WORKDIR /app

# 将当前目录内容复制到工作目录
COPY . /app

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

# 暴露端口
EXPOSE 8000

# 运行应用
CMD ["python", "app.py"]

4. 构建 Docker 镜像

在 Dockerfile 所在的目录下打开终端,运行以下命令来构建 Docker 镜像:

docker build -t my-python-app .

这里 -t 参数用于给镜像指定一个标签,. 表示 Dockerfile 在当前目录。

5. 运行 Docker 容器

使用以下命令从镜像启动一个容器:

docker run -d -p 8000:8000 my-python-app

-d 参数表示后台运行容器,-p 参数用于端口映射,将容器的 8000 端口映射到宿主机的 8000 端口。

6. 访问应用

如果一切顺利,你现在可以通过浏览器访问 http://localhost:8000 来查看运行在 Docker 容器中的 Python 应用。

7. 数据持久化

在某些情况下,你可能需要持久化应用数据。Docker 提供了数据卷(volumes)来实现这一点。你可以使用以下命令来运行容器并挂载数据卷:

docker run -d -p 8000:8000 -v my-data:/app/data my-python-app

这里 -v 参数用于创建一个数据卷并将其挂载到容器内的 /app/data 目录。

8. 容器管理

Docker 提供了一系列命令来管理容器,例如:

  • docker ps:列出正在运行的容器。
  • docker stop <container_id>:停止指定的容器。
  • docker start <container_id>:启动已停止的容器。
  • docker logs <container_id>:查看容器的日志。

9. Docker Compose

对于复杂的应用,你可能需要同时运行多个容器。Docker Compose 允许你通过一个 YAML 文件来定义多个容器的配置,然后使用一个命令来启动或停止它们。创建一个 docker-compose.yml 文件:

version: "3"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  redis:
    image: "redis:alpine"

使用以下命令启动所有服务:

docker-compose up -d

二.实现步骤

1.Dockerfile

FROM python:3.11.5-slim

WORKDIR /kg-qa/

COPY .env .env
COPY ./base ./base
COPY ./manager ./manager
COPY ./config/config.yaml ./config/config.yaml
COPY ./config/logger.ini ./config/
COPY ./base_run.sh ./ServerApp.py ./__init__.py ./
COPY ./requirements.txt ./requirements.txt

# 安装 Python 依赖
RUN pip install --upgrade pip
RUN pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

# 将应用代码复制到工作目录
COPY . /kg-qa/

ENTRYPOINT ["sh", "./base_run.sh"]

2.base_run.sh

#!/bin/sh

uvicorn ServerApp:app --host 0.0.0.0 --port 8080 --loop asyncio

3.启动脚本

#!/bin/sh

# 定义镜像名称和标签
IMAGE_NAME="kg-qa:latest"
CONTAINER_NAME="kg-qa"

# 切换到项目目录
cd /data/kg/kg-qa

# 切换到开发分支并拉取最新代码
echo "Checking out to development branch and pulling latest changes..."
git checkout dev
git pull

# 构建Docker镜像
echo "Building Docker image..."
docker build -t $IMAGE_NAME .

# 检查容器是否正在运行
if docker ps -a | grep -q $CONTAINER_NAME; then
    echo "Stopping and removing existing container..."
    docker stop $CONTAINER_NAME
    docker rm $CONTAINER_NAME
fi

# 启动Docker容器
echo "Starting container..."
docker run -d \
    --name $CONTAINER_NAME \
    -p 8080:8080 \
    --restart=always \
    --privileged=true \
    -e TZ=Asia/Shanghai \
    -v /etc/localtime:/etc/localtime:ro \
    -v /data/kg/config/env.properties:/kg-qa/.env \
    -v /data/kg/config:/kg-qa/config \
    $IMAGE_NAME

echo "Container started successfully!"

# 打印容器日志
echo "Container logs:"
docker logs -f $CONTAINER_NAME

在这里插入图片描述

三.总结

Docker 为 Python 项目提供了一种快速、一致且可移植的部署方式。通过本文的介绍,你应该已经了解了如何将 Python 项目部署到 Docker 容器中。ocker 的世界非常广阔,本文只是冰山一角,还有许多高级特性去探索和学习。

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/759026.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

常微分方程算法之编程示例五(阿当姆斯法)

目录 一、研究问题 二、C++代码 三、计算结果 一、研究问题 本节我们采用阿当姆斯法(Adams法)求解算例。 阿当姆斯法的原理及推导请参考: 常微分方程算法之阿当姆斯法(Adams法)_四步四阶adams显格式;三步四阶adams隐格式;四阶adams预估-校正格式-CSDN博客https://blog…

Installed Build Tools revision xxx is corrupted. Remove and install again 解决

1.在buildTools文件下找到对应的sdk版本&#xff0c;首先将版本对应目录下的d8.bat改名为dx.bat。 2.在lib文件下将d8.jar改名为dx.jar。 3.重新编译工程即可

Django-开发一个列表页面

需求 基于ListView,创建一个列表视图,用于展示"BookInfo"表的信息要求提供分页提供对书名,作者,描述的查询功能 示例展示: 1. 数据模型 models.py class BookInfo(models.Model):titlemodels.CharField(verbose_name"书名",max_length100)authormode…

vscode中快捷生成自定义vue3模板

需求描述 新建 vue 文件后&#xff0c;需要先写出 vue3 的基础架构代码&#xff0c;手动输入效率低下&#xff01; 期待&#xff1a;输入 v3 按 Tab 即刻生成自定义的vue3模板&#xff08;如下图&#xff09; 实现流程 vscode 的设置中&#xff0c;选择 用户代码片段 输入 vue…

基于STM32的温湿度检测TFT屏幕proteus恒温控制仿真系统

一、引言 本文介绍了一个基于STM32的恒温控制箱检测系统&#xff0c;该系统通过DHT11温湿度传感器采集环境中的温湿度数据&#xff0c;并利用TFT LCD屏幕进行实时显示。通过按键切换页面显示&#xff0c;通过按键切换实现恒温控制箱的恒温控制。为了验证系统的可靠性和稳定性&…

密室逃脱——收集版

一、原版修改 1、导入资源 Unity Learn | 3D Beginner: Complete Project | URP 2、设置Scene 删除SampleScene&#xff0c;打开UnityTechnologies-3DBeginnerComplete下的MainScene 3、降低音量 (1) 打开Hierarchy面板上的Audio降低音量 (2) 打开Prefabs文件夹&#xf…

使用 PyQt5 创建一个数字时钟

使用 PyQt5 创建一个数字时钟 效果代码解析定义时钟类初始化界面显示时间 完整代码 在这篇博客中&#xff0c;我们将使用 PyQt5 创建一个简单的数字时钟。 效果 代码解析 定义时钟类 class ClockWindow(QMainWindow):def __init__(self):super().__init__()self.setWindowTit…

Swift宏的实现

上篇介绍了Swift宏的定义与生声明&#xff0c;本篇主要看看是Swift宏的具体实现。结合Swift中Codable协议&#xff0c;封装一个工具让类或者结构体自动实现Codable协议&#xff0c;并且添加一些协议中没有的功能。 关于Codable协议 Codable很好&#xff0c;但是有一些缺陷&…

Redis基础教程(三):redis命令

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

仓库管理系统11--物资设置

1、添加用户控件 <UserControl x:Class"West.StoreMgr.View.GoodsTypeView"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc"http://schemas.openxm…

sqlserver开启CDC

1、背景 由于需要学习flink cdc&#xff0c;并且数据选择sqlserver&#xff0c;所以这里记录sqlserver的cdc开启操作步骤。 2、基础前提 官方介绍地址&#xff1a;https://learn.microsoft.com/zh-cn/sql/relational-databases/track-changes/enable-and-disable-change-dat…

Ubuntu22.04 源码安装 PCL13+VTK-9.3+Qt6,踩坑记录

Ubuntu 22.04LTS;cmake-3.25.0;VTK-9.3;PCL-1.13;Qt6.6 PCL可以通过 apt 命令直接安装(sudo apt install libpcl-dev),apt 命令安装的 VTK 是简略版,没有对 Qt 支持的包,所以笔者使用源码安装 PCL 和 VTK。 1. 安装 VTK 1) 安装 ccmake 和 VTK 依赖项: sudo apt-g…

DataWhale-吃瓜教程学习笔记 (五)

学习视频&#xff1a;第4章-决策树_哔哩哔哩_bilibili 西瓜书对应章节&#xff1a; 第四章 4.1&#xff1b;4.2 文章目录 决策树算法原理- 逻辑角度- 几何角度 ID3 决策树- 自信息- 信息熵 &#xff08;自信息的期望&#xff09;- 条件熵 &#xff08; Y 的信息熵关于概率分布 …

从万里长城防御体系看软件安全体系建设@安全历史03

长城&#xff0c;是中华民族的一张重要名片&#xff0c;是中华民族坚韧不屈、自强不息的精神象征&#xff0c;被联合国教科文组织列入世界文化遗产名录。那么在古代&#xff0c;长城是如何以其复杂的防御体系&#xff0c;一次次抵御外族入侵&#xff0c;而这些防御体系又能给软…

HarmonyOS Next开发学习手册——创建轮播 (Swiper)

Swiper 组件提供滑动轮播显示的能力。Swiper本身是一个容器组件&#xff0c;当设置了多个子组件后&#xff0c;可以对这些子组件进行轮播显示。通常&#xff0c;在一些应用首页显示推荐的内容时&#xff0c;需要用到轮播显示的能力。 针对复杂页面场景&#xff0c;可以使用 Sw…

C++ sizeof的各种

C sizeof的各种 1. 含有虚函数的类对象的空间大小2. 虚拟继承的类对象的空间大小3. 普通变量所占空间大小4. 复合数据类型&#xff08;结构体和类&#xff09;5. 数组6. 类型别名7. 动态分配内存8. 指针9. 静态变量10. 联合体11. 结构体使用#program pack 1. 含有虚函数的类对象…

firewalld防火墙转发流量到其他端口forward port rules

假设云主机eth0: 47.93.27.106 tun0: inet 10.8.0.1 netmask 255.255.255.0 Show rules for a specific zone (public) sudo firewall-cmd --zonepublic --list-all Add the tun0 interface to the public zone: sudo firewall-cmd --zonepublic --add-interfacetun0 --…

关于图片大小问题造成的QPixmap或QImage读取图片失败的解决办法

今天碰到一个奇怪又离谱的问题 : 图片加载失败。明明路径是正确的&#xff0c;图片也实实在在存在。。。 经过比对&#xff0c;发现如下问题&#xff1a; 我就齐了怪了 这大小怎么差这么多&#xff1f;会不会是这里除了问题。秉持着怀疑的态度&#xff0c;我试着用GIMP重新导出…

机械设计简单介绍

机械设计简单介绍 1 介绍1.1 概述1.2 机械机构设计基本步骤1.3 关键1.3.1 静力学1.3.2 动力学1.3.3 运动学1.3.4 刚度学 1.4 示例【机械臂】 2 资料2.1 知识体系2.2 博客类汇总2.3 免费CAD模型获取2.4 3D打印2.5 SolidWorks 3 具备能力3.1 熟练翻阅 机械设计手册3.2 知道 N 家常…

【01-02】Mybatis的配置文件与基于XML的使用

1、引入日志 在这里我们引入SLF4J的日志门面&#xff0c;使用logback的具体日志实现&#xff1b;引入相关依赖&#xff1a; <!--日志的依赖--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version&g…