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

Docker新手:在tencent云上实现Python服务打包到容器

1 使用docker的原因

一致性和可移植性:Docker 容器可以在任何支持 Docker 的环境中运行,无论是开发者的笔记本电脑、测试服务器还是生产环境。这确保了应用在不同环境中的行为一致,减少了“在我的机器上可以运行”的问题。

隔离性:每个 Docker 容器都是独立的,拥有自己的文件系统、网络接口和进程空间。这使得不同应用之间不会互相干扰,提高了系统的稳定性和安全性。

资源效率:Docker 容器共享宿主机的操作系统内核,因此它们比虚拟机更轻量,启动速度更快,占用的资源更少。这使得在相同的硬件资源下可以运行更多的应用实例。

快速部署和扩展:Docker 容器可以快速启动和停止,这使得应用的部署和扩展变得非常容易。通过 Docker Compose 或 Kubernetes 等工具,可以轻松管理多个容器和服务。

2 docker与docker-compose的关系

Docker 用于管理单个容器,而 Docker Compose 用于管理多容器应用。

使用 Docker Compose 需要三个步骤:

  1. 用 Dockerfile 定义应用环境。
  2. docker-compose.yml 文件中定义应用服务。
  3. 运行 docker-compose up 命令来启动和运行应用。

环境准备

ubuntu 22.04 LTS(腾讯云),python 3.10
文件目录结构是这样的

project/
├── app/
│   ├─  __init__.py
│   ├── app.py
│   └── requirements.txt
├── docker-compose.yml
└── Dockerfile

其中app.py的内容如下:

from app import app# 使用内存存储来替代 Redis
cache = {}def get_hit_count():# 检查 'hits' 键是否存在,如果不存在则初始化为 0if 'hits' not in cache:cache['hits'] = 0# 增加计数cache['hits'] += 1return cache['hits']@app.route('/')
def hello():count = get_hit_count()return f'Hello World! I have been seen {count} times.\n'# 只有直接运行此文件时才执行
if __name__ == '__main__':app.run(host='0.0.0.0', port=5000, debug=True)

init.py的代码如下:

from flask import Flaskapp = Flask(__name__)# 导入路由
from app.app import * 

以下是创建一个基本的Python服务Dockerfile的步骤:

  1. 选择基础镜像:通常我们会选择官方提供的Python镜像作为基础。
  2. 设置工作目录:使用WORKDIR指令设置容器内的工作目录。
  3. 复制文件:使用COPY指令将本地文件复制到容器中。
  4. 安装依赖:使用RUN pip install -r requirements.txt安装Python依赖。
  5. 暴露端口:使用EXPOSE指令指定应用运行时需要暴露的端口。
  6. 定义启动命令:使用CMDENTRYPOINT指令定义容器启动时执行的命令。
    其中我的Dockerfile是这样的
# syntax=docker/dockerfile:1
FROM python:3.10-slim
WORKDIR /app
COPY app/requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
ENV FLASK_APP=app
ENV FLASK_ENV=development
EXPOSE 5000
CMD ["flask", "run", "--host=0.0.0.0"]

我的docker-compose.yml是这样的

version: '3.10'
services:web:build: .ports:- "5000:5000"volumes:- .:/appenvironment:- FLASK_APP=app.py- FLASK_ENV=development 

如果Dockerfile和docker-compose不会写,可以找官网上的例子进行仿写。
备注:Dockerfile 是一个文本文件,它没有文件扩展名。它就是名为 “Dockerfile” 的文件(注意 D 是大写的)。这里Dockerfile是约定俗成的,当然也可以改名字,但是需要加参数-f
然后在腾讯云上输入:sudo docker-compose up
然后等待一段时间,会出现
在这里插入图片描述
这时候你的服务就部署成功了,访问http://ip:5000就可以看到web已经成功执行。
在这里插入图片描述
对于有些第一次访问不成功的,可以在安全组里放出5000端口
在这里插入图片描述
然后刷新网页就可以访问了。
一些常用的docker 命令:

  1. 列出所有容器(包括停止的)

    docker ps -a
    
  2. 列出正在运行的容器

    docker ps
    
  3. 启动一个已停止的容器

    docker start my_container
    
  4. 停止一个正在运行的容器

    docker stop my_container
    
  5. 删除一个容器

    docker rm my_container
    
  6. 进入一个正在运行的容器

    docker exec -it my_container /bin/bash
    
  7. 查看容器的日志

    docker logs my_container
    

    镜像操作

  8. 列出所有镜像

    docker images
    
  9. 拉取一个镜像

    docker pull nginx
    
  10. 删除一个镜像

    docker rmi nginx
    
  11. 构建一个镜像

    docker build -t my_image:latest .
    
    • -t my_image:latest:指定镜像名称和标签
    • .:Dockerfile 所在的目录
  12. 查看镜像的历史记录

    docker history my_image:latest
    

