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

news2024/12/23 18:17:51

提供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: bridge

services:

  mysql_app:
    image: mysql:5.7
    container_name: mysql_app
    environment:
      MYSQL_DATABASE: 'polls' # 数据库名称
      MYSQL_USER: 'user'  # 新建数据库用户
      MYSQL_PASSWORD: '123'  # 新建用户的密码
      MYSQL_ROOT_PASSWORD: '123'  # 数据库root账号的密码
    volumes:
      - ../mysql:/var/lib/mysql
    ports:
      - "1002:3306"
    networks:
      - python_app_net

  redis_app:
    image: redis:latest
    container_name: redis_app
    ports:
      - "1003:6379"
    volumes:
      - ../redis:/data
    networks:
      - python_app_net


  python_app: # 服务的名称
    build:
      context: . # Dockerfile所在的目录路径
      dockerfile: dockerfile # dockerfile的文件名称,有自定义名称的话按照这个寻找
    container_name: python_app # 指定容器名称,nginx使用docker部署的时候用得上
    image: python_image:1.0 # 镜像的名称与tag
    volumes:
      - ../python-app:/app # 服务挂载的卷,挂载以后可以在宿主机直接更改文件,容器内会同步修改,反之亦然,前面为宿主机路径,后面为容器内路径(宿主机路径选择为目前项目路径,新指定路径的话需要将文件都提前放进去,因为是先创建容器再将宿主机挂载的目录整个copy进容器,如果指定了其他路径里面为空的话容器内的工作目录会被覆盖为空,服务无法启动)
#    ports:  # 如果走nginx代理,则不需要将服务的端口暴露出去
#      - "1000:1000" # 容器对外映射的端口,前面为宿主机,后面为容器内,容器内端口需要与服务的端口,dockerfile的expose端口保持一致
    depends_on:  # 在其他指定容器只后启动
      - redis_app
      - mysql_app
    networks:
      - python_app_net

  python_app1: # 服务的名称
    build:
      context: . # Dockerfile所在的目录路径
      dockerfile: dockerfile # dockerfile的文件名称,有自定义名称的话按照这个寻找
    container_name: python_app1 # 指定容器名称,nginx使用docker部署的时候用得上
    image: python_image:1.0 # 镜像的名称与tag
    volumes:
      - ../python-app:/app # 服务挂载的卷,挂载以后可以在宿主机直接更改文件,容器内会同步修改,反之亦然,前面为宿主机路径,后面为容器内路径(宿主机路径选择为目前项目路径,新指定路径的话需要将文件都提前放进去,因为是先创建容器再将宿主机挂载的目录整个copy进容器,如果指定了其他路径里面为空的话容器内的工作目录会被覆盖为空,服务无法启动)
    #    ports:  # 如果走nginx代理,则不需要将服务的端口暴露出去
    #      - "1000:1000" # 容器对外映射的端口,前面为宿主机,后面为容器内,容器内端口需要与服务的端口,dockerfile的expose端口保持一致
    depends_on: # 在其他指定容器只后启动
      - redis_app
      - mysql_app
    networks:
      - python_app_net

  nginx_app:
    image: nginx:latest
    container_name: nginx_app
    ports:
      - "1001:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - python_app
    networks:
      - python_app_net

3、main.py

import os

import redis
import pymysql
import socket
import logging
from flask import Flask, jsonify
from flask_cors import CORS

app = Flask(__name__)
app.json.ensure_ascii = False
CORS(app, supports_credentials=True)


@app.route('/', methods=['GET'])
def index():
    # 连接redis
    redis_client = redis.Redis(host='redis_app', port=6379, db=0,
                               decode_responses=True)  # host为容器名称,port为容器内端口,不是容器暴露的端口
    num = redis_client.get('key') or 1
    redis_client.set('key', int(num) + 1)

    # 连接mysql
    mysql_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.coloradmin.cn/o/1928085.html

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

相关文章

数据库-三范式

第一范式 1 数据库所有字段都只有单一属性。 2 单一属性由基本数据类型构成。 3 数据库的表都是二维的行与列。 例如上面的例子就不满足第一范式,因为是可以继续拆分的,拆分为更多的属性。 第二范式 1 符合第一范式 2 表必须有个主建 3 其它字段可以…

企业网络运维-给华为交换机配置sftp,浏览交换机文件并下载上传

文章目录 需求实验开户stelnet权限已完成stelnet账号下的sftp配置使用xshell-sftp访问 需求 浏览交换机文件并下载上传 实验 开户stelnet权限 参考https://blog.csdn.net/xzzteach/article/details/140419150 已完成stelnet账号下的sftp配置 服务类型all包括stelnet和sf…

SadTalker数字人服务器部署

一、单独SadTalker部署 git clone https://github.com/OpenTalker/SadTalker.gitcd SadTalker conda create -n sadtalker python3.8conda activate sadtalkerpip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pyto…

NSSCTF中24网安培训day2中web题目

[SWPUCTF 2021 新生赛]ez_unserialize 这道题目考察php反序列化的知识点 打开题目,发现没有提示,我们试着用御剑扫描目录文件,发现存在robots.txt的文件 接着访问这个文件,发现是一段php反序列化代码,我们需要进行序…

[Windows] 油.管视频下载神器 Gihosoft TubeGet Pro v9.3.88

描述 对于经常在互联网上进行操作的学生,白领等! 一款好用的软件总是能得心应手,事半功倍。 今天给大家带了一款高科技软件 管视频下载神器 无需额外付费,永久免费! 亲测可运行!! 内容 目前主…

【B树、B-树、B+树】

