在windows上使用Docker部署一个简易的web程序
使用Docker部署一个python的web服务🚀
由于是从事算法相关工作,之前在项目中,需要将写完的代码服务,部署在docker上,以此是开始接触了Docker这个工具,由于之前也没系统学习过,之后应该可能还会用上,所以打算通过一遍博客的方式记录一下也学习一下,这篇博客主要记录一个基础过程,把整个流程简化,重在理解思路,如果有问题或者写的不对的地方,欢迎留言或私信交流。
Docker 是一个开源平台,利用容器技术将应用程序及其所有依赖打包到一个标准化的单元中,从而确保它们能够在任何计算环境中一致地运行。容器是轻量级的、可移植的,并且在不同的操作系统和云环境中运行时具有一致性,使得应用程序的开发、测试和部署过程更加高效和可靠。Docker 使开发人员和运维人员能够更容易地协作,简化了持续集成和持续部署(CI/CD)工作流程。
文章目录
- 使用Docker部署一个python的web服务🚀
- 1.Docker 安装
- 2.编写一个简单的web服务
- 2.1 本地python环境配置安装
- 2.1 使用Flask编写一个 hello_world 服务
- 3.编写一个doceker file
- 3.1 使用FROM 命令导入一个基础镜像
- 3.2 创建一个工作目录
- 3.3拷贝项目根目录下的所有文件到工作目录
- 3.4在镜像中安装Flask
- 3.5运行服务程序app.py
- 3.6完整的Dockerfile文件
- 4. 在命令控制台搭建Docker镜像
- 4.1 使用Docker build 搭建docker镜像源
- 4.2 使用Docker RUN 运行容器
- 4.3 使用浏览器访问Docker镜像中运行的服务
- 结束
1.Docker 安装
首先到官网点击Download进行下载,由于我自己的电脑是windows所以这里下载了一个windows版本
https://www.docker.com/
下载完成之后,正常安装就一直点就行,打开应用,首先会出现启动引擎的加载动画,然后进入到如下界面。
然后打开电脑的powershell输入docker --version
查看一下docker版本,检查一下通过powershell能不能使用docker命令,这也是检查docker安装成功的关键一步,如果打印出版本信息了,表示安装成功了。
docker --version
2.编写一个简单的web服务
安装好了docker之后可以先简单写一个python的服务程序,在写一个新的python项目之前先在anaconda中建一个虚拟环境。
2.1 本地python环境配置安装
新建环境命令,我这里起的名字是doceker_web(这个命令最后安装的python的具体版本为3.10.14)
conda create --name docker_web python=3.10
运行上述命令之后,输入y开始下载虚拟环境的各种文件。
输入激活虚拟环境的命令进入虚拟环境
conda activate docker_web
然后安装一个Flask框架,这里我由于我配置了全局清华镜像源,所以是从镜像源里下载的。
pip install Flask
之后新建一个项目然后选一下解释器,0基础的同学,可以找一下周围会做的让你帮着改一下,或者自己搜一下。
2.1 使用Flask编写一个 hello_world 服务
之后这里直接写一个最简单的服务代码,如果零基础的同学可移步在下之前的文章。
Flask框架初探-如何在本机发布一个web服务并通过requests访问自己发布的服务-简易入门版
from flask import Flaskapp = Flask(__name__)@app.route("/")
def hello_world():return "Hello, World!"if __name__ == "__main__":app.run(host="0.0.0.0", debug=False)
运行之后使用电脑浏览器访问这个IP地址,可以看到浏览器上显示了一个Hello World。
3.编写一个doceker file
首先右键新建一个file文件,然后命名为Dockerfile
然后就会得到一个空白的Dockerfile文件并自动打开,其实在新建的时候,也有Dockerfile文件的选项,但是新建出来的不是空的,自带的几行代码也没啥必要,索性直接建一个空的了。
3.1 使用FROM 命令导入一个基础镜像
我们需要首先导入一个python的基础镜像,首先需要取看一下有哪些基础镜像,首先需要点右上角的九个小正方形组成的图标,然后点击DockerHub。
进入到以下网站,然后在搜索框中输入python
搜索之后点击python
点击之后下滑可以看到python包含的docker镜像的版本。
每个镜像文件由不同的python版本和一些使用操作系统的信息的后缀,这里我们以3.10.14版本为例(由于我们新建的anaconda的虚拟环境中的python版本是3.10.14)
不同的镜像使用了不同的操作系统,这里通常情况下我们选择3.10.14-slim
镜像标签 | 基础操作系统 | 描述 |
---|---|---|
3.10.14-bookworm | Debian 12 (Bookworm) | 基于Debian 12 (Bookworm) |
3.10.14-slim-bookworm | Debian 12 (Bookworm) | 基于Debian 12 (Bookworm),精简版 |
3.10.14-bullseye | Debian 11 (Bullseye) | 基于Debian 11 (Bullseye) |
3.10.14-slim-bullseye | Debian 11 (Bullseye) | 基于Debian 11 (Bullseye),精简版 |
3.10.14-alpine3.20 | Alpine Linux 3.20 | 基于Alpine Linux 3.20 |
3.10.14-alpine3.19 | Alpine Linux 3.19 | 基于Alpine Linux 3.19 |
3.10.14-slim | 多种操作系统的精简版 | 精简版,减少了不必要的文件和组件 |
FROM python:3.10.14-slim
3.2 创建一个工作目录
创作工作目录的作用是,方便归拢文件,嗯,我是这吗理解的,相当于在docker的模拟镜像系统下,新建了一个文件夹,然后之后会把项目文件通过后续的COPY命令给移动过去,之后还可以在生成文件夹的目录下执行命令,类似于windows有时候需要cd到指定路径的文件夹下,然后再执行命令,这样避免每一条命令都要带着绝对路径。
WORKDIR /app
3.3拷贝项目根目录下的所有文件到工作目录
该命令,可以将项目文件夹下是所有文件移动到,之前使用WORKDIR目录中新建的/app目录下,第一个点表示当前项目的根目录下的文件,第二个点表示目标路径,也就是Docker镜像中的/app目录,再解释一句就是执行了WORKDIR /app之后,第二个点就被指定为/app目录(理解成文件夹也行)了
COPY . .
3.4在镜像中安装Flask
移动完文件,然后就可以给镜像安装需要的库了由于我们只用到了flask,,这里我们为了精简内容,所以就先只安装Flask。
# 安装Flask
RUN pip install Flask
3.5运行服务程序app.py
最后再加一句运行命令就可以了,这是个固定的格式,等效于我们在控制台中直接执行 python3 app.py 命令。
CMD ["python3", "app.py"]
3.6完整的Dockerfile文件
# 使用基础镜像
FROM python:3.10.14-slim# 设置工作目录
WORKDIR /app# 拷贝当前项目文件到工作目录文件夹 COPY<本地路径><目标路径>
COPY . .# 安装Flask
RUN pip install Flask# 运行应用
CMD ["python3", "app.py"]
4. 在命令控制台搭建Docker镜像
4.1 使用Docker build 搭建docker镜像源
点击pycharm右下侧的小图标进入到终端(也可以在外部cmd终端cd进入到项目文件夹下)。
之后在控制台输入下面的命令,创建一个名为docker_web的的镜像(最后的点很重要不能省略)。
docker build -t docker_web .
- docker build:构建 Docker 镜像的命令。
- -t docker_web:为构建的镜像指定一个标签(docker_web)。
- .:指定构建上下文,即当前目录。Docker 会使用该目录中的 Dockerfile 和所有相关文件来构建镜像(从当前目录下搜索Dockerfile)。
运行之后结果如下,该命令完成了加载python镜像源,拷贝项目文件,和安装Flask的任务。
4.2 使用Docker RUN 运行容器
docker run -p 80:5000 -d docker_web
- docker run:运行一个新的容器。
- -p 80:5000:将主机的80端口映射到容器的5000端口。这意味着你可以通过访问主机的80端口来访问容器中运行的服务(假设服务在容器的5000端口上运行)。
- -d:以守护进程模式(后台)运行容器。
- docker_web:要运行的镜像名称。
这里的5000端口是Flask默认的端口,如果需要修改需要在app.py中设置指定的端口号
if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
4.3 使用浏览器访问Docker镜像中运行的服务
之后再浏览器中访问http://127.0.0.1:80
或http://localhost:80
,由于localhost的默认端口是80,所以可以省略端口号的输入,直接访问http://127.0.0.1
或http://localhost
,就可以访问docker容器中运行的web服务了。
如果想查看docker镜像中运行服务的输出,可以在docker desktop 中的 Containers中点击容器名字。
就可以查看到镜像容器控制台的输出,这里虽然服务的的端口号是5000但这是docker内部镜像中的端口号,我们在服务端需要通过80号端口访问,因为我们已经将5000号端口映射到了80号端口。
结束
这篇算是一个基础笔记性质的博客吧,后续如有用到了一些更多的操作会回来更新,这个暂时就先这样,留一份以后自己要是用到了就回来看看。
相关文章:

