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

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_root/
├── app/
│ ├── init.py
│ ├── app.py
│ └── requirements.txt
├── docker-compose.yml
└── Dockerfile
其中app.py的内容如下:

from app import app

# 使用内存存储来替代 Redis
cache = {}

def get_hit_count():
    # 检查 'hits' 键是否存在,如果不存在则初始化为 0
    if 'hits' not in cache:
        cache['hits'] = 0
    # 增加计数
    cache['hits'] += 1
    return 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 Flask

app = 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:
      - .:/app
    environment:
      - FLASK_APP=app.py
      - FLASK_ENV=development 

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


http://www.kler.cn/a/460977.html

相关文章:

  • JS基础 -- 数组 (对象 / 数组 / 类数组 / 对象数组)的遍历
  • 15. 接雨水
  • 二、github基础
  • android studio android sdk下载地址
  • Postman[8] 断言
  • AI知识库与用户行为分析:优化用户体验的深度洞察
  • 基于SSM(Spring + Spring MVC + MyBatis)框架搭建一个病人跟踪信息管理系统
  • 删除了overlay2 目录下的文件 存储空间(df -h)没有释放
  • (桌面运维学习)通过备份C盘,进行Windows系统的软件初始化
  • STM32G070CB的USART1_RX引脚
  • 排序算法原理及其实现
  • 如何在 Ubuntu 22.04 上安装 Webmin 教程
  • HTML——26.像素单位
  • MF248:复制工作表形状到Word并调整多形状位置
  • 正则表达式:实战案例与最佳实践
  • kiran-qt5-integration
  • .NET Framework 4.7.2 创建 Swagger的API 的设置
  • Python学习路线
  • 截图技术方案
  • OpenCV 中的高斯金字塔和拉普拉斯金字塔:原理、实现与应用
  • GraphRAG实践:docker部署neo4j
  • gesp(C++一级)(7)洛谷:B3863:[GESP202309 一级] 小明的幸运数
  • VisualStudio 2019 升级遇到的问题及解决
  • thunderbird配置为适合回复开源社区邮件列表
  • android studio gradle 如何解决下载依赖一直卡住的问题
  • 《计算机组成及汇编语言原理》阅读笔记:p160-p176