docker部署:nginx+uwsgi+django+postgresql

docker部署:nginx+uwsgi+django+postgresql,第1张

目录
  • 一、概述
  • 二、安装docker桌面管理器
  • 三、常用命令
    • 3.1 docker命令
    • 3.2 镜像命令
    • 3.3 容器命令
  • 四、DockerFile编写
    • 4.1 前置
    • 4.2 构建自定义镜像
  • 五、容器集群管理
    • 5.1 docker-compose概述
    • 5.2 部署
      • 5.2.1 后端django项目详解
      • 5.2.2 前端及nginx配置
      • 5.2.3 postgresql配置
    • 5.3 docker-compose.yml文件详解
      • 5.3.1 文件内容
    • 5.4 命令

一、概述
  • 简介:Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux或Windows *** 作系统的机器上,简而言之,docker可以实现以应用为核心的最精简虚拟机
  • 名词解释
    • 守护进程:Docker Daemon
    • 镜像:重点,Docker Image,类似于面向对象中的类
    • 容器:重点,DockerContainer,类似于面向对象中的类实例(对象)
二、安装docker桌面管理器
  • centos安装:

    # 安装docker
    yum install docker -y
    # 启动|关闭|重启docker服务
    systemctl start|stop|restart docker
    # 开机启动docker
    systemctl  enable docker
    # 查看docker当前状态
    systemctl status docker
    # 测试docker是否正确安装及功能完备
    docker run hello-world
    
  • mac安装、win10desktop安装:传送门

  • docker镜像仓库:传送门,创建账号和镜像版本标签(tag)处

  • 界面

    阿里云docker镜像加速网址获取参照点此处

三、常用命令 3.1 docker命令
  • 命令
    # 获取docker版本
    docker version
    # 详细信息,包括容器信息
    docker info
    # 测试docker是否正确安装及功能完备
    docker run hello-world
    
3.2 镜像命令
  • 命令
    # 现实镜像列表
    docker images
    # 拉取nginx镜像:pull 镜像名:版本号,
    # 省略版本号即为latest,镜像都自带系统
    docker pull nginx:1.20
    # 删除镜像
    # docker rmi nginx:1.20
    
  • 镜像版本tag查询
3.3 容器命令
  • 创建及查询容器
    # 创建并启动容器: 
    # -d: 后台运行  
    # -i:容器开启交互接口,若容器内无循环逻辑,则立即exit
    # --name: 容器别名
    # -p: 映射端口,宿主端口:容器虚拟机端口,多映射写法-p x:x -p x:x
    # 构建容器的最底层镜像:镜像:版本号,若本机没有,docker自动pull
    docker run -id --name nginx_test -p 8080:80 nginx:1.20
    
    # docker容器运行必须有一个前台进程, 如果没有前台进程执行,容器
    # 认为空闲,就会自行退出,-i(容器开启交互接口)
    docker run -id --name python3 python:3.8
    
    # 显示已启动的容器详情列表,-a可以显示包括关闭的容器
    # 各列说明见下表
    docker ps [-a]
    
  • docker ps结果
    表头数据释义
    CONTAINER IDaa67260f166d自动分配容器序号
    IMAGEnginx:1.20镜像
    COMMAND“/docker-entrypoint.…”容器启动后立即执行的命令、脚本
    CREATED4 minutes ago容器创建时间
    STATUSUp 4 minutes容器状态:created(已创建)restarting(重启中)running(运行中)removing(迁移中)paused(暂停)exited(停止)dead(死亡)
    PORTS0.0.0.0:8080->80/tcp容器端口映射,宿主端口=>容器端口/协议
    NAMESnginx_test容器别名
  • 容器运维 *** 作
    # 容器名:可以用别名,也可以用序号,位数能区分容器即可
    # 重启容器:取序号前两位,位数能区分容器即可
    docker restart aa
    # 关闭容器:取容器别名
    docker stop nginx_test
    # 开启容器:取容器前一位
    docker start a
    
    # 进入容器内:
    # exec:退出容器,不关闭容器
    # -i(容器开启交互接口),-t(创建伪终端)
    # aa6: 容器序号前三位
    # /bin/bash:进入容器后启动的shell
    docker exec -it aa6 bash
    # 退出伪终端命令为:exit
    
    # 删除容器,配合docker ps -a使用
    # docker rm aa
    
四、DockerFile编写

范例:封装uwsgi和Django项目到一个镜像里

