Docker---最详细的服务部署案例

提供python服务的docker一键部署,示例已配置负载均衡,不需要的在nginx.conf和docker-compose注释相关代码即可

文件结构

1、dockerfile

# 服务的dockerfile# 服务依赖的镜像
FROM python:3.7# 设置容器内服务的工作目录
WORKDIR /app# 复制当前文件夹所有文件到容器的工作目录,可以选择性按照选择依次COPY
COPY . /app# 安装服务所需依赖
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r req.txt# 服务启动的接口,要与服务启动文件里面的保持一致
EXPOSE 1000# 服务启动命令
CMD ["sh", "start.sh"]

2、docker-compose.yml

version: '3.3'networks:python_app_net: # 定义容器间网络的名称driver: bridgeservices:mysql_app:image: mysql:5.7container_name: mysql_appenvironment:MYSQL_DATABASE: 'polls' # 数据库名称MYSQL_USER: 'user'  # 新建数据库用户MYSQL_PASSWORD: '123'  # 新建用户的密码MYSQL_ROOT_PASSWORD: '123'  # 数据库root账号的密码volumes:- ../mysql:/var/lib/mysqlports:- "1002:3306"networks:- python_app_netredis_app:image: redis:latestcontainer_name: redis_appports:- "1003:6379"volumes:- ../redis:/datanetworks:- python_app_netpython_app: # 服务的名称build:context: . # Dockerfile所在的目录路径dockerfile: dockerfile # dockerfile的文件名称,有自定义名称的话按照这个寻找container_name: python_app # 指定容器名称,nginx使用docker部署的时候用得上image: python_image:1.0 # 镜像的名称与tagvolumes:- ../python-app:/app # 服务挂载的卷,挂载以后可以在宿主机直接更改文件,容器内会同步修改,反之亦然,前面为宿主机路径,后面为容器内路径(宿主机路径选择为目前项目路径,新指定路径的话需要将文件都提前放进去,因为是先创建容器再将宿主机挂载的目录整个copy进容器,如果指定了其他路径里面为空的话容器内的工作目录会被覆盖为空,服务无法启动)
#    ports:  # 如果走nginx代理,则不需要将服务的端口暴露出去
#      - "1000:1000" # 容器对外映射的端口,前面为宿主机,后面为容器内,容器内端口需要与服务的端口,dockerfile的expose端口保持一致depends_on:  # 在其他指定容器只后启动- redis_app- mysql_appnetworks:- python_app_netpython_app1: # 服务的名称build:context: . # Dockerfile所在的目录路径dockerfile: dockerfile # dockerfile的文件名称,有自定义名称的话按照这个寻找container_name: python_app1 # 指定容器名称,nginx使用docker部署的时候用得上image: python_image:1.0 # 镜像的名称与tagvolumes:- ../python-app:/app # 服务挂载的卷,挂载以后可以在宿主机直接更改文件,容器内会同步修改,反之亦然,前面为宿主机路径,后面为容器内路径(宿主机路径选择为目前项目路径,新指定路径的话需要将文件都提前放进去,因为是先创建容器再将宿主机挂载的目录整个copy进容器,如果指定了其他路径里面为空的话容器内的工作目录会被覆盖为空,服务无法启动)#    ports:  # 如果走nginx代理,则不需要将服务的端口暴露出去#      - "1000:1000" # 容器对外映射的端口,前面为宿主机,后面为容器内,容器内端口需要与服务的端口,dockerfile的expose端口保持一致depends_on: # 在其他指定容器只后启动- redis_app- mysql_appnetworks:- python_app_netnginx_app:image: nginx:latestcontainer_name: nginx_appports:- "1001:80"volumes:- ./nginx.conf:/etc/nginx/nginx.confdepends_on:- python_appnetworks:- python_app_net

3、main.py