网络操作

  1. 列出所有网络

    docker network ls
    
  2. 创建一个新的网络

    docker network create my_network
    
  3. 删除一个网络

    docker network rm my_network
    
  4. 查看网络的详细信息

    docker network inspect my_network
    

    卷操作

  5. 列出所有卷

    docker volume ls
    
  6. 创建一个新的卷

    docker volume create my_volume
    
  7. 删除一个卷

    docker volume rm my_volume
    
  8. 查看卷的详细信息

    docker volume inspect my_volume
    

系统操作

  1. 清理未使用的资源

    docker system prune
    
    • 删除所有未被使用的容器、网络、卷和镜像。
    • 加上 -a--all 选项可以删除所有资源(包括正在使用的):
      docker system prune -a
      
  2. 查看 Docker 信息

    docker info
    
  3. 查看 Docker 版本

    docker version
    

其他常用命令

  1. 查看 Docker 帮助文档

    docker --help
    
  2. 查看某个 Docker 命令的帮助文档

    docker run --help
    

相关文章:

Docker新手:在tencent云上实现Python服务打包到容器

1 使用docker的原因 一致性和可移植性:Docker 容器可以在任何支持 Docker 的环境中运行,无论是开发者的笔记本电脑、测试服务器还是生产环境。这确保了应用在不同环境中的行为一致,减少了“在我的机器上可以运行”的问题。 隔离性&#xff…...

React基础知识学习

学习React前端框架是一个系统而深入的过程,以下是一份详细的学习指南: 一、React基础知识 React简介 React是一个用于构建用户界面的JavaScript库,由Facebook开发和维护。它强调组件化和声明式编程,使得构建复杂的用户界面变得更…...

ES IK分词器插件

前言 ES中默认了许多分词器,但是对中文的支持并不友好,IK分词器是一个专门为中文文本设计的分词工具,它不是ES的内置组件,而是一个需要单独安装和配置的插件。 Ik分词器的下载安装(Winows 版本) 下载地址:…...

二十三种设计模式-抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种方式,用于创建一系列相关或相互依赖的对象,而不需要指定它们具体的类。这种模式主要用于系统需要独立于其产品的创建逻辑时,并且…...

python opencv的orb特征检测(Oriented FAST and Rotated BRIEF)

官方文档:https://docs.opencv.org/4.10.0/d1/d89/tutorial_py_orb.html SIFT/SURF/ORB对比 https://www.bilibili.com/video/BV1Yw411S7hH?spm_id_from333.788.player.switch&vd_source26bb43d70f463acac2b0cce092be2eaa&p80 ORB代码 import numpy a…...

高阶数据结构----布隆过滤器和位图

(一)位图 位图是用来存放某种状态的,因为一个bit上只能存0和1所以一般只有两种状态的情况下适合用位图,所以非常适合判断数据在或者不在,而且位图十分节省空间,很适合于海量数据,且容易存储&…...

VScode使用密钥进行ssh连接服务器方法

如何正常连接ssh的方式可以看我原来那篇文章:Windows上使用VSCode连接远程服务器ssh 1.连接 点击ssh加号,然后关键点在第2步的书写上 2.命令 2的位置写命令: ssh -i "C:\Users\userName\.ssh\id_rsa" usernameIP -p 端口号 端…...

艾体宝产品丨加速开发:Redis 首款 VS Code 扩展上线!

Redis 宣布推出其首款专为 VS Code 设计的 Redis 扩展。这一扩展将 Redis 功能直接整合进您的集成开发环境(IDE),旨在简化您的工作流程,提升工作效率。 我们一直致力于构建强大的开发者生态系统,并在您工作的每一步提…...

应用架构模式

