在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号端口
在这里插入图片描述

结束

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频压缩大小怎么压缩?几种简单视频压缩方法教给你

现如今&#xff0c;视频已成为我们生活和工作中不可或缺的一部分。然而&#xff0c;高清视频往往伴随着庞大的文件体积&#xff0c;这给存储和传输带来了不小的挑战。这时候我们就需要对视频进行压缩处理&#xff0c;方便储存和发送&#xff0c;那么怎么有效压缩视频呢&#xf…

java之回合制游戏以及如何优化

public class Role {private String name;private int blood;//空参public Role() {}//包含全部参数的构造public Role(String name, int blood) {this.name name;this.blood blood;}public String getName() {return name;}public void setName(String name) {this.name na…

提交高通量测序原始数据到 SRA --- 操作流程

❝ 写在前面 由于最近在提交课题数据到 NCBI 数据库&#xff0c;整理了相关笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. 提交高通量测序数据到 GEO --- 说明书 目录 1 注册 NCBI 账…

【C++】关联容器探秘:Map与Multimap详解

目录 1.映射类 map 0. 引入 pair&#xff1a; 1.定义 2.插入 3. 遍历 4.❗operator[]的实现 5. 插入 运用 2.Multimap 类 0. 引入&#xff1a;不去重的 Multi 1. Multimap 不支持 Operator[] 2. Multimap 的删除 1.映射类 map 0. 引入 pair&#xff1a; 在C中&…

1 go语言环境的搭建

本专栏将从基础开始&#xff0c;循序渐进&#xff0c;由浅入深讲解Go语言&#xff0c;希望大家都能够从中有所收获&#xff0c;也请大家多多支持。 查看相关资料与知识库 专栏地址:Go专栏 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;大家一起学习&#xff0c;…

软件测试---测试需求分析

课程目标 什么是软件测试需求 软件测试需求的必要性 如何对软件测试需求进行分析&#xff08;重点&#xff09; 课程补充 灰度测试&#xff08;基于功能&#xff09;&#xff1a;先发布部分功能&#xff0c;然后看用户的反馈&#xff0c;再去发布另外一部分的功能更新。 A/B测…

运筹学笔记

计算的时间问题&#xff01;计算机解决了计算量的问题&#xff01; 计算机的发展对运筹学研究起到了极大的促进作用。 运筹学的一个特征之一是它常常会考虑寻求问题模型的最佳解决方案&#xff08;称为最优解&#xff09;。 没有人能成为运筹学所有方面的专家。 分析学越来越流…

C++学习笔记04-补充知识点(问题-解答自查版)

前言 以下问题以Q&A形式记录&#xff0c;基本上都是笔者在初学一轮后&#xff0c;掌握不牢或者频繁忘记的点 Q&A的形式有助于学习过程中时刻关注自己的输入与输出关系&#xff0c;也适合做查漏补缺和复盘。 本文对读者可以用作自查&#xff0c;答案在后面&#xff0…

国内微短剧系统平台抖音微信付费小程序app开发源代码交付

微短剧作为当下热门的内容&#xff0c;结合抖音平台的广泛用户基础&#xff0c;开发微短剧付费小程序APP具有显著的市场潜力&#xff0c;用户对于短剧内容的需求旺盛&#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;绕…

Pytest进阶之fixture的使用(超详细)

目录 Fixture定义 Fixture使用方式 作为参数使用 Fixture间相互调用(作为参数调用) 作为conftest.py文件传入 Fixture作用范围Scope function class module session Fixture中params和ids Fixture中autouse Fixture中Name 总结 pytest fixture 是一种用来管理测试…

回溯算法(相关解题):

求子集序列&#xff1a; 解题思路&#xff1a; 已知原集合的数据位数为N&#xff0c;则可以通过二进制比对原来集合&#xff0c;二进制位为1则输出集合上的该位数据&#xff0c;为0则空&#xff0c;二进制的01排序规律与子集的输出一致由集合的位数可以判断出二进制的范围 0 ~…

P3-AI产品经理-九五小庞

AI产品的数据流向 美团外卖&#xff0c;实时只能调度 美团28分钟送达需求的分析 AI产品常用的算法 常用算法 常见的AI算法解析 自然语言生成NLG语音识别&#xff1a;科大讯飞&#xff0c;通义千问 虚拟现实机器学习平台 决策管理系统生物特征识别技术 RPA(机器人流程自动…

UE4-光照重建

当我们拉入新的光源和模型到我们的场景中后&#xff0c;会产生这样的情况&#xff1a; Preview:预览 表示此时由于光照物体所产生的阴影都是预览级别的并不是真正的效果。 方法一&#xff1a; 或者也可以在世界大纲中选中我们的光源&#xff0c;然后将我们的光源改变为可以…

判断字符串,数组方法

判断字符串方法 在JavaScript中&#xff0c;可以使用typeof操作符来判断一个变量是否为字符串。 function isString(value) {return typeof value string; } 判断数组 在JavaScript中&#xff0c;typeof操作符并不足以准确判断一个变量是否为数组&#xff0c;因为typeof会…

《昇思25天学习打卡营第25天|第27天》

今天是学习的第二十七天&#xff0c;今天学习的是应用实践篇中计算机视觉中ShuffleNet图像分类。 从对ShuffleNet网络介绍开始学习&#xff0c;模型架构&#xff08;Pointwise Group Convolution&#xff0c;Channel Shuffle&#xff0c;ShuffleNet模块&#xff0c;构建Shuffl…

# Redis 入门到精通(九)-- 主从复制(1)

Redis 入门到精通&#xff08;九&#xff09;-- 主从复制&#xff08;1&#xff09; 一、redis 主从复制 – 主从复制简介 1、互联网“三高”架构 高并发高性能高可用 2、你的“Redis”是否高可用&#xff1f; 1&#xff09;单机 redis 的风险与问题 问题1.机器故障  现…

C++ 鼠标轨迹API【神诺科技SDK】

一.鼠标轨迹模拟简介 传统的鼠标轨迹模拟依赖于简单的数学模型&#xff0c;如直线或曲线路径。然而&#xff0c;这种方法难以捕捉到人类操作的复杂性和多样性。AI大模型的出现&#xff0c;使得神诺科技 能够通过深度学习技术&#xff0c;学习并模拟更自然的鼠标移动行为。 二.…

java之对称字符串以及如何优化(链式编程)

import java.util.Scanner;public class ScannerDemo12 {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入一个字符串");String str sc.next();//链式编程StringBuilder sbnew StringBuilder();sb.append(s…

国内大陆地区huggingface连接不上的解决方案

简介 本文主要介绍国内大陆地区huggingface连接不上的解决方案,希望能对学习大模型的同学们有所帮助。 1. 背景 最近有不少同学反应无法正常下载huggingface的模型文件,亲自尝试使用git clone下载huggingface上的大模型文件时,也同样无法正常下载,以Meta-Llama-3-8B为例…