绿联NAS docker 绿联nas docker compose

admin2024-06-04  12


文章目录

  • 什么是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
  4. 绿联NAS docker 绿联nas docker compose,绿联NAS docker 绿联nas docker compose_运维,第1张


卸载

绿联NAS docker 绿联nas docker compose,绿联NAS docker 绿联nas docker compose_容器_02,第2张

Compose核心概念

一文件

  • docker-compose.yml

两要素

  • 服务(service)

一个个应用容器实例,比如订单微服务、库存微服务、mysql容器、nginx容器或者redis容器

  • 工程(project)

由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

三个步骤

  • 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
  • 使用 docker-compose.yml 定义一个完整业务单元,安排好整体应用中的各个容器服务。
  • 最后,执行docker-compose up命令 来启动并运行整个应用程序,完成一键部署上线

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
   _name: featech_redis
    command: redis-server
    volumes:
      - ./deployment/redis/data:/data  # 挂载数据库数据文件夹
    ports:
      - "6373:6379"
    restart: always # always表容器运行发生错误时一直重启
  
  db:
    image: mysql:5.7
   _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: .
   _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
   _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
   _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

绿联NAS docker 绿联nas docker compose,第3张" title=">" style="width: 600px; visibility: visible;" data-type="block">

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

绿联NAS docker 绿联nas docker compose,绿联NAS docker 绿联nas docker compose_容器_04,第4张

redis容器

对外暴露6373

绿联NAS docker 绿联nas docker compose,绿联NAS docker 绿联nas docker compose_redis_05,第5张

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

绿联NAS docker 绿联nas docker compose,绿联NAS docker 绿联nas docker compose_运维_06,第6张

  • 构建
  • 启动
  • 展示
  • 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

绿联NAS docker 绿联nas docker compose,绿联NAS docker 绿联nas docker compose_运维_07,第7张

绿联NAS docker 绿联nas docker compose,绿联NAS docker 绿联nas docker compose_运维_08,第8张


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!