当前位置: 首页 > news >正文

在windows上使用Docker部署一个简易的web程序

使用Docker部署一个python的web服务🚀

        由于是从事算法相关工作,之前在项目中,需要将写完的代码服务,部署在docker上,以此是开始接触了Docker这个工具,由于之前也没系统学习过,之后应该可能还会用上,所以打算通过一遍博客的方式记录一下也学习一下,这篇博客主要记录一个基础过程,把整个流程简化,重在理解思路,如果有问题或者写的不对的地方,欢迎留言或私信交流。

Docker 是一个开源平台,利用容器技术将应用程序及其所有依赖打包到一个标准化的单元中,从而确保它们能够在任何计算环境中一致地运行。容器是轻量级的、可移植的,并且在不同的操作系统和云环境中运行时具有一致性,使得应用程序的开发、测试和部署过程更加高效和可靠。Docker 使开发人员和运维人员能够更容易地协作,简化了持续集成和持续部署(CI/CD)工作流程。


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-bookwormDebian 12 (Bookworm)基于Debian 12 (Bookworm)
3.10.14-slim-bookwormDebian 12 (Bookworm)基于Debian 12 (Bookworm),精简版
3.10.14-bullseyeDebian 11 (Bullseye)基于Debian 11 (Bullseye)
3.10.14-slim-bullseyeDebian 11 (Bullseye)基于Debian 11 (Bullseye),精简版
3.10.14-alpine3.20Alpine Linux 3.20基于Alpine Linux 3.20
3.10.14-alpine3.19Alpine 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:80http://localhost:80,由于localhost的默认端口是80,所以可以省略端口号的输入,直接访问http://127.0.0.1http://localhost,就可以访问docker容器中运行的web服务了。

在这里插入图片描述
如果想查看docker镜像中运行服务的输出,可以在docker desktop 中的 Containers中点击容器名字。
在这里插入图片描述
        就可以查看到镜像容器控制台的输出,这里虽然服务的的端口号是5000但这是docker内部镜像中的端口号,我们在服务端需要通过80号端口访问,因为我们已经将5000号端口映射到了80号端口
在这里插入图片描述

结束

        这篇算是一个基础笔记性质的博客吧,后续如有用到了一些更多的操作会回来更新,这个暂时就先这样,留一份以后自己要是用到了就回来看看。

相关文章:

在windows上使用Docker部署一个简易的web程序

使用Docker部署一个python的web服务&#x1f680; 由于是从事算法相关工作&#xff0c;之前在项目中&#xff0c;需要将写完的代码服务&#xff0c;部署在docker上&#xff0c;以此是开始接触了Docker这个工具&#xff0c;由于之前也没系统学习过&#xff0c;之后应该可能还会用…...

sqlalchemy使用mysql的json_extract函数查询JSON字段

sqlalchemy使用mysql的json_extract函数查询JSON字段 在SQLAlchemy中,如果你想要在MySQL中存储JSON字段,并且进行查询操作,可以按照以下步骤进行设置和查询: 1. 创建表格 首先,创建一个表格来存储包含JSON字段的数据。假设我们有一个名为 users 的表格,其中有一个名为…...

分类模型-逻辑回归和Fisher线性判别分析★★★★

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

JMeter介绍、安装配置以及快速入门

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

GPT LangChain experimental agent - allow dangerous code

题意&#xff1a;GPT LangChain 实验性代理 - 允许危险代码 问题背景&#xff1a; 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是一个图像标注工具&#xff0c;主要用于帮助研究人员和开发者创建有标签的数据集&#xff0c;这…...

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&#xff0c;绕过tac&#xff0c;cat&#xff0c;绕…...

vulntarget-a靶机-复现报告

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

为什么 FPGA 的效率低于 ASIC?

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

使用水星Mecury人形机器人搭建VR遥操作控制平台!

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

【学习笔记】无人机系统(UAS)的连接、识别和跟踪(三)-架构模型和概念

引言 3GPP TS 23.256 技术规范&#xff0c;主要定义了3GPP系统对无人机&#xff08;UAV&#xff09;的连接性、身份识别、跟踪及A2X&#xff08;Aircraft-to-Everything&#xff09;服务的支持。 3GPP TS 23.256 技术规范&#xff1a; 【免费】3GPPTS23.256技术报告-无人机系…...

uniapp bug解决:uniapp文件查找失败:‘uview-ui‘ at main.js:14

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

Python 爬虫(爬取百度翻译的数据)

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

【LeetCode:2766. 重新放置石块 + 哈希表】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…...

[C++]类的自动转换和强制类型转换

在C中&#xff0c;类的自动转换&#xff08;也称为隐式转换&#xff09;和强制类型转换&#xff08;显式转换&#xff09;是面向对象编程中处理类型之间转换的两种重要机制。这些转换允许程序员定义如何在不同类型&#xff08;特别是自定义类型&#xff09;之间安全地交换数据。…...

根据鼠标所在位置获取组件拿到 “qt_scrollarea_viewport” 组件的问题

问题起因&#xff1a; 有时候需要鼠标实时所在位置的组件&#xff0c;可以通过如下方法实时获取: QWidget *current_widget QApplication::widgetAt(QCursor().pos()); qDebug() << __FUNCTION__ << current_widget;// 如果是按钮&#xff0c;直接进行转换 QPus…...

深入浅出WebRTC—LossBasedBweV2

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

就业难?誉天Linux云计算架构师涨薪班,不涨薪退学费

2024年&#xff0c;我国高校毕业生人数约为1179 万人&#xff0c;再创历史新高。根据智联招聘今年发布的《大学生就业力调研报告》&#xff0c;可以看到&#xff1a;应届生慢就业、自由职业的比重分别从去年的18.9%、13.2%增长到今年的19.1%、13.7%。 这里我们可以看出&#xf…...

从零开始!Jupyter Notebook的安装教程

目录 一、准备工作二、安装Jupyter Notebook方法一&#xff1a;使用pip安装方法二&#xff1a;使用Anaconda安装 三、配置和使用四、常见问题及解决办法如何解决Jupyter Notebook安装过程中遇到的依赖项无法同步的问题&#xff1f;Jupyter Notebook的配置文件在哪里&#xff0c…...

FastAPI(七十)实战开发《在线课程学习系统》接口开发--留言功能开发

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 在之前的文章&#xff1a;FastAPI&#xff08;六十九)实战开发《在线课程学习系统》接口开发--修改密码&#xff0c;这次分享留言功能开发 我们梳理…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...