Docker-compose部署Fastapi项目

Docker-compose部署Fastapi、postgres、Redis、Nginx)


之前有写过使用容器部署的方式,这次尝试使用Docker-compose试一次大胆的尝试

使用容器的方式部署只是掌握这项技能的基础,在使用Docker-compose的过程中会有些稍许的不同。毕竟踩过的坑才算是跨过去的坎。具体会使用到Supervisor、Gunicorn、Postgres等

Docker-compose基础文件搭建

  • yml文件: 放在项目的根目录下,名字就叫docker-compose.yml
  • Dockerfile文件:放在项目的根目录下,文件名字叫Dockerfile,这个文件是项目的Dockerfile文件
  • **log文件夹:**放在项目的根目录下,这里会放入日志文件
  • **construction文件夹:**在项目中创建这样一个文件夹,里面会放入一些配置文件

这里重点说下construction文件夹,里面放入的东西比较多,我们先从这个文件夹中的配置文件开始说起。在该文件夹中创建五个文件夹:gunicorn、nginx、postgres、redis、superviosr

Construction文件夹的各种文件创建及说明

  • **gunicorn:**在该文件夹下创建两个配置文件gunicorn.py、gunicorn.conf
debug = False
daemon = False
bind = '0.0.0.0:8003'  # 绑定ip和端口号
backlog = 512       # 监听队列
timeout = 180      # 超时
# worker_class = 'gevent' #使用gevent模式,还可以使用sync 模式,默认的是sync模式
worker_class = 'uvicorn.workers.UvicornWorker'

workers = 2    # 进程数
threads = 4 #指定每个进程开启的线程数
loglevel = 'debug'  # 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置
access_log_format = '%(t)s %(p)s %(h)s "%(r)s" %(s)s %(L)s %(b)s %(f)s" "%(a)s"'    # 设置gunicorn访问日志格式,错误日志无法设置
chdir = '/project'

accesslog = "/project/log/gunicorn/success.log"      # 访问日志文件
errorlog = "/project/log/gunicorn/error.log"        # 错误日志文件
[program:gunicorn]  # 这里的gunicorn就是告诉supervisor我们的应用名称叫做什么
process_name=%(program_name)s
command=gunicorn -c /project/construction/gunicorn/gunicorn.py main:app
# 如果上面的命令不起作用,可以使用下面的
# gunicorn main:app --workers 2 --worker-class uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
directory=/project
user=root
autostart=true
autorestart=true
  • **nginx文件夹:**在该文件夹下创建Doclerfile文件和conf文件夹,在conf文件夹中创建nginx.conf文件
# nginx镜像
FROM nginx
# 镜像作者
LABEL maintainer="Alfred"
# 换软件源
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

# 更新依赖
RUN apt-get update -y && \
    # 安装vim编辑器,方便调试,熟练后可不装
    apt-get install -y vim && \
    # 删除原有的配置文件
    rm /etc/nginx/nginx.conf && \
    # 创建log文件夹和两个日志文件,这里是为Docker-compose.yml中的数据卷对应
    mkdir /log && \
    touch /log/success.log && \
    touch /log/error.log

# 添加配置文件
ADD ./conf/nginx.conf /etc/nginx/nginx.conf
  • **postgres文件夹:**这里只需要创建data文件夹
  • **redis文件夹:**创建一个conf文件夹里面创建redis.conf,再创建一个data文件夹
bind 0.0.0.0
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 32
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
# 这个是连接密码
requirepass 123456789
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64

list-max-ziplist-size -2
list-compress-depth 0

set-max-intset-entries 512

zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes

client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60

hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes

  • **supervisor文件夹:**创建supervisord.conf的文件夹
[unix_http_server]
file=/var/run/supervisor.sock   ; the path to the socket file

[supervisord]
logfile=/project/log/supervisor/supervisor.log  ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/var/run/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false               ; start in foreground if true; default false
silent=false                 ; no logs to stdout if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200
user=root

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket

[include]
files=conf.d/*.conf

# 配置可视化管理界面,注意一定要先设置端口映射,因为我们在容器中所以port的ip必须为0.0.0.0
[inet_http_server]
port = 0.0.0.0:9010
username = admin
password = 123456789

日志文件夹的创建

在日志文件夹下创建gunicorn和nginx文件夹,并且在两个文件夹下都分别创建success.log、error.log。再创建一个supervisor文件夹,之后在此文件夹中创建superviosr.log文件

根目录下的Dockerfile文件

# 建立 python3.9 环境
FROM python:3.9

# 镜像作者
LABEL maintainer="Alfred"

RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

# 更新依赖
RUN apt-get -y update && \
    apt-get -y install vim
#    apt-get -y install gcc && \
#    apt-get -y install cmake \

# RUN apt-get install -y tzdata
# RUN apt-get install -y --fix-missing tzdata

# 设置时区
# RUN ln -snf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo Asia/Shanghai > /etc/timezone


# 设置python环境变量
ENV PYTHONUNBUFFERED 1

# 在容器内创建mes文件夹
RUN mkdir -p /peoject

# 设置容器内工作目录
WORKDIR /peoject

# 将当前目录文件加入到容器工作目录中
ADD . /peoject

# 更新pip版本
RUN /usr/local/bin/python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple/ && \
    # pip安装依赖
    pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/ && \
    # 安装gunicorn
    pip install gunicorn -i https://pypi.tuna.tsinghua.edu.cn/simple/ && \
    # 安装supervisor
    apt-get install -y supervisor && \
    # 复制supervisor配置文件
    cp /appagora/construction/supervisor/supervisord.conf /etc/supervisor/supervisord.conf && \
    # 复制supervisor的gunicorn配置文件
    cp /appagora/construction/gunicorn/gunicorn.conf /etc/supervisor/conf.d/gunicorn.conf

# 设置环境变量
ENV SPIDER=/cyxMES

# 移除\r in windows
#RUN sed -i 's/\r//' ./start.sh
#CMD ["supervisord", "-c", "/etc/supervisor/supervisord.conf"]
ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/supervisord.conf"]

yml文件

version: "3"
services:
  redis:
    image: redis
    command: redis-server
    volumes:
      - ./construction/redis/data:/data	# 这里的数据卷与上面创建的文件夹的对应
    ports:
      - "6381:6379"	# 端口映射
    restart: always # always表容器运行发生错误时一直重启

  db:
    image: postgres:16 # 用16的原因是老版本会有报错
    environment:
      - POSTGRES_DB=check# 数据库名称
      - POSTGRES_USER=baby# 数据库账户
      - POSTGRES_PASSWORD=baby # 数据库密码
    volumes:
      - ./construction/postgres/data:/var/lib/postgres/data # 挂载数据库数据
    ports:
      - "5435:5432"
    restart: always

  fastapi:
    build: .
    expose:
      - "8003"
    ports:
      - "9010:9010"	# 这里是端口映射到宿主机对Supervisor进行可视化管理    
    volumes:
      - .:/project
	# 这里的坑我放到下面讲
    command: >
        sh -c "[ -e /var/run/supervisor.sock ] && unlink /var/run/supervisor.sock; exec supervisord -n"
    links:
      - db
      - redis
    depends_on:
      - db
      - redis
    restart: always

  nginx:
    build: construction/nginx
    ports:
      - "9000:9000"
    expose:
      - "9000"
    volumes:
      - ./log/nginx:/log # 挂载日志文件,可以对应一下和上面的创建文件和nginx中的Dockerfile相对应
    links:
      - fastapi
    depends_on:
      - fastapi
    restart: always

所有的文件目录结构如下

project/

├── construction/
│ ├── gunicorn
│ │ └── gunicorn.conf
│ │ └── gunicorn.py

│ ├── nginx
│ │ ├──conf
│ │ │ └──nginx.conf
│ │ └── Dockerfile

│ ├── postgres
│ │ ├──data

│ │── redis
│ │ ├──data
│ │ ├──conf
│ │ │ └──redis.conf

│ │── superviosr
│ │ └── gunicorn.conf

│ │── log
│ │ │── gunicorn
│ │ │ └──success.log
│ │ │ └──error.log

│ │ │── nginx
│ │ │ └──success.log
│ │ │ └──error.log

│ │ │── supervisor
│ │ │ └──supervisor.log

│ └── docker-compose.yml

│ └──Dockefile

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

服务器数据恢复—RAID5磁盘阵列两块盘离线的数据恢复过程

服务器故障: 服务器中有一组由多块硬盘组建的raid5磁盘阵列,服务器阵列中2块硬盘先后掉线导致服务器崩溃。 服务器数据恢复过程: 1、将故障服务器中所有磁盘编号后取出,由硬件工程师对掉线的两块磁盘进行物理故障检测&#xff0c…

Linux 文件

文章目录 文件操作回顾(C/C)系统调用接口 管理文件认识一切皆文件C/C的文件操作函数与系统调用接口的关系……重定向与缓冲区 -- 认识重定向与缓冲区 -- 理解使用重定向缓冲区实现一个简单的Shell(加上重定向)标准输出和标准错误(在重定向下的意义) 磁盘文件磁盘存储文件操作系…

聊天框 - 微信加载历史数据的效果原来这样实现的

原文:https://juejin.cn/post/7337114587123335180?searchId20240509192958AF7D129567F92AD7E083 公众号:程序员白特,欢迎一起交流学习~ 前言 我记得2021年的时候做过聊天功能,那时业务也只限微信小程序 那时候的心路历程是&am…

win7开启远程桌面却连接不上,如何解决Win7系统开启远程桌面但无法连接的问题

在使用Win7系统时,有时候我们可能会遇到这样的问题:已经成功开启了远程桌面功能,但尝试连接时却总是失败。这可能是由于多种原因导致的,下面我们将详细分析并提供相应的解决方案。 确保本地网络连接正常 可以尝试通过Ping命令测试…

【start和run的区别(面试题)及创建线程的五种写法】

线程 1.start和run的区别2.创建线程的五种写法1.继承Thread,重写run2.实现runnable,重写run3.继承Thread,重写run,使用匿名内部类4.实现Runnable,重写run,使用匿名内部类5.使用lambda表达式 1.start和run的区别 1.start方法内部,是会调用到系统api&…

MATLAB 三维空间中在两点之间等间隔插入多个点 (67)

MATLAB 三维空间中在两点之间等间隔插入多个点 (67) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 用于加密直线点云,具体为根据给定的直线端点,沿着该直线方向,插入多个点,从而加密。具体方法和效果如下所示: 二、算法实现 1.代码 代码如下(示例): % 定…

融知财经:期货在哪里可以交易?期货交易有哪些交易规则?

作为当前金融市场的一种投资方式,期货只适合一些投资者,比如想获得高收益的投资者,因为期货的风险系数很高。但是很多投资者还不知道期货的意思,在一个固定的交易场所,期货是买卖标准化商品或金融资产的远期合约的交易…

SAP sq01,sq02,sq03创建query报表

步骤:1,SQ03创建用户组(User Group) 2,SQ02创建信息集(InfoSet) 3,SQ03分配用户和InfoSet 4,SQ01创建查询 5,SE93给Query分配Tcode 1,SQ03创建用…

pikachu靶场搭建(保姆级,手把手教学)

(phpstudy安装pikachu配置) 1.下载phpstudy(以Windows系统为例) 下载地址:https://www.xp.cn/download.html 1.打开网址 2.点击立即下载 3.选择适合自己的版本 查看自己电脑版本: 打开设置找到系统点击…

effective python学习笔记_函数

函数返回值尽量不要超过三个 局限性:当返回参数过多时,有时会搞混哪个是哪个,可能返回的两个值反了 解决方法:如果参数过多,可以组装*变量返回,或者自定义轻量类型或namedtuple返回 有意外情况时尽量抛异…

Kubernetes容器技术详解

kubernetes Kubernetes(K8s)由Google打造,是一款功能强大、灵活可扩展的容器编排平台,引领云原生技术潮流。 Kubernetes主要解决以下4大点: 1.自动化运维平台 如下图所示: Kubernetes携手Docker&#xf…

2024牛客五一集训派对day2 Groundhog Looking Dowdy 个人解题思路

前言: 被实验室教练要求要打的这次五一牛客的训练赛,这些区域赛难度的题对于大一的我来说难度实在是太高了,我和我的队友只写了一些非常简单的签到题,其他题目都没怎么看(我们太弱了),但我可以分…

Powerdesigner导入mysql8之后注释丢失

目录 一、问题描述及解决思路 二、导入的步骤 1.先按正常步骤建立一个物理数据模型 (1)点击“文件-新建模型” (2)选择物理模型和数据库 2.从sql文件导入表 (1)点击“数据库-Update Model from Data…

智慧营销的未来:中国AIGC技术的演进与应用 #未来是现在的趋势#

📑前言 随着人工智能(AI)技术的蓬勃发展,尤其是在营销技术(MarTech)领域,AIGC(AI Generated Content)技术在中国市场的应用和影响日益显著。2023年,中国在AIG…

16-LINUX--线程安全

一。线程安全 线程安全即就是在多线程运行的时候,不论线程的调度顺序怎样,最终的结果都是 一样的、正确的。那么就说这些线程是安全的。 要保证线程安全需要做到: 1) 对线程同步,保证同一时刻只有一个线程访问临界资…

什么是静态住宅代理IP?

静态住宅代理(也称为静态ISP代理)是最流行的代理类型之一。它们也是隐藏您的身份并保持在线匿名的最佳方法之一。您为什么要使用住宅代理而不是仅使用常规代理服务?下面我具体分享。 一、什么是静态住宅代理? 首先,我…

vivado 低级别 SVF JTAG 命令

低级别 SVF JTAG 命令 注释 : 在 Versal ™ 器件上不支持 SVF 。 低级别 JTAG 命令允许您扫描多个 FPGA JTAG 链。针对链操作所生成的 SVF 命令使用这些低级别命令来访问链中的 FPGA 。 报头数据寄存器 (HDR) 和报头指令寄存器 (HIR) 语法 HDR length […

怎么制作地理思维导图?方法推荐

怎么制作地理思维导图?随着信息技术的飞速发展,教育领域也迎来了深刻的变革。思维导图作为一种高效的学习工具,已经广泛应用于地理学科的教学中。它不仅可以帮助学生更好地理解和记忆地理知识,还能提高学习效率。本文将为大家推荐…

ESP-WROOM-32配置Arduino IDE开发环境

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、下载Arduino IDE二、安装工具集三、测试样例1.选则开发板2.连接开发板3.示例程序 四、使用官方示例程序总结 前言 之前用了很多注入STM32、树莓派Pico和Ar…
最新文章