在windows上使用Docker部署一个简易的web程序
使用Docker部署一个python的web服务🚀 由于是从事算法相关工作,之前在项目中,需要将写完的代码服务,部署在docker上,以此是开始接触了Docker这个工具,由于之前也没系统学习过,之后应该可能还会用…...
sqlalchemy使用mysql的json_extract函数查询JSON字段
sqlalchemy使用mysql的json_extract函数查询JSON字段 在SQLAlchemy中,如果你想要在MySQL中存储JSON字段,并且进行查询操作,可以按照以下步骤进行设置和查询: 1. 创建表格 首先,创建一个表格来存储包含JSON字段的数据。假设我们有一个名为 users 的表格,其中有一个名为…...

分类模型-逻辑回归和Fisher线性判别分析★★★★
该博客为个人学习清风建模的学习笔记,部分课程可以在B站:【强烈推荐】清风:数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili 目录 1理论 1.1逻辑回归模型 1.2线性概率模型 1.3线性判别分析 1.4两点分布…...

JMeter介绍、安装配置以及快速入门
文章目录 1. JMeter简介2. JMeter安装配置3. JMeter快速入门 1. JMeter简介 Apache JMeter是一款开源的压力测试工具,主要用于测试静态和动态资源(如静态文件、服务器、数据库、FTP服务器等)的性能。它最初是为测试Web应用而设计的ÿ…...

