目录

    1. 目录结构

    • django-devops-uwsgi 目录是打包 uWSGI 和 Django 的镜像编译文件。在镜像中安装 uWSGI、pip、virtualenv等必要的程序包。
      在使用镜像创建容器时,执行 start.sh 脚本, 创建 Python 虚拟运行环境,从 Django 的 requirements.txt 安装依赖包,最后启动 uWSGI 监听端口,等待请求。
    • django-devops-compose/www/app 目录,用于放置 Django 的代码。需要说明的是:为了减少工程的目录层级,通过改造,将 url、settings 等与工程全局相关的文件移动到了根目录。
    • django-devops-compose/www/conf 目录,用于存放 uWSGI 配置和环境变量。这里的环境变量有 pip 源地址等。
    • django-devops-compose/www/env 目录用于存放 virtualenv 创建的 Python 虚拟环境。这是为了避免,每次启动容器时,都需要重新安装依赖包,加快容器启动时间。
    └── django-devops-uwsgi
    │   ├── Dockerfile
    │   └── start.sh
    ├── django-devops-compose
    │   ├── docker-compose.yml
    │   └── www
    │       ├── app
    │       │   ├── manage.py
    │       │   ├── requirements.txt
    │       │   ├── settings.py
    │       │   ├── static
    │       │   ├── urls.py
    │       │   ├── wsgi.py
    │       ├── conf
    │       │   ├── common.env
    │       │   ├── uwsgi.ini
    │       ├── env
    │       ├── log
    │       │   ├── mysql
    │       │   └── uwsgi
    

    2. Dockerfile

    镜像文件:django-devops-uwsgi/Dockerfile

    FROM centos:7
    
    RUN yum -y install epel-release
    
    RUN yum -y install gcc
    
    RUN yum -y install python-devel python-pip mysql-devel
    
    RUN pip install --upgrade pip
    
    RUN pip install  virtualenv
    
    RUN yum -y install pcre pcre-devel pcre-static
    
    RUN  yum  -y  clean all
    
    RUN mkdir /var/www
    
    COPY ./start.sh /
    
    RUN chmod +x /start.sh
    
    CMD ["/start.sh"]
    
    EXPOSE 8000
    

    启动脚本文件:django-devops-uwsgi/start.sh

    #!/usr/bin/bash
    
    echo "python virtual env ------ start"
    cd /var/www
    
    virtualenv ./env
    source ./env/bin/activate
    pip install uwsgi --index=http://${PYPI_SOURCE} --trusted-host ${PYPI_SOURCE%%/*}
    echo "python virtual env ------ end"
    
    echo "install requirements.txt ------ start"
    echo "pypi source, ${PYPI_SOURCE}"
    /var/www/env/bin/pip install -r /var/www/app/requirements.txt  --index=http://${PYPI_SOURCE} --trusted-host ${PYPI_SOURCE%%/*}
    echo "install requirements.txt ------ end"
    
    cd /var/www/app
    
    echo "syncdb ------ start"
    python manage.py syncdb
    echo "syncdb ------ end"
    
    echo "migrate ------ start"
    python manage.py migrate
    echo "migrate ------ end"
    
    echo "uwsgi ------ start"
    uwsgi --master --ini /var/www/conf/uwsgi.ini
    echo "uwsgi ------ end"
    

    docker-compose.yml 配置文件:django-devops-compose/docker-compose.yml

    version: '2'
    
    services:
    
        nginx:
          build: ../django-devops-nginx/
          volumes:
            - ./www/:/var/www/
          links:
            - uwsgi
          ports:
            - "80:80"
          expose:
            - "80"
    
        uwsgi:
          # image: djangodevops_uwsgi
          build: ../django-devops-uwsgi/
          privileged: true
          env_file:
            - ./www/conf/common.env
          volumes:
            - ./www/:/var/www/
          depends_on:
            - mysql
            # - redis
            # - rabbitmq
          links:
            - mysql
            # - redis
            # - rabbitmq
          ports:
            - "8000:8000"
          expose:
            - "8000"
    
        mysql:
          image: mariadb
          restart: always
          ports:
            - "3306:3306"
          expose:
            - "3306"
          volumes:
            - ./www/mysql/:/var/lib/mysql/
          environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=app
    

    环境变量文件:django-devops-compose/www/conf/common.env

    # Set environment
    # APP_NAME=app
    # DATABASE_NAME=app
    # MYSQL_USER=root
    # MYSQL_PASSWORD =
    PYPI_SOURCE=mirrors.aliyun.com/pypi/simple
    # PYPI_SOURCE=pypi.douban.com/simple
    

    uSWGI 配置文件:django-devops-compose/www/conf/uwsgi.ini

    [uwsgi]
    chmod-socket=666
    socket = uwsgi:8000
    chdir = /var/www/app/
    logto = /var/www/log/uwsgi/uwsgi.log
    module = wsgi:application
    py-autoreload = 1
    master = 1
    processes = 2
    threads = 2
    

    3. 常用的一些命令

    启动容器,Console 推出时,容器停止。

    docker   run -p 800:80 imagename
    

    后台启动容器,不占用 Console,后台运行。

    docker   run -d -p 800:80 imagename
    

    启动容器,并通过 ssh 登陆

    docker run -it --rm  imagename /bin/bash
    

    批量停止容器

    docker stop $(docker ps -q)
    

    批量重启容器

    docker restart $(docker ps -q)
    

    批量删除容器

    docker rm $(docker ps -a -q)
    

    批量删除:镜像

    docker rmi $(docker images -f "dangling=true" -q)
    

    批量删除镜像

    docker rmi $(docker images -q)