当前位置: 首页 > 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
    
http://www.lryc.cn/news/514500.html

相关文章:

  • React基础知识学习
  • ES IK分词器插件
  • 二十三种设计模式-抽象工厂模式
  • python opencv的orb特征检测(Oriented FAST and Rotated BRIEF)
  • 高阶数据结构----布隆过滤器和位图
  • VScode使用密钥进行ssh连接服务器方法
  • 艾体宝产品丨加速开发:Redis 首款 VS Code 扩展上线!
  • 应用架构模式
  • 注入少量可学习的向量参数: 注入适配器IA3
  • 【C++】B2076 球弹跳高度的计算
  • 【Python】selenium结合js模拟鼠标点击、拦截弹窗、鼠标悬停方法汇总(使用 execute_script 执行点击的方法)
  • CatBoost算法详解与PyTorch实现
  • “TypeScript版:数据结构与算法-初识算法“
  • mysql中递归的使用 WITH RECURSIVE
  • 点击取消按钮,console出来数据更改了,页面视图没有更新
  • web框架在什么程度上受限 ?
  • 实践:事件循环
  • C++ 设计模式:建造者模式(Builder Pattern)
  • SQL偏移类窗口函数—— LAG()、LEAD()用法详解
  • 基于Pytorch和yolov8n手搓安全帽目标检测的全过程
  • [CTF/网络安全] 攻防世界 upload1 解题详析
  • 03-其他
  • EasyExcel自定义动态下拉框(附加业务对象转换功能)
  • 2025.1.2
  • 重庆大学软件工程复试怎么准备?
  • Ant Design Pro搭建react项目
  • mysql连接时报错1130-Host ‘hostname‘ is not allowed to connect to this MySQL server
  • 办公 三之 Excel 数据限定录入与格式变换
  • Ubuntu执行sudo apt-get update失败的解决方法
  • torch.nn.functional的用法