4.1 前置
  • 文件结构
  • uwsgi.ini
    [uwsgi]
    # 版本为2.0.20,以下为必要设置,其他采用默认
    # 启动一个主程序管理其他进程
    master=true
    # 进程数:2倍cpu核心数,跟worker
    processes = 2
    # 每个进程中开启线程数
    threads=2
    # 通信接口:直接作为web服务器使用,注意IP
    # 也可写为0:2048,表示对访问的IP无限制
    # socket接口:跟nginx配合使用,监听本机2048端口
    #            socket=0.0.0.0:2048
    http=0.0.0.0:2048
    
    # 项目启动后的根目录
    chdir=/home/www/backend
    # uwsgi服务器进入Django项目的入口
    # 绝对路径:/home/www/backend/main/wsgi.py
    module = main.wsgi:application
    # pid文件,通过其可以控制uwsgi服务器的停止和重启
    pidfile=uwsgi.pid
    # 日志存放位置,根目录下,用daemonize设置有问题
    logto=uwsgi.log
    
    # 服务器退出时自动删除socket和pid文件
    vacuum=true
    # 日志最大大小
    log-maxsize=50000
    # 每个进程最多请求数,达到立即回收重用此进程
    max-requests=1000
    # 前后端传输数据大小:单位kb,要是文件上传下载需要注意此处
    buffer-size = 65536
    
  • Dockerfile
    FROM python:3.8
    MAINTAINER chuck<******@qq.com>
    
    WORKDIR /home/www/backend
    ADD . /home/www/backend
    
    RUN pip install -r requirements.txt  \
    				-i http://pypi.douban.com/simple \
    				--trusted-host pypi.douban.com \
    	&&pip install uwsgi \
    				-i http://pypi.douban.com/simple \
    				--trusted-host pypi.douban.com 
    
    ENTRYPOINT  /usr/local/bin/uwsgi --ini /home/www/backend/uwsgi.ini
    
  • 注释
    Dockerfile中不可有注释
    
    FROM:后接构建自定义镜像的模板镜像
    MAINTAINER:维护者
    
    WORKDIR:指定后续语句的工作目录,相当于cd命令,docker exec进入的也是此文件夹
    ADD:拷贝宿主机文件到镜像,宿主机若为路径如:/home/www,则仅拷贝其中文件到
         镜像文件夹内,优势是源文件是压缩文件,此命令会先解压再拷贝进镜像
    RUN:构建镜像,在镜像内运行的命令,每个RUN在镜像中生成一层,效率与层数成反比,
         用此种写法,仅生成一层,多个命令写法
    ENTRYPOINT:使用此镜像,docker run命令生成容器,容器启动后第一个执行的语句
    
4.2 构建自定义镜像
  • 命令
    cd 父目录/project
    # -t后面接的是 镜像名:版本号,别落了最后的点儿
    # 点号:是指镜像构建时打包上传到Docker引擎中的文件的目录
    docker build -t django:v1.0 .
    # 查看镜像创建情况
    docker images
    # 创建自定义镜像的容器:请求在端口流转,宿主2000=>docker中uwsgi的2048端口=>
    # 通过uwsgi配置文件传给main/wsgi.py,进而进入Django项目
    docker run -id --name django_v1.0 -p 2000:2048 django:v1.0
    # 可进入运行中的容器,退出的容器可以`docker log 容器序号`查看原因
    docker exec -it django_v1.0 bash
    
五、容器集群管理 5.1 docker-compose概述
  • 功能:用于管理多容器协同,包括存储、网络、启动调度等
5.2 部署
  • 文件布局
