【Docker】Compose容器编排LNMP上云

文章目录

    • 什么是Docker-Compose
    • 下载安装
      • 官网
      • 官网下载
      • 安装
      • 卸载
    • Compose核心概念
      • 一文件
      • 两要素
      • 三个步骤
    • Compose常用命令
    • Django+Mysql+Redis+Nginx部署
      • 部署架构
      • 构建django容器 - - - dockerfile编写
      • 构建Nginx容器
      • docker-compose 编排容器
      • Django项目配置
    • custom_web
      • mysql容器
      • redis容器
      • Django容器

什么是Docker-Compose

Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器

Docker-Compose是Docker官方的开源项目, 负责实现对Docker容器集群的快速编排。

通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。

下载安装

  • 官网

    https://docs.docker.com/compose/compose-file/compose-file-v3/

  • 官网下载

    https://docs.docker.com/compose/install/

  • 安装

    1. curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    2. chmod +x /usr/local/bin/docker-compose
    3. docker-compose --version
      在这里插入图片描述
  • 卸载

    在这里插入图片描述

Compose核心概念

Compose常用命令

命令说明
docker-compose -h查看帮助
docker-compose up启动所有docker-compose服务
docker-compose up -d启动所有docker-compose服务并后台运行
docker-compose down停止并删除容器、网络、卷、镜像
docker-compose exec yml里面的服务id进入容器实例内部 docker-compose exec docker-compose.yml文件中写的服务id /bin/bash
docker-compose ps展示当前docker-compose编排过的运行的所有容器
docker-compose top展示当前docker-compose编排过的容器进程
docker-compose logs yml里面的服务id查看容器输出日志
docker-compose config检查配置
docker-compose config -q检查配置,有问题才有输出
docker-compose restart重启服务
docker-compose start启动服务
docker-compose stop停止服务

