【Docker】Compose容器编排LNMP上云

news/2024/11/24 13:42:40/

文章目录

    • 什么是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容器名称,切记不要写域名或者ipproxy_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:3container_name: featech_rediscommand: redis-servervolumes:- ./deployment/redis/data:/data  # 挂载数据库数据文件夹ports:- "6373:6379"restart: always # always表容器运行发生错误时一直重启db:image: mysql:5.7container_name: featech_dbports:- "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-8command: ['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- mongolinks:- db- redis- mongovolumes:- ./featech_v2_0:/featech_v2_0  # 挂载项目目录restart: alwaysports:- "8888:8888"nginx:build: deployment/nginxcontainer_name: featech_nginxports:- "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:- webdepends_on:- webrestart: alwaysmongo:image: mongo:4.0container_name: featech_mongohostname: mongorestart: alwaysports:- "27013:27017"environment:TZ: Asia/Shanghai#MONGO_INITDB_DATABASE: test#MONGO_INITDB_ROOT_USERNAME: root#MONGO_INITDB_ROOT_PASSWORD: 123456volumes:- /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.txtCMD ["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
    

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


http://www.ppmy.cn/news/34956.html

相关文章

css学习14(多媒体查询)

目录 多媒体查询 语法 示例代码 通用媒体查询 媒体功能参考列表 多媒体查询 CSS的媒体查询是一种CSS的技术,它可以根据不同的设备类型、屏幕尺寸、方向、分辨率等条件来应用不同的CSS样式,从而为不同的设备和屏幕提供最佳的浏览体验。这样&#xff…

这几个SQL语法的坑,你踩过吗

本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校招社招分享等核心知识点,欢迎star~ Github地址:https://github.com/…

Kafka系列——深入理解Kafka集群成员,控制器以及复制功能

集群成员关系 Kafka 使用 Zookeeper 来维护集群成员的信息。每个 broker 都有一个唯一标识符,这个标识符可以在配置文件里指定,也可以自动生成。 在 broker 启动的时候,它通过创建临时节点把自己的 ID 注册到 Zookeeper。 Kafka 组件订阅 Zoo…

78.qt QCustomPlot介绍

参考https://www.qcustomplot.com/index.php/tutorials/settingup 下载地址: https://www.qcustomplot.com/index.php/download 1.添加帮助文档 在QtCreator ——>工具——>选项——>帮助——>文档——>添加,选择qcustomplot.qch文件,确定,以后按F1就能跳转到…

chatGPT测试:angular 8以上,word转pdf的组件生成

User:帮我写一个angular 8以上,word转pdf的组件 assistant: 好的,下面是一个示例 Angular 8 组件,使用docx-to-pdf库将Word文档转换为PDF格式。 首先,你需要安装以下两个库: 1. docx-to-pdf: 用于将 Word 文档转换为…

vue基础知识大全

1,指令作用 以v-开头,由vue提供的attribute,为渲染DOM应用提供特殊的响应式行为,也即是在表达式的值发生变化的时候响应式的更新DOM。其内容为可以被求值的js代码,可以写在return后面被返回的表达式。 指令的简写指令简…

【C语言】柔性数组

柔性数组1. 柔性数组介绍2. 柔性数组特点3. 用例3.1 代码一:3.2 代码二:4. 柔性数组优势:1. 柔性数组介绍 也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。 C99 中&#xff0c…

【数据结构】用栈实现队列

💯💯💯 本篇总结利用栈如何实现队列的相关操作,不难观察,栈和队列是可以相互转化的,需要好好总结它们的特性,构造出一个恰当的结构来实现即可,所以本篇难点不在代码思维,…