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工具管理多容器

原文地址:https://www.cnblogs.com/xujunkai/p/13038902.html