Django+Mysql+Redis+Nginx部署

  • 部署架构

    按照一个进程一个容器原则,本次部署一共有下面几个容器(celery和uwsgi与web耦合较高未进行拆分)

    • Redis 容器:缓存服务

    • Mongo容器: 用户行为日志存储

    • Mysql 容器:数据存储

    • Django(uwsgi,celery)容器:处理动态请求

    • Nginx 容器:反向代理,处理静态资源

      在这里插入图片描述

    • featech_v2_0 是 django 项目目录

    • deployment 文件夹放置了除 Django 容器外的四个容器配置信息以及其他挂载(容器和宿主机的共享卷)的其他文件。

    • Dockerfile:docker 环境文件

    • docker-compose.yml:编排容器文件

  • 构建django容器 - - - dockerfile编写

    # 使用python:3.7.3作为基础镜像
    FROM python:3.7.3
    
    # 设置 python 环境变量
    ENV PYTHONUNBUFFERED 1
    
    # 创建项目目录并将本地项目目录文件复制到容器
    RUN mkdir /featech_v2_0
    COPY ./featech_v2_0  /featech_v2_0
    
    # 设置工作目录,后续容器的操作都是基于此目录
    WORKDIR /featech_v2_0
    
    # 设置pip源(科学上网者可忽略)
    RUN pip config set global.index-url http://mirrors.aliyun.com/pypi/simple
    RUN pip config set install.trusted-host mirrors.aliyun.com
    
    # 升级pip并安装python依赖
    RUN pip install -U pip
    RUN pip install -r /featech_v2_0/requirement.txt
    
    # 暴露端口8888
    EXPOSE 8888
    
  • 构建Nginx容器

    Nginx容器dockerfile编写(这一步有点多余了,其实这里只是简单的创建了几个文件夹,完全可以放到docker-compose.yml中的command执行)

    • dockerfile编写
      # nginx镜像
      FROM daocloud.io/nginx
      
      # 创建静态资源文件夹和ssl证书保存文件夹
      RUN RUN mkdir -p /usr/share/nginx/html/static;mkdir -p /usr/share/nginx/html/media;mkdir -p /usr/share/nginx/ssl
      
    • 修改Nginx配置文件

      配置反向代理时,注意 host 一定要改为 web,web即是django容器的名称(在docker-compose.yml中配置)

      server {
          listen 80; # 监听80端口
          server_name  127.0.0.1;  # 生产环境请换成域名
          location / {
              proxy_pass http://web:8000; # 反向代理 django容器8000端口,web为django容器名称,切记不要写域名或者ip
              proxy_set_header Host $host;
              proxy_redirect off;
              proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          }
          location /static/ {
              alias /usr/share/nginx/html/static/; #静态资源路径
          }
          location /media/ {
              alias /usr/share/nginx/html/media/; #上传文件路径
          }
      }
      
  • docker-compose 编排容器

    docker-compose.yml

    version: '3'
    services:
      redis:
        image: daocloud.io/redis:3
        container_name: featech_redis
        command: redis-server
        volumes:
          - ./deployment/redis/data:/data  # 挂载数据库数据文件夹
        ports:
          - "6373:6379"
        restart: always # always表容器运行发生错误时一直重启
      
      db:
        image: mysql:5.7
        container_name: featech_db
        ports:
          - "3303:3306"
        volumes:
          - ./deployment/mysql/data:/var/lib/mysql # 挂载数据库数据
          #    - ./deployment/mysql/conf/my.cnf:/etc/mysql/my.cnf # 挂载配置文件
          - ./deployment/mysql/init:/docker-entrypoint-initdb.d/ # 挂载数据初始化sql脚本
        
        environment:
          MYSQL_ROOT_PASSWORD: 12345678  # 数据库密码
          MYSQL_DATABASE: fetach_v2_0  # 数据库名称
          LNAG: C.UTF-8
        command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci']
      web:
        build: .
        container_name: featech_v2_0
        
        # tty: true  如果web容器出错想进入容器做修改时,此配置可分配一个伪终端让容器先运行起来
        
        # 容器启动后启动通过uwsgi启动django应用并启动celery,这里我简单实用了nohup启动celery,可选择使用supervisor管理
        command: uwsgi --ini uwsgi && nohup celery -A celery_tasks.sms.tasks worker -l info >> celery_log/celery.log 2>&1 &
        
        depends_on:
          - db
          - redis
          - mongo
        links:
          - db
          - redis
          - mongo
        volumes:
          - ./featech_v2_0:/featech_v2_0  # 挂载项目目录
        restart: always
        ports:
          - "8888:8888"
      nginx:
        build: deployment/nginx
        container_name: featech_nginx
        ports:
          - "80:80"
          - "443:443"
        expose:
          - "8888"
        volumes:
          - ./featech_v2_0/static:/usr/share/nginx/html/static # 挂载静态文件
          - ./featech_v2_0/frontEnd:/usr/share/nginx/html/frontEnd # 挂载静态文件
          - ./featech_v2_0/media:/usr/share/nginx/html/upload # 挂载上传文件
          - ./deployment/nginx/ssl:/usr/share/nginx/ssl # 挂载ssl证书目录
          - ./deployment/nginx/conf/conf.d:/etc/nginx/conf.d # 挂载配置文件
        links:
          - web
        depends_on:
          - web
        restart: always
      mongo:
        image: mongo:4.0
        container_name: featech_mongo
        hostname: mongo
        restart: always
        ports:
          - "27013:27017"
        environment:
          TZ: Asia/Shanghai
        #MONGO_INITDB_DATABASE: test
        #MONGO_INITDB_ROOT_USERNAME: root
        #MONGO_INITDB_ROOT_PASSWORD: 123456
        volumes:
          - /etc/localtime:/etc/localtime
          - ./deployment/mongo/data:/data/db
          - ./deployment/mongo/init:/docker-entrypoint-initdb.d/
        command: mongod
    

    redis,db,web,nginx,mongo为容器名称。

    • image 表示拉取镜像名称,build会在给定目录下寻找 Dockerfile 并构建容器环境。
    • expose 表示将端口暴露给其他容器,但不暴露给主机(不同容器默认相互隔离)。
    • ports 表示将该容器端口映射到主机端口(从右往左读,例如ports: -

      “3303:3306”,是指把容器的3306端口映射到主机的3303端口),同时该容器端口也会对其他容器开放。

    • volumes

      表示挂载,就是将本机的文件和容器中的文件映射起来,容器和本地环境本来是隔离的,挂载相当于是凿了一个小洞,让两者数据可以互通。

    • links 表示将容器互联起来。
    • depends_on:表示依赖关系,因为容器的启动有先后顺序,django 容器依赖于 mysql 容器和 redis

      容器(django需要从数据库和缓存中读写数据),而 nginx 依赖于 django 容器(nginx 容器需要反向代理 django容器的8888端口)

  • Django项目配置

    • settings.py文件配置

      将 数据库连接 HOST 改为 mysql 容器名称 db

      DATABASES = {
          'default': {
              'ENGINE': 'django.db.backends.mysql',  # mysql驱动
              'NAME': 'fetach_v2_0',  # 数据库名称
              'USER': 'root',  # 登录帐号
              'PASSWORD': '12345678',  # 登录密码
              'HOST': 'db',  # 主机地址(容器部署)
              # 'HOST': '127.0.0.1',  # 主机地址
              'PORT': '3306',  # 端口
              'OPTIONS': {'charset': 'utf8mb4'},
          }
      }
      

      将缓存配置中的 host 改为 redis 容器名称 redis(如果你配置了redis作为缓存的话,没配置的话请忽略)

      CACHES = {
          'default': {
              'BACKEND': 'django_redis.cache.RedisCache',
              'LOCATION': 'redis://redis:6379',  # redis(容器)
              # 'LOCATION': '127.0.0.1:6379',
              'OPTIONS': {
                  "CLIENT_CLASS": "django_redis.client.DefaultClient",
                  "CONNECTION_POOL_KWARGS": {"max_connections": 100},
                  'SOCKET_TIMEOUT': 10,
              },
          },
      }
      

      生产环境部署请将 settings.py 中的 DEBUG = True 改为 DEBUG = False以关闭debug模式。

      broker_url = "redis://redis/2"
      result_backend = "redis://redis/3"
      