GPT LangChain experimental agent - allow dangerous code
题意:GPT LangChain 实验性代理 - 允许危险代码 问题背景: Im creating a chatbot in VS Code where it will receive csv file through a prompt on Streamlit interface. However from the moment that file is loaded, it is showing a message with…...

1 LableMe安装下载
git:GitHub - labelmeai/labelme: Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation). 1 LabelMe介绍 LabelMe是一个图像标注工具,主要用于帮助研究人员和开发者创建有标签的数据集,这…...

rce漏洞-ctfshow(50-70)
Web51 if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\|\%|\x09|\x26/i", $c)){ system($c." >/dev/null 2>&1"); } Nl,绕过tac,cat,绕…...

vulntarget-a靶机-复现报告
靶机复现过程 测试标题 测试过程 测试外网ip 192.168.2.84 测试详情 第一步,我们先对其这个外网ip进行扫描,结果如下 结果我们发现这个ip开启了80和445端口,同时我们还可以看到这里是win7系统,我们先看看web页面是怎样的 结…...

为什么 FPGA 的效率低于 ASIC?
FPGA是“可重构逻辑”器件。先制造的芯片,再次设计时“重新配置”。 ASIC 不需要“重新配置”。你先设计,把它交给代工厂,然后制造芯片。 现在让我们看看这些芯片的结构是什么样的,以及它们的不同之处。 ● 逻辑单元:F…...