设计模式 设计模式是指根据通用需求来设计解决方案的模板或蓝图,使用设计模式能够更加有效地解决设计过程中的常见问题。设计模式针对不同的问题域有不同的内涵,主要涉及业务、架构、程序设计等问题域,本文主要讨论架构设计模式。 业务设计模…...

注入少量可学习的向量参数: 注入适配器IA3

注入少量可学习的向量参数: 注入适配器IA3 简介:IA3通过学习向量来对激活层加权进行缩放,从而获得更强的性能,同时仅引入相对少量的新参数。它的诞生背景是为了改进LoRA,与LoRA不同的是,IA3直接处理学习向量,而不是学习低秩权重矩阵,这使得可训练参数的数量更少,并且原…...

【C++】B2076 球弹跳高度的计算

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述输入格式输出格式输入输出示例 💯两种代码实现及其对比我的代码实现代码分析优点与不足 老师的代码实现代码分析优点与不足 💯两种实现的对…...

【Python】selenium结合js模拟鼠标点击、拦截弹窗、鼠标悬停方法汇总(使用 execute_script 执行点击的方法)

我们在写selenium获取网络信息的时候,有时候我们会受到对方浏览器的监控,对方通过分析用户行为模式,如点击、滚动、停留时间等,网站可以识别出异常行为,进而对Selenium爬虫进行限制。 这里我们可以加入JavaScript的使…...

CatBoost算法详解与PyTorch实现

CatBoost算法详解与PyTorch实现 目录 CatBoost算法详解与PyTorch实现@[TOC](目录)1. CatBoost算法概述1.1 梯度提升树(GBDT)1.2 CatBoost的优势2. CatBoost的核心技术2.1 类别特征处理2.2 对称树结构2.3 有序提升技术2.4 正则化技术3. PyTorch实现CatBoost3.1 环境准备3.2 Py…...

“TypeScript版:数据结构与算法-初识算法“

引言 在算法与编程的广阔世界里,总有一些作品以其独特的魅力和卓越的设计脱颖而出,成为我们学习和研究的典范。今天,我非常荣幸地向大家分享一个令人印象深刻的算法——Hello算法。 Hello算法不仅展现了作者深厚的编程功底,更以…...

mysql中递归的使用 WITH RECURSIVE

MySQL递归查询的基本语法和用法 MySQL 8.0及以上版本支持使用WITH RECURSIVE来进行递归查询。WITH RECURSIVE定义了一个递归的公用表表达式(CTE),它包含两个部分:递归的基础部分(非递归部分)和递归部分。 …...

点击取消按钮,console出来数据更改了,页面视图没有更新

点击取消按钮,console出来数据更改了,页面视图没有更新 前言 实现效果:点击取消按钮,页面视图全部为空, 遇到的问题: 点击取消按钮,console出来数据更改了,SchemaJson 都是默认值啦…...

web框架在什么程度上受限 ?

Web框架提供了开发网站和Web应用的基础结构和工具,但它们也有一些限制。了解这些限制有助于选择合适的框架或决定何时可能需要寻找或开发替代方案。 1、问题背景 提问者计划构建一个 RESTful web 服务,该服务将只使用 JSON/XML 接口,不包含 …...

实践:事件循环

实践:事件循环 代码示例 console.log(1); setTimeout(() > console.log(2), 0); Promise.resolve(3).then(res > console.log(res)); console.log(4);上述的代码的输出结果是什么 1和4肯定优先输出,因为他们会立即方式堆栈的执行上下文中执行&am…...

C++ 设计模式:建造者模式(Builder Pattern)

链接:C 设计模式 链接:C 设计模式 - 工厂方法 链接:C 设计模式 - 抽象工厂 链接:C 设计模式 - 原型模式 建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象。与其他…...

SQL偏移类窗口函数—— LAG()、LEAD()用法详解

SQL偏移类窗口函数:LAG() 和 LEAD() 用法详解 在 SQL 中,偏移类窗口函数 LAG() 和 LEAD() 用于访问当前行的前几行或后几行的值。 1. LAG() 函数 LAG() 函数返回当前行的前几行的数据。 LAG(Expression, OffSetValue, DefaultVar) OVER (PARTITION BY …...

JavaSec-RCE

简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性&#xff0c…...

synchronized 学习

学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...

python打卡day49

知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

【2025年】解决Burpsuite抓不到https包的问题

环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

反射获取方法和属性

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

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...