custom_web

由于Docker-Compose编排 导致项目调试无法本地操练,下面决定手动一个一个启动容器

  • mysql容器

    对外暴露端口3307

    >

    [client]
    default_character_set=utf8
    [mysqld]
    collation_server = utf8_general_ci
    character_set_server = utf8
    

    在这里插入图片描述

  • redis容器

    对外暴露6373

    在这里插入图片描述

  • Django容器

    • requirements文件生成
      记得加uwsgi模块
      在这里插入图片描述

    • Dockerfile文件编写

      FROM python:3.10.10
      MAINTAINER alan@al6nlee.com
      # 以下是重点,.的意思是把当前目录的所有文件(包含文件夹)copy到镜像/SeeStar中
      RUN mkdir /custom_web
      COPY ./custom_web  /custom_web
      WORKDIR /custom_web
      RUN pip config set global.index-url http://mirrors.aliyun.com/pypi/simple
      RUN pip config set install.trusted-host mirrors.aliyun.com
      RUN pip install -U pip
      RUN pip install -r /custom_web/requirements.txt
      
      CMD ["uwsgi", "--ini", "uwsgi.ini"]
      
    • uwsgi.ini文件编写

      [uwsgi]
      # Django-related settings
      #socket = :8001
      http = :8888
      # the base directory (project full path)
      chdir = /custom_web
      # Django s wsgi file
      wsgi-file = /custom_web/custom_web/wsgi.py
      master = true
      processes = 4
      chmod-socket = 664
      vacuum = true
      pidfile = pid.uwsgi
      # run process background and save log to daemonize
      # daemonize = UWSGI.log
      

      在这里插入图片描述

    • 构建
      在这里插入图片描述

    • 启动
      在这里插入图片描述

    • 展示
      在这里插入图片描述

  • Nginx容器

    docker run -it -p 80:80 
    -v ./custom_web/static:/usr/share/nginx/html/static 
    -v ./custom_web/frontEnd:/usr/share/nginx/html/frontEnd 
    -v ./custom_web/media:/usr/share/nginx/html/upload 
    -v ./nginx/ssl:/usr/share/nginx/ssl 
    -v ./nginx/conf/conf.d:/etc/nginx/conf.d 
    605c77e624dd
    

    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