使用水星Mecury人形机器人搭建VR遥操作控制平台!
VR遥操作机械臂是一种将虚拟现实技术与机械臂控制相结合的系统,使用户可以通过虚拟现实设备操控和交互实际的机械臂。这种技术可以应用于多个领域,包括远程操作、培训、危险环境中的工作等。 双臂人形机器人是一种模拟人体上半身结构,包括头部…...

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(三)-架构模型和概念
引言 3GPP TS 23.256 技术规范,主要定义了3GPP系统对无人机(UAV)的连接性、身份识别、跟踪及A2X(Aircraft-to-Everything)服务的支持。 3GPP TS 23.256 技术规范: 【免费】3GPPTS23.256技术报告-无人机系…...

uniapp bug解决:uniapp文件查找失败:‘uview-ui‘ at main.js:14
文章目录 报错内容解决方法main.js 文件中 uView 主 JS 库引入 uView 的全局 SCSS 主题文件内容修改引入 uView 基础样式内容修改配置 easycom 内容修改 报错内容 10:50:51.795 文件查找失败:uview-ui at main.js:14 10:59:39.570 正在差量编译... 10:59:43.213 文…...

Python 爬虫(爬取百度翻译的数据)
前言 要保证爬虫的合法性,可以从以下几个方面着手: 遵守网站的使用条款和服务协议:在爬取数据之前,仔细阅读目标网站的相关规定。许多网站会在其 robots.txt 文件中明确说明哪些部分可以爬取,哪些不可以。 例如&…...

【LeetCode:2766. 重新放置石块 + 哈希表】
🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…...
[C++]类的自动转换和强制类型转换
在C中,类的自动转换(也称为隐式转换)和强制类型转换(显式转换)是面向对象编程中处理类型之间转换的两种重要机制。这些转换允许程序员定义如何在不同类型(特别是自定义类型)之间安全地交换数据。…...
根据鼠标所在位置获取组件拿到 “qt_scrollarea_viewport” 组件的问题
问题起因: 有时候需要鼠标实时所在位置的组件,可以通过如下方法实时获取: QWidget *current_widget QApplication::widgetAt(QCursor().pos()); qDebug() << __FUNCTION__ << current_widget;// 如果是按钮,直接进行转换 QPus…...

深入浅出WebRTC—LossBasedBweV2
WebRTC 同时使用基于丢包的带宽估计算法和基于延迟的带宽估计算法那,能够实现更加全面和准确的带宽评估和控制。基于丢包的带宽估计算法主要依据网络中的丢包情况来动态调整带宽估计,以适应网络状况的变化。本文主要讲解最新 LossBasedBweV2 的实现。 1…...

就业难?誉天Linux云计算架构师涨薪班,不涨薪退学费
2024年,我国高校毕业生人数约为1179 万人,再创历史新高。根据智联招聘今年发布的《大学生就业力调研报告》,可以看到:应届生慢就业、自由职业的比重分别从去年的18.9%、13.2%增长到今年的19.1%、13.7%。 这里我们可以看出…...
从零开始!Jupyter Notebook的安装教程
目录 一、准备工作二、安装Jupyter Notebook方法一:使用pip安装方法二:使用Anaconda安装 三、配置和使用四、常见问题及解决办法如何解决Jupyter Notebook安装过程中遇到的依赖项无法同步的问题?Jupyter Notebook的配置文件在哪里,…...

FastAPI(七十)实战开发《在线课程学习系统》接口开发--留言功能开发
源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 在之前的文章:FastAPI(六十九)实战开发《在线课程学习系统》接口开发--修改密码,这次分享留言功能开发 我们梳理…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用
一、方案背景 在现代生产与生活场景中,如工厂高危作业区、医院手术室、公共场景等,人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式,存在效率低、覆盖面不足、判断主观性强等问题,难以满足对人员打手机行为精…...

毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...