zoukankan      html  css  js  c++  java
  • Docker篇章11:django+uwsgi+redis+nginx+mysql用docker部署构建多容器

    1.docker构建mysql容器

    • 根目录新建文件

      mkdir -p /docker/mysql
      cd /docker/mysql
      
    • 创建如下四个文件:

      Dockerfile 为构建mysql镜像
      privileges.sql 用于注册用户,授权
      west_coast.sql 要导入的数据库及表
      setup.sh 构建shell脚本
      
    • Dockerfile编写

      FROM mysql:5.6
      
      ENV MYSQL_ALLOW_EMPTY_PASSWORD yes#免密模式
      COPY setup.sh /mysql/setup.sh#将setup.py复制到容器内
      COPY west_coast.sql /mysql/west_coast.sql#将west_coast.sql复制到容器内
      COPY privileges.sql /mysql/privileges.sql#将privileges.sql复制到容器内
      CMD ["sh", "/mysql/setup.sh"]#执行脚本setup.sh
      
      
    • setup.sh

      #!/bin/bash
      
      set -e#告诉bash如果任何语句的执行结果不是true则应该退出。
      echo `service mysql status`
      
      echo '1.启动mysql....'
      #启动mysql
      service mysql start
      sleep 3
      echo `service mysql status`
      
      echo '2.开始导入数据....'
      #导入数据
      mysql < /mysql/west_coast.sql
      echo '3.导入数据完毕....'
      
      sleep 3
      echo `service mysql status`
      
      #重新设置mysql密码
      echo '4.开始修改密码....'
      mysql < /mysql/privileges.sql
      echo '5.修改密码完毕....'
      
      #sleep 3
      echo `service mysql status`
      echo `mysql容器启动完毕,且数据导入成功`
      
      tail -f /dev/null
      
    • privileges.sql

      use mysql;#切换数据库myql
      select host,user from user;
      create user root identified by '123456';#创建root用户
      grant all on west_coast.* to root@'%' identified by '123456' with grant option;#授权root用户west_coast权限
      flush privileges;
      
    • west_coast.sql 为mysqldump的表和数据

    • 构建镜像

      docker build -t ws/mysql5.6 .
      
    • 启动容器

      docker run -d -p 12345:3306  -e MYSQL_ROOT_PASSWORD=123456 ws/mysql5.6
      
    • 查看日志

      docker logs 容器ID
      

    2.docker构建redis容器

    • 拉取基础镜像

      docker pull redis:3.2
      
    • 运行容器

      docker run -p 6379:6379 -v /xujunkai/myredis/data:/data -v /xujunkai/myredis/conf/redis.conf:/usr/local/etc/redis/redis.conf -d redis:3.2 redis-server /usr/local/etc/redis/redis.conf --appendonly yes
      # --appendonly yes 开启持久化
      
    • 编辑redis配置

      vim /xujunkai/myredis/conf/redis/conf/redis.conf
      
    • 启动redis客户端

      docker exec -it 容器id redis-cli
      

    3.单容器下构建dajngo+uwsgi镜像

    (centos下载docker以及配置可翻阅前面的随笔),这里直接从拉取镜像说了

    • 拉取python3.6镜像

      docker pull python:3.6
      
    • 根目录新建文件

      mkdir -p /docker/webapp
      cd /docker/webapp
      
    • 目录下放置

      west_coast__company_project.tar.gz #项目打包目录
      Dockerfile #dockerfile编写
      pip.conf # pip源配置 
      run.sh # 运行项目
      
    • 这里我提前将项目相关配置已配置好

      west_coast__company_project.tar.gz目录结构
      west_coast__company_project
      	|——————requirements.txt#依赖
      	|——————app
      	|______....
      	|______west_coast__company_project
      			|______settings.py
              	 |______uwsgi.ini
      			|______....
      

      settings更改

      DATABASES = {
          "default": {
              "ENGINE": "django.db.backends.mysql",
              "NAME": "west_coast",
              "PORT": 连接数据库端口,
              "HOST": "10.0.0.131",#连接mysql容器ip
              "USER": "数据库用户名",
              "PASSWORD": "数据库密码",
          }
      }
      ALLOWED_HOSTS = ["*"]
      DEBUF=False
      CACHES = {
          "default": {
              "BACKEND": "django_redis.cache.RedisCache",
              "LOCATION": "redis://10.0.0.131:6379",#连接redis容器ip
              "OPTIONS": {
                  "CLIENT_CLASS": "django_redis.client.DefaultClient",
                  "CONNECTION_POOL_KWARGS": {"max_connections": 1000}
              },
          }
      }
      

      uwsgi.ini

      [uwsgi]
      # Django-related settings
      # the base directory (full path)
      # 指定项目的绝对路径的第一层路径(很重要)
      chdir = /opt/west_coast__company_project
      
      # Django's wsgi file
      # 指定项目的 wsgi.py文件
      # 写入相对路径即可,这个参数是以chdir参数为相对路径
      module = west_coast__company_project.wsgi
      master = true
      processes = 1
      # 这里直接使用uwsgi做web服务器,使用http。如果使用nginx,需要使用socket沟通。
      # socket = 0.0.0.0:9000
      http = 0.0.0.0:9000
      workers = 2
      # ... with appropriate permissions - may be needed
      # chmod-socket    = 664
      # clear environment on exit
      vacuum = true
      # daemonize = uwsgi.log
      
      #设置一个请求的超时时间(秒),如果一个请求超过了这个时间,则请求被丢弃
      harakiri=60
      #当一个请求被harakiri杀掉会,会输出一条日志
      harakiri-verbose=true
      
    • pip.conf 阿里源配置

      [global]
      index-url = http://mirrors.aliyun.com/pypi/simple/
      [install]
      trusted-host=mirrors.aliyun.com
      
      
    • run.sh

      #!/bin/bash
      # 从第一行到最后一行分别表示:
      # 1. 生成数据库迁移文件
      # 2. 根据数据库迁移文件来修改数据库
      # 3. 用 uwsgi启动 django 服务, 不再使用python manage.py runserver
      python3 manage.py makemigrations && python3 manage.py migrate && uwsgi --ini /opt/west_coast__company_project/west_coast__company_project/uwsgi.ini
      
    • Dockerfile

      FROM python:3.6#建立环境3.6
      MAINTAINER xujunkai<xujunkaipy@163.com>
      ENV PYTHONUNBUFFERED 1#设置 python 环境变量
      COPY pip.conf /root/.pip/pip.conf#将源拷贝到容器内
      
      ADD west_coast__company_project.tar.gz /opt/#将项目拷贝并解压到容器内
      COPY run.sh /opt/west_coast__company_project/run.sh#将执行脚本拷贝到容器内
      
      
      RUN pip3 install -r /opt/west_coast__company_project/requirements.txt#依赖包下载
      
      WORKDIR /opt/west_coast__company_project#转到工作目录
      
      CMD ["sh","run.sh"]#执行run.sh脚本
      
      
    • 构建镜像,在webapp目录下构建镜像

      docker build -t django_uwsgi:v1 .
      
    • 启动容器

      docker run -d -p 8080:9000 django_uwsgi:v1
      
    • 查看运行容器状态

      docker ps
      

    • 此时访问接口,成功

    django+uwsgi+nginx+redis+mysql多容器部署

    • 之前已经配置好django+uwsgi镜像,redis镜像,mysql镜像。现在只需构建nginx镜像

    • 先更高uwsgi.ini

      socket=0.0.0.0:9000
      #再构建镜像,然后跑容器
      
    • 创建文件夹

      mkdir -p /docker/nginxdf
      cd /docker/nginxdf
      
    • 拉取nginx基础镜像

      docker pull nginx
      
    • 当前目录下构建镜像准备如下文件

      phone.tar.gz #vue打包静态文件 手机端
      web.tar.gz #vue打包静态文件 pc端
      nginx 为 nginx配置
      Dockerfile 构建nginx镜像
      
    • Dockerfile信息

      FROM nginx:latest
      RUN rm /etc/nginx/conf.d/default.conf# 删除原有配置文件
      #将静态文件添加容器内,并解压
      ADD phone.tar.gz /opt/
      ADD web.tar.gz /opt/
      # 添加配置文件
      ADD nginx.conf /etc/nginx/conf.d/
      # 关闭守护模式
      CMD ["nginx","-g","daemon off;"]
      
    • nginx.conf配置

      server {
              listen       80 default_server;
              listen       [::]:80 default_server;
              server_name  localhost;
              root         /usr/share/nginx/html;
      
              # Load configuration files for the default server block.
              include /etc/nginx/default.d/*.conf;
      
              location / {
      		root /opt/web/dist;
                      if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" )
      {
      root /opt/phone/dist;
      }
      		index index.html;
      		try_files $uri $uri/ /index.html; 
              }
      	location ~.*(jpg|jpeg|png|gif|ico|css|js)$ {
                      root /opt/web/dist;
                      if ( $http_user_agent ~ "(MIDP)|(WAP)|(UP.Browser)|(Smartphone)|(Obigo)|(Mobile)|(AU.Browser)|(wxd.Mms)|(WxdB.Browser)|(CLDC)|(UP.Link)|(KM.Browser)|(UCWEB)|(SEMC-Browser)|(Mini)|(Symbian)|(Palm)|(Nokia)|(Panasonic)|(MOT-)|(SonyEricsson)|(NEC-)|(Alcatel)|(Ericsson)|(BENQ)|(BenQ)|(Amoisonic)|(Amoi-)|(Capitel)|(PHILIPS)|(SAMSUNG)|(Lenovo)|(Mitsu)|(Motorola)|(SHARP)|(WAPPER)|(LG-)|(LG/)|(EG900)|(CECT)|(Compal)|(kejian)|(Bird)|(BIRD)|(G900/V1.0)|(Arima)|(CTL)|(TDG)|(Daxian)|(DAXIAN)|(DBTEL)|(Eastcom)|(EASTCOM)|(PANTECH)|(Dopod)|(Haier)|(HAIER)|(KONKA)|(KEJIAN)|(LENOVO)|(Soutec)|(SOUTEC)|(SAGEM)|(SEC-)|(SED-)|(EMOL-)|(INNO55)|(ZTE)|(iPhone)|(Android)|(Windows CE)|(Wget)|(Java)|(curl)|(Opera)" )
      {
      root /opt/phone/dist;
      }
      		expires 365d;  
      	}
              error_page 404 /404.html;
                  location = /40x.html {
              }
      
              error_page 500 502 503 504 /50x.html;
                  location = /50x.html {
              }
          }
          server {
      	listen 8000;
              #这里监听8000端口传172.17.0.4:9000
              # 172.17.0.4是容器django-uwsgi对外暴漏的端口,不是宿主机的端口,通过 docker inspect 容器ID | grep "IPAddress" 可以查询ID
      	server_name 172.17.0.4;
              location / {
      	    uwsgi_pass 172.17.0.4:9000;#转发请求
      	    include    uwsgi_params;
      		}
          }
      
      
    • /docker/nginxdf目录下镜像构建

      docker build -t ws/nginx:v1 .
      
    • 运行容器

      #80为本地静态路径前端展示,8000用于访问后端接口
      docker run -d -p 80:80 -p 8000:8000 ws/nginx:v1
      
    • 此时访问10.0.0.131就OK了

    • 这样一个一个构建镜像,再一个一个去手动创建容器并记录和配置这些复杂的容器关系,不仅效率低下而且容易出错,下一期用docker-compose工具管理多容器

  • 相关阅读:
    原生JS实现简易随机点名功能
    react 字父组件传值
    关于react组件传值问题
    轮波图
    烟花
    this的详解
    封装多元素多属性的链式缓冲
    留言板设计的流程,拖动窗口
    运动的小球
    运动的小球自动变键盘控制
  • 原文地址:https://www.cnblogs.com/xujunkai/p/13038902.html
Copyright © 2011-2022 走看看