import osimport redis
import pymysql
import socket
import logging
from flask import Flask, jsonify
from flask_cors import CORSapp = Flask(__name__)
app.json.ensure_ascii = False
CORS(app, supports_credentials=True)@app.route('/', methods=['GET'])
def index():# 连接redisredis_client = redis.Redis(host='redis_app', port=6379, db=0,decode_responses=True)  # host为容器名称,port为容器内端口,不是容器暴露的端口num = redis_client.get('key') or 1redis_client.set('key', int(num) + 1)# 连接mysqlmysql_connection = pymysql.connect(host='mysql_app', user='root', password='Admin123.', database='polls',port=3306)  # host为容器名称,port为容器内端口,不是容器暴露的端口try:with mysql_connection.cursor() as cursor:cursor.execute('SELECT VERSION()')res = cursor.fetchone()msg = f'mysql的版本为:{res}'except Exception as e:msg = f'连接mysql失败,{e}'finally:mysql_connection.close()hostname = socket.gethostname()ip_address = socket.gethostbyname(hostname)pid = os.getpid()return jsonify({'code': 200, 'msg': 'success', 'mysql': msg, 'redis': f'这是你第{num}次访问','data': f'ip: {ip_address}, pid: {pid}'})if __name__ == '__main__':app.run(debug=False, host='0.0.0.0', port=1000)  # 用容器启动的话host必须为0.0.0.0,不然无法被其他容器访问

4、req.txt

flask==3.0.3
gunicorn==22.0.0
flask_cors
redis
pymysql

5、start.sh

# --daemon 后台运行的指令不需要,会让容器启动的时候发现进程结束了,直接关闭容器
# --reload会在配置了挂载目录的时候在宿主机的文件更改直接生效,不需要重启容器
# --bind必须绑定0.0.0.0,因为在容器里面,从其他容器访问的话使用127.0.0.1是无法访问到的
gunicorn --reload -w 4 --bind 0.0.0.0:1000 main:app

6、启动命令

# -d会让容器后台运行,不会直接挂在打印台
docker-compose up -d 

注意:如果运行拉取镜像报错,可以先单独docker pull 指定镜像,拉取到本地,然后运行docker-compose

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

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

相关文章

基于Rspack实现大仓应用构建提效实践|得物技术

一、实践背景 随着项目的逐步迭代,代码量和依赖的逐渐增长,应用的构建速度逐步进入缓慢期。以目前所在团队的业务应用来看(使用webpack构建),应用整体构建耗时已经普遍偏高,影响日常开发测试的使用效率&am…

护网--2

实验要求: 1、办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 2、分公司设备可以通过总公司的移动链路和电信链路访问到Dmz区的http服务器 3、多出口环境基于带宽比例进行选路,但是,…

实现keepalive+Haproxyde 的高可用

需要准备五台实验机 一台客户机:test1 两台:一主一备的实验机:test2 test3 两台真实服务器:nginx1 nginx2 实验 首先在两台实验机上安装Haproxy 安装依赖环境,并将Haproxy的包进行解压处理 yum install -y pcre…

nodejs安装部署运行vue前端项目

文章目录 1.安装nodejs2.安装Vue CLI1.配置npm镜像源:2.安装Vue CLI:3.创建Vue项目4.启动Vue项目5.Express 1.安装nodejs Node.js 是一个免费、开源、跨平台的 JavaScript 运行时环境,它让开发人员能够创建服务器、Web 应用、命令行工具和脚…

【自动驾驶汽车通讯协议】UART通信详解:理解串行数据传输的基石

文章目录 0. 前言1. 同步通讯与异步通讯1.1 同步通信1.2 异步通信 2. UART的数据格式3. 工作原理3.1 波特率和比特率3.2 UART的关键特性 4. UART在自动驾驶汽车中的典型应用4.1 UART特性4.2应用示例 5. 结语 0. 前言 按照国际惯例,首先声明:本文只是我自…

xlive.dll丢失怎么办,xlive.dll文件的主要用途

xlive.dll丢失怎么办?目前是有很多方法可以解决这个xlive.dll丢失的问题的,只要你仔细的去了解xlive.dll这个文件,至于使用哪种方法,主要还是看你的实际情况,因为情况不同选择使用的方法也是不一样的,下面一…

底软驱动 | Linux虚拟内存

为了更有效的管理内存并且少出错,现代操作系统提供了一种对主存的抽象概念,叫做虚拟内存(VM)。虚拟内存提供了三个重要的能力: 1.它将主存(物理内存)看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保留活动区域,并且根据…

openEuler 安装 podman 和 podman compose