一文看懂数据仓库

数据仓库数据仓库的概念数据仓库的主要特征数据仓库的分层数据仓库的分层介绍原始数据层:ODS(Operational Data Store)数据仓库层:DW(Data Warehouse)数据明细层:DWD(Data Warehouse…

邪恶的想法冒出,立马启动python实现美女通通下

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 完整源码、python资料: 点击此处跳转文末名片获取 当我在首页刷到这些的时候~ 我的心里逐渐浮现一个邪念:我把这些小姐姐全都采集,可以嘛? 答案当然是可以的~毕竟就我这技术&#xff0c…

【Java|golang】45. 跳跃游戏 II

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j < n 返回到达 nums[n - 1] 的最…

不会写SQL?ChatGPT 来帮你

想必当前最火的软件就是ChaGPT了&#xff0c;它是一款基于人工智能技术的大型语言模型,在数据库方面&#xff0c;ChaGPT可以被用来进行自然语言处理&#xff0c;实现自然语言查询和分析数据库。通过将ChaGPT与数据库集成&#xff0c;可以使得数据库更加智能化&#xff0c;提高数…

【2023】Kubernetes-网络原理

目录kubernetes网络模型kubernetes网络实现容器到容器之间通信Pod之间的通信Pod到Service之间的通信集群内部与外部组件之间的通信开源容器网络方案FlannelCalicokubernetes网络模型 Kubernetes网络模型设计的一个基础原则是&#xff1a;每个Pod都拥有一个独立的IP地址&#x…

【Android -- 软技能】《软技能:代码之外的生存指南》之好书推荐(一)

前言 这是一本由美国的一个软件开发人员写的&#xff0c;但书中除了有 Java 、C# 几个单词外&#xff0c;没有一行代码。 因为这本书讲的是代码之外的东西。 文章目录结构&#xff1a; 1. 职业 从业心态&#xff1a;说白了就是要有责任心&#xff0c;把每份工作要当成是自…

【国产FPGA】国产FPGA搭建图像处理平台

最近收到了高云寄过来的FPGA板卡&#xff0c;下图&#xff1a;来源&#xff1a;https://wiki.sipeed.com/hardware/zh/tang/tang-primer-20k/primer-20k.htmlFPGA主要参数:FPGA型号参数GW2A-LV18PG256C8/I7逻辑单元(LUT4) 20736寄存器(FF) 15552分布式静态随机存储器S-SRAM(bit…

Python+Yolov5道路障碍物识别

PythonYolov5道路障碍物识别如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01;前言这篇博客针对<<PythonYolov5道路障碍物识别>>编写代码&#xff0c;代码整洁&#xff0c;规则&#xff0c;易读。 学习与…

蓝桥杯刷题冲刺 | 倒计时15天

作者&#xff1a;指针不指南吗 专栏&#xff1a;蓝桥杯倒计时冲刺 &#x1f43e;马上就要蓝桥杯了&#xff0c;最后的这几天尤为重要&#xff0c;不可懈怠哦&#x1f43e; 文章目录1.年号字串2.裁纸刀3.猜生日1.年号字串 题目 链接&#xff1a; 年号字串 - 蓝桥云课 (lanqiao.c…

Java 网络编程入门

文章目录一、网络编程入门1. 网络编程三要素2. IP 地址3. InetAddress4. 端口5. 协议二、UDP 通信程序1. UDP 发送数据2. UDP 接收数据3. UDP 案例三、TCP 通信程序1. TCP 发送数据2. TCP 接收数据3. 服务器给出反馈4. 客户端录入键盘数据5. 服务器数据写入文件6. 客户端数据来…

Ubuntu使用vnc远程桌面【远程内网穿透】

文章目录1.前言2.两台互联电脑的设置2.1 Windows安装VNC2.2 Ubuntu安装VNC2.3.Ubuntu安装cpolar3.Cpolar设置3.1 Cpolar云端设置3.2.Cpolar本地设置4.公网访问测试5.结语1.前言 记得笔者刚刚开始接触电脑时&#xff0c;还是win95/98的时代&#xff0c;那时的电脑桌面刚迈入图形…

C++三种继承方式

C继承的一般语法为&#xff1a;class 派生类名:&#xff3b;继承方式&#xff3d; 基类名{派生类新增加的成员};继承方式限定了基类成员在派生类中的访问权限&#xff0c;包括 public&#xff08;公有的&#xff09;、private&#xff08;私有的&#xff09;和 protected&#…

Python|蓝桥杯进阶第五卷——数论

欢迎交流学习~~ 专栏&#xff1a; 蓝桥杯Python组刷题日寄 蓝桥杯进阶系列&#xff1a; &#x1f3c6; Python | 蓝桥杯进阶第一卷——字符串 &#x1f50e; Python | 蓝桥杯进阶第二卷——贪心 &#x1f49d; Python | 蓝桥杯进阶第三卷——动态规划 ✈️ Python | 蓝桥杯进阶…

Linux基本命令

相比Windows系统而言&#xff0c;在一般的企业开发中&#xff0c;使用linux系统无疑是更加广泛的&#xff0c;因此掌握常见的linux基本命令于我们来说是必要的&#xff0c;本文就是对Linux基本命令的简单介绍。 ls 列出当前目录下&#xff0c;所包含的目录及文件&#xff1b; …

学习系统编程No.9【文件操作】

引言&#xff1a; 北京时间&#xff1a;2023/3/23/6:34&#xff0c;可能是昨天充分意识到自己的摆烂&#xff0c;所以今天起的比较早一点吧&#xff01;昨天摆烂的头号原因&#xff0c;笔试强训&#xff0c;加上今天4节课&#xff0c;可以说一整天都是课&#xff0c;所以能不能…

【CE进阶】lua脚本使用

▒ 目录 ▒&#x1f6eb; 导读需求开发环境1️⃣ 脚本窗口Lua ScriptLua EngineAuto assemble2️⃣ 全局变量3️⃣ 进程当前打开的进程ID系统的进程列表系统的顶部窗口列表4️⃣ 线程5️⃣ 输入设备6️⃣ 屏幕7️⃣ 剪贴板&#x1f6ec; 文章小结&#x1f4d6; 参考资料&#x…

算法的时间复杂度和空间复杂度

目录 1 如何衡量一个算法的好坏 2.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 2.3常见代码举例 2.3.1 Func2 O(N) 2.3.2 Func3 O(MN) 2.3.3 Func4 O(1) 2.3.4 Func5 strchr O(N) 2.3.5 Func6 冒泡排序 O(N^2) 2.3.6 Func7 二分…

菜鸟刷题Day6

⭐作者&#xff1a;别动我的饭 ⭐专栏&#xff1a;菜鸟刷题 ⭐标语&#xff1a;悟已往之不谏&#xff0c;知来者之可追 一.链表内指定区间反转&#xff1a;链表内指定区间反转_牛客题霸_牛客网 (nowcoder.com) 描述 将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转…

如何用深度强化学习做单元测试代码生成

设计一个用强化学习来生成单元测试代码的系统需要考虑以下几个方面&#xff1a; Agent&#xff1a;强化学习算法中的智能体&#xff0c;它需要接收当前环境状态&#xff0c;根据策略选择相应的动作并执行。 State&#xff1a;描述当前环境状态的特征。在这个问题中&#xff0c…

电脑长按电源键强行关机,对SSD有伤害吗?SSD 掉盘之殇

说到“按住电源键强制关机”的操作&#xff0c;想必大家都不会陌生&#xff0c;毕竟在电脑蓝屏或者电脑死机的时候&#xff0c;我们总是束手无策。而且&#xff0c;身边的人在遇到同样的情况时&#xff0c;往往都是选择长按电源键强制关机&#xff0c;所以当我们遇到同样的情况…