docker nginx uwsgi django python 组合配置
一. centos 7 安装及环境配置
- 正常安装centos7
- 更换yum源
- 关闭selinux
- 用firewall-cmd开启 ssh, 80, ssh更改过的端口
- 更改ssh默认端口
- 安装配置python3.7, django环境
- 安装docker
- 安装docker-compose
- 针对项目写Dockerfile文件和docker-compose.yml文件
- 写nginx.conf 和 uwsgi.ini
二. 本地装python, django
- 安装Python 3.7
- 安装准备工作:
- yum -y install gcc make zlib-devel bzip2-devel openssl-devel sqlite-devel readline-devel libffi-devel ncurses-devel tk-devel gdbm-devel xz-devel
- 下载python3.7.5源码包:
- wget https://www.python.org/ftp/python/3.7.5/Python-3.7.5.tgz
- 检查sqlite3的版本
- 要3.20以上: sqlite3 --verion
- 如果不是3.20以上, 下载源码包安装: wget https://www.sqlite.org/snapshot/sqlite-snapshot-201911030007.tar.gz
注意:在安装时我这里用了 ./configure --prefix=/usr/local/sqlite3 - 替换sqlite3:
mv /usr/bin/sqlite3 /usr/bin/sqlite3_3.7.17
ln -s /usr/local/sqlite3/bin/sqlite3 /usr/bin/sqlite3 - 在 .bashrc文件里加入:
export LD_LIBRARY_PATH="/usr/local/sqlite3/lib" 把lib库共享给python - 再次检查版本确认替换成功
在系统环境下: sqlite3 --version
在python交互模式下:
import sqlite3
sqlite3.sqlite_version
- 配置安装python:
- ./configure --prefix=/usr/local/Python37/
- make
- make install
- ln -s /usr/local/Python37/bin/python3.7 /usr/bin/python37
- ln -s /usr/local/Python37/bin/pip3.7 /usr/bin/pip37
- 本地配置pip源
- 在home目录mkdir .pip
- 在.pip目录下建立pip.conf文件
- 内容为:
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
[install]
trusted-host = mirrors.aliyun.com
- 设置virtulaenvs工作目录
- 在home目录下, mkdir .virtualenvs
- 在.bashrc文件里添加:
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/Python37/bin/virtualenvwrapper.sh - 在/etc/profile文件加入
VIRTUALENVWRAPPER_PYTHON=/usr/bin/python37 - ln -s /usr/local/Python/bin/virtualenv /usr/bin/virtualenv
- logout
- 安装准备工作:
- 安装django
- 新建环境: mkvirtualenv xxxx
- pip install django
- 新建项目
- mkdir /www
- 进入/www
- django-admin startproject xxx
至此, Python和django环境安装配置完整
三. 安装docker
- 安装一些必要的系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加软件源信息
# 阿里云源
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -
安装 Docker-ce
# 安装前可以先更新 yum 缓存:
sudo yum makecache fast
# 安装 Docker-ce
sudo yum install docker-ce -
启动 Docker 后台服务
$ sudo systemctl start docker
通过运行 hello-world 镜像,验证是否正确安装了 docker。 - 配置阿里镜像源
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://bxpcf41j.mirror.aliyuncs.com"]
} - systemctl daemon-reload
- systemctl restart docker
- docker run hello-world #测试docker是否安装成功
四. 安装Docker Compose
- 优化访问 github 速度
打开IPAddress.com网站,查询下面3个网址对应的IP地址 : github.com, assets-cdn.github.com, github.global.ssl.fastly.net
在/etc/hosts里添加解析后的ip和域名映射
重启network服务 curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose- ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
五. 容器及项目配置文件
- Dockerfile
在项目根文件夹下建立Dockerfile文件, 比如: /www
/www/Dockerfile内容为:
1. # 从仓库拉取 带有 python 3.7 的 Linux 环境 2. FROM python:3.7 3. # 设置 python 环境变量 4. ENV PYTHONUNBUFFERED 1 5. # 更改 Debian 华为镜像源 6. RUN cp -a /etc/apt/sources.list /etc/apt/sources.list.bak 7. RUN sed -i "s@http://ftp.debian.org@https://repo.huaweicloud.com@g" /etc/apt/sources.list 8. RUN sed -i "s@http://security.debian.org@https://repo.huaweicloud.com@g" /etc/apt/sources.list 9. RUN sed -i "s@http://deb.debian.org@https://repo.huaweicloud.com@g" /etc/apt/sources.list 10. RUN apt-get install apt-transport-https ca-certificates 11. RUN apt-get update 12. RUN apt-get install python3-dev default-libmysqlclient-dev -y 13. RUN apt-get update 14. RUN apt-get install python3-dev default-libmysqlclient-dev -y 15. # 创建 www文件夹并将其设置为工作目录 16. RUN mkdir /www 17. WORKDIR /www 18. # 更新 pip 19. RUN pip install pip -U -i https://pypi.douban.com/simple 20. # 将 requirements.txt 复制到容器的 www 目录 21. ADD requirements.txt /www/ 22. # 安装库 23. RUN pip install -r requirements.txt -i https://pypi.douban.com/simple 24. # 将当前目录复制到容器的 www 目录 25. ADD . /www/
- 在项目根文件夹下建立docker-compose.yml文件:
/www/docker-compose.yml
1 version: "3" 2 services: 3 app: 4 restart: always 5 build: . 6 command: bash -c "python3 cmdb/manage.py collectstatic --no-input && python3 cmdb/manage.py migrate && uwsgi --ini uwsgi/uwsgi.ini" 7 volumes: 8 - .:/www 9 - static:/www/cmdb/online_static 10 expose: 11 - "8000" 12 depends_on: 13 - db 14 networks: 15 - web_network 16 - db_network 17 db: 18 image: mysql:5.7 19 volumes: 20 - "./mysql:/var/lib/mysql" 21 expose: 22 - "3306" 23 restart: always 24 environment: 25 - MYSQL_ROOT_PASSWORD=cmdbpassword 26 - MYSQL_DATABASE=cmdb 27 networks: 28 - db_network 29 nginx: 30 restart: always 31 image: nginx:latest 32 ports: 33 - "80:80" 34 volumes: 35 - static:/www/cmdb/online_static 36 - ./nginx:/etc/nginx/conf.d 37 depends_on: 38 - app 39 networks: 40 - web_network 41 networks: 42 web_network: 43 driver: bridge 44 db_network: 45 driver: bridge 46 volumes: 47 static:
- nginx配置文件
/www/nginx/nginx.conf
1 upstream django{ 2 server app:8000; 3 } 4 5 server { 6 listen 80; 7 server_name localhost; 8 charset utf-8; 9 client_max_body_size 75M; 10 11 location /media { 12 alias /www/cmdb/media; 13 } 14 location /static { 15 alias /www/cmdb/online_static; 16 } 17 location / { 18 uwsgi_pass django; 19 include uwsgi_params; 20 } 21 }
- uwsgi配置文件
/www/uwsgi/uwsgi.ini
[uwsgi] env DJANGO_SETTINGS_MODULE=cmdb.settings chdir=/www/cmdb callable=app socket=0:8000 chmod-socket = 666 uid=root gid=root module=cmdb.wsgi:application master=true workers=5 processes=10 vacuum=true thunder-lock=true enable-threads=true harakiri=30 post-buffering=4096 buffer-size=65535
- requirements.txt 文件
/www/requirements.txt 内容:
django
mysqlclient
uwsgi - 更改/www/cmdb/cmdb/settings.py文件, 如下:
1 ALLOWED_HOSTS = ['*'] 2 3 DATABASES = { 4 'default': { 5 'ENGINE': 'django.db.backends.mysql', 6 'NAME': 'cmdb', 7 'USER': 'root', 8 'PASSWORD': 'cmdbpassword', 9 'HOST': 'db', 10 'PORT': '3306', 11 'OPTIONS': {'charset': 'utf8mb4'}, 12 } 13 } 14 15 LANGUAGE_CODE = 'zh-hans' 16 17 TIME_ZONE = 'Asia/Shanghai' 18 19 USE_TZ = False 20 21 STATIC_URL = '/static/' 22 23 STATIC_ROOT = os.path.join(BASE_DIR, 'collected_static') 24 25 MEDIA_URL = '/media/' 26 27 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
- 测试项目
docker-compose up
如果出现以下错误:
Docker报错 WARNING: IPv4 forwarding is disabled. Networking will not work.
解决方法如下:
# vim /usr/lib/sysctl.d/00-system.conf
添加如下代码:
net.ipv4.ip_forward=1
重启network服务
# systemctl restart network
完成以后,删除错误的容器,再次创建新容器,就不再报错了。
六. 出现经典的小火箭
七. 创建django admin 用户
在宿主机的/www目录下
docker-compose exec app python cmdb/manage.py createsuperuser
用户名 (leave blank to use 'root'): admin
电子邮件地址:
Password:
Password (again):
密码长度太短。密码必须包含至少 8 个字符。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.
登录django admin后台成功
至此, , 项目测试成功!
最后的最后
systemctl enable docker
最后的最后的最后
在app容器里, 配置pip阿里源
首先确定宿主机的/root/.pip/目录下有pip.conf文件
docker-compose exec app mkdir /root/.pip
docker cp ~/root/.pip.* www_app_1:/root/.pip/
设置3个容器的时区
查看 nginx服务器的时区是不是CST的: docker-compose exec nginx date
如果不是: docker-compose exec nginx cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
完美!

浙公网安备 33010602011771号