目录 一、B-树(即B树)的定义及操作1.1、定义1.2、操作1.2.1、查找1.2.2、插入1.2.3、删除 二、B树的定义及操作2.1、定义2.2、操作2.2.1、查找2.2.2、插入2.2.3、删除 一、B-树(即B树)的定义及操作 1.1、定义 B-tree即B树&#…

jmeter-beanshell学习10-字符串补齐位数

每天都遇到新问题,今天又一个场景,一个字符串,如果不足11位,则左边补0,补够11位。 先要获取字符串长度,然后计算差多少位,补齐。今天又发现一个Object类型,这个类型有点厉害&#x…

uniapp启动图延时效果,启动图的配置

今天阐述uniapp开发中给启动图做延迟效果,不然启动图太快了,一闪就过去了; 一:修改配置文件:manifest.json "app-plus" : {"splashscreen" : {"alwaysShowBeforeRender" : false,"…

dhtmlx-gantt甘特图数据展示

官网文档&#xff1a;甘特图文档 实现效果&#xff1a; 首先需要下载 dhtmlx-gantt组件 npm i dhtmlx-gantt //我项目中使用的是"dhtmlx-gantt": "^8.0.6" 这个版本&#xff0c;不同的版本api或是文档中存在的方法稍有差异 界面引用 <template>&l…

二叉搜索树的实现[C++]

文章目录 搜索二叉树概念二叉搜索树的功能查找 实现搜索二叉树节点的定义建立搜索二叉树接口插入搜索打印删除 总结 今天本堂主来一起讨论下什么是搜索二叉树&#xff0c;和如何实现二叉搜索树 搜索二叉树 那么二叉搜索树似乎如何实现搜索呢&#xff1f;二叉搜索树和普通二叉…

PNPM 高效入门:安装配置一本通

PNPM高效入门&#xff1a;安装配置一本通 引言Pnpm 简介安装 PNPM全局安装&#xff08;推荐&#xff09;使用 nvm&#xff08;Node Version Manager&#xff09; 配置PNPM使用PNPM管理项目初始化项目 添加依赖快速安装所有依赖查看安装的包 优化与故障排除PNPM与持续集成/持续部…

nacos 适配瀚高数据库、ARM 架构

下载nacos源码: https://github.com/alibaba/nacos/tree/2.3.1 瀚高技术文档 1、修改pom.xml 根目录nacos-all => pom.xml<dependencyManagement><dependency><groupId>com.highgo</groupId><artifactId>HgdbJdbc</artifactId><…

安全防御:防火墙基本模块

目录 一、接口 1.1 物理接口 1.2 虚拟接口 二、区域 三、模式 3.1 路由模式 3.2 透明模式 3.3 旁路检测模式 3.4 混合模式 四、安全策略 五、防火墙的状态检测和会话表技术 一、接口 1.1 物理接口 三层口 --- 可以配置IP地址的接口 二层口&#xff1a; 普通二层…

linux的学习(四):磁盘,进程,定时,软件包的相关命令

简介 关于磁盘管理&#xff0c;进程管理&#xff0c;定时任务&#xff0c;软件包管理的命令的使用 磁盘管理类命令 du du 目录名&#xff1a; 查看文件和目录占用的磁盘空间 参数&#xff1a; -h&#xff1a;可以看到大小的单位&#xff0c;g,mb-a&#xff1a;还可以看到文…

Mapboxgl 生成飞行动画GIF

更多精彩内容尽在数字孪生平台&#xff0c;关注公众号【sky的数孪技术】&#xff0c;技术交流、源码下载请添加VX&#xff1a;digital_twin123 根据两点生成动画的工具。 首先&#xff0c;找到你想要开始的视图&#xff0c;点击“设置起点视图”&#xff0c;然后调整到目的视图…

Android中RecyclerView使用详解(一)

目录 概述优点列表布局RecyclerView一、创建RecyclerView并且在布局中绑定二、实现RecyclerView单个item的布局三、给RecyclerView写一个对应的适配器Adapter1.创建自定义的ViewHolder2.继承Adapter&#xff0c;泛型使用我们自定义的ViewHolder3.重写Adapter的三个方法onCreate…

如何提取视频中的音频?提取音频的几种方法

如何提取视频中的音频&#xff1f;提取视频中的音频&#xff0c;是许多人在处理多媒体内容时常遇到的需求。这一过程不仅仅是简单地从视听媒体中抽离音频部分&#xff0c;它背后蕴含着许多技术上的挑战和创意上的可能性。通过提取音频&#xff0c;你可以更方便地利用视频中的声…

网络安全——防御(防火墙)带宽以及双机热备实验

12&#xff0c;对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW3&#xff0c;生产区和办公区的流量走FW1 13&#xff0c;办公区上网用户限制流量不超过100M&#xff0c;其中销售部人员在其…

docker镜像导出与导入

布置程序出问题了&#xff0c;拉不下来镜像 程序的配置文件里面有镜像的名字 docker pull ubuntu/squid:latest 我是本地下载了镜像&#xff0c;使用本地的镜像导出 导出镜像使用 docker 导出导入镜像 要在Docker中导出和导入镜像&#xff0c;您可以使用docker save命令来导…

《昇思25天学习打卡营第5天|10使用静态图加速》

写在前面 跳过了模型训练和保存两节&#xff0c;模型训练的例子已经学习过&#xff0c;都是重复的内容&#xff0c;不进行详细的学习了&#xff0c;除非要使用类似的函数。 因此接下来开始学习初学教程的最后一节&#xff1a;使用静态图加速&#xff0c;希望能学习到一些内容。…