在 openEuler 22.03 LTS SP4 中,你可以使用 dnf 包管理器来安装 Podman 和 Podman Compose。openEuler 默认使用 dnf 作为包管理器,所以这是安装软件的首选方式。 关于 openEuler 22.03 LTS SP4 下载地址: https://www.openeuler.org/zh/dow…

【256 Days】我的创作纪念日

目录 🌼01 机缘 🌼02 收获 🌼03 日常 🌼04 成就 🌼05 憧憬 最近收到官方来信, 突然发现,不知不觉间,距离发布的第一篇博客已过256天,这期间我经历了春秋招、毕业答辩…

Access denied for user ‘root‘@‘localhost‘ (using password: YES)解决办法

在Spring配置数据源时,当使用Spring容器加载druid.properties数据库连接池配置文件时,容易碰到create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/mydbs, errorCode 1045, state 28000 java.sql.SQLException: Access denied for user …

破解YouTube限制:保姆级教程,轻松查看博主邮箱

近期YouTube取消了博主的邮箱展示,这造成了不小的轰动,给想要联系博主的粉丝和想要寻求网红合作的品牌都带来了极大的不便。但这难不倒万能的网友!最新发现,通过一串神秘代码可以在YouTube上查看到博主的邮箱,这里Nox聚…

CycleGAN深度学习项目

远程仓库 leftthomas/CycleGAN: A PyTorch implementation of CycleGAN based on ICCV 2017 paper "Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks" (github.com) 运行准备 Anaconda 安装需要的库 指令 pip install panda…

LPRNet 车牌识别部署 rk3588(pt-onnx-rknn)包含各个步骤完整代码

虽然车牌识别技术很成熟了,但完全没有接触过。一直想搞一下、整一下、试一下、折腾一下,工作之余找了一个简单的例子入个门。本博客简单记录一下 LPRNet 车牌识别部署 rk3588流程,训练参考 LPRNet 官方代码。 1、导出onnx   导出onnx很容易…

【postgresql】权限(Privileges)

权限(privileges)是决定用户或角色可以对数据库对象(如表、视图、序列和函数)执行哪些操作的许可。权限对于维护安全性和控制对数据的访问至关重要。 权限分类 在 PostgreSQL 中,权限分为以下几种: SELEC…

数据库基本查询(表的增删查改)

一、增加 1、添加信息 insert 语法 insert into table_name (列名) values (列数据1,列数据2,列数据3...) 若插入时主键或唯一键冲突就无法插入。 但如果我们就是要修改一列信息也可以用insert insert into table_name (列名) values (列数据1&am…

客户端通过服务器进行TCP通信(三)

一. 对TCP的基础讲解 服务端 1. 首先创建一个套接字,TCP是面向字节流的套接字,故需要使用SOCK_STREAM 2. 然后使用bind()函数将套接字与服务器地址关联(如果是在本地测试,直接将地址设置为217.0.0.1或者localhost,端口号为1000…

内存函数(C语言)

内存函数 以下函数的头文件:string.h 针对内存块进行处理的函数 memcpy 函数原型: void* memcpy(void* destination, const void* source, size_t num);目标空间地址 源空间地址num,被拷贝的字节个数 返回目标空间的起始地…

Python与自动化脚本编写

Python与自动化脚本编写 Python因其简洁的语法和强大的库支持,成为了自动化脚本编写的首选语言之一。在这篇文章中,我们将探索如何使用Python来编写自动化脚本,以简化日常任务。 一、Python自动化脚本的基础 1. Python在自动化中的优势 Pyth…

1.31、基于长短记忆网络(LSTM)的发动机剩余寿命预测(matlab)

1、基于长短记忆网络(LSTM)的发动机剩余寿命预测的原理及流程 基于长短期记忆网络(LSTM)的发动机剩余寿命预测是一种常见的机器学习应用,用于分析和预测发动机或其他设备的剩余可用寿命。下面是LSTM用于发动机剩余寿命预测的原理和流程: 数据收集&#…

【Linux】 GCC/G++与Makefile使用

Linux GCC/G使用 GCC如何完成 格式:gcc [选项] 要编译的文件 [选项] [目标文件] 常用选项: -E:让gcc在预处理结束后停止编译过程,输出.i的C语言原始文件。-S:该选项只是进行编译而不是进行汇编,最终生成汇…