5.2.1 后端django项目详解
  • settings.py
    """
    ...
    # 开启生产环境
    DEBUG = False
    ...
    # 开启访问白名单
    ALLOWED_HOSTS = ['*']
    ...
    # 此处设置postgresql参数
    DATABASES = {
        'default': {
        	# 此模块要pip install psycopg2-binary
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            # 以下在docker-compose.yml中设置
            'NAME': 'postgres',
            'USER': 'postgres',
            'PASSWORD': 'postgres',
            # 在yml文件中,db为数据库所在虚拟机的IP
            'HOST': 'db',
            'PORT': '5432',
        }
    }
    ...
    # 此处是关闭跨域访问限制
    CORS_ALLOW_ALL_ORIGINS = True
    ...
    
  • requirements.txt
    pip install psycopg2-binary
    pip freeze > requirements.txt
    
  • uwsgi.ini
    [uwsgi]
    master=true
    processes = 2
    threads=2
    # 此处用socket,nginx会使用uwsgi_params模块
    # 进入uwsgi服务器
    socket=0.0.0.0:2048
    
    chdir=/home/www/backend
    # uwsgi服务器从此处进入Django项目
    module = main.wsgi:application
    pidfile=uwsgi.pid
    logto=uwsgi.log
    
    vacuum=true
    log-maxsize=50000
    max-requests=1000
    buffer-size = 65536
    
  • Dockerfile
    FROM python:3.8
    MAINTAINER chuck<******@qq.com>
    
    WORKDIR /home/www/backend
    ADD . /home/www/backend
    
    RUN pip install -r requirements.txt  \
    				-i http://pypi.douban.com/simple \
    				--trusted-host pypi.douban.com \
    	&&pip install uwsgi \
    				-i http://pypi.douban.com/simple \
    				--trusted-host pypi.douban.com
    
    ENTRYPOINT  /usr/local/bin/uwsgi --ini /home/www/backend/uwsgi.ini
    
5.2.2 前端及nginx配置
  • 虚拟机中/etc/nginx/conf.d/nginx.conf
    server {
        listen 80;
        server_name  192.168.3.5;
        location / {
            include uwsgi_params;
            uwsgi_pass django:2048;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/share/nginx/html;
        }
    }
    

    include: nginx自带uwsgi模块,django为前端服务器的IP,yml中指定

  • Dockerfile
    FROM nginx:1.20
    MAINTAINER chuck<******@qq.com>
    
    ADD ./nginx.conf /etc/nginx/conf.d/nginx.conf
    

    功能:只是将文件加入服务器中,其他采用镜像默认配置

5.2.3 postgresql配置
  • 新建空的目录:www/postgres,用于后续挂载数据库中数据文件夹的位置
5.3 docker-compose.yml文件详解
  • 位置:后续docker-compose命令必须在此文件同级目录执行
5.3.1 文件内容
  • docker-compose.yml文件内容
    # yml格式版本:跟docker engine版本相对应
    version: '3'
    # 服务:每一个对应一个容器
    services:
      # 服务名:随便起,也为容器IP地址别名,即nginx对应172.3.2.1这样
      nginx:
      	# 此容器镜像通过./frontend/Dockerfile创建
        build: ./frontend
        # 启动的容器名:对应docker run --name 这项
        container_name: nginx_OA
        # 若关闭,自动重启,前提是docker守护进程在运行,即docker开着
        restart: always
        # 端口暴露:对应docker run -p 这项
        ports:
          - 80:80
          - 443:443
    	# 给另一个服务的容器的IP设置别名,此处django对应
    	# 容器django_OA的IP,单一网络中直接用服务名即可
    	# 此项较少用,
        links:
          - "backend:django"
    	# 设置容器启动依赖关系:此项仅限制各服务的启动次序,
    	# 不代表backend启动完成再启动nginx,若要完成后再启动
    	# 官网有wait-for的command的相关设置
        depends_on:
          - backend
      backend:
        build: ./backend
        container_name: django_OA
        restart: always
        # 此处只写一个,即指定宿主机任意端口绑定此容器的2048端口,
        # 实质是仅将此端口暴露给内部容器使用,不给宿主机用
        ports:
          - 2048
        depends_on:
          - db
      db:
      	# 此处仅制定镜像,即docker拉取镜像创建,不用docker build
        image: postgres:12.10
        container_name: postgres_OA
        restart: always
        ports:
          - 5432:5432
    	# 设定环境变量:数据库名、用户名、密码、时区,给Django的
    	# setting进行对应设置
        environment:
          - POSTGRES_DB=postgres
          - POSTGRES_USER=postgres
          - POSTGRES_PASSWORD=postgres
          - TZ=Asia/Shanghai
    	# 挂载卷:
    	# 	1、功能:将postgresql的数据卷挂载到宿主机对应目录下
    	# 	2、docker命令:对应`docker run -v 宿主机目录:容器内目录`
    	#	3、特性:默认宿主机目录(不管是否为空)覆盖(而非删除)容器目录;数据库镜像此
    	# 设置特殊,经测试宿主机为空目录,会被容器目录反向拷贝填满,但若宿主机目录非空,则
    	# 宿主机目录覆盖容器目录
    	# 	4、数据持久性:两目录数据同步,停止甚至销毁容器,宿主目录不变,可多容器绑定
    	# 同一宿主目录
        volumes:
          - ./www/postgres:/var/lib/postgresql/data
    
5.4 命令
  • 命令
    # 以下命令均需要在yml文件所在目录中运行
    # 侦测yml文件中build项,镜像有更新需要主动运行此命令
    docker-compose build
    # 首次运行会调用docker build和docker run针对每个容器
    # -d:可选项,为后台运行,建议先不带看运行详情,没问题再-d
    docker-compose up [-d]
    # 停止并删除yml管理的容器,包含挂载的卷volume,不删镜像
    docker-compose down
    # 启动、停止、重启服务容器集群
    docker-compose start|stop|restart
    
  • django数据库迁移
    # 容器集群启动起来后需要做Django项目数据库迁移
    docker exec -it django_OA bash
    > python manage.py makemigrations
    > python manage.py migrate
    > python manage.py createsuperuser
    
  • debug用命令
    # 查看挂载卷信息
    docker volume ls 
    # 删除挂载卷:卷标上条命令
    docker volume rm 卷序号
    # 打印容器输出日志:序号获取 docker ps -a
    docker logs 容器序号
    

跳转至:宝塔版nginx+uwsgi+django+vue

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/867245.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-12
下一篇 2022-05-12

发表评论

登录后才能评论

评论列表(0条)

保存