docker部署django項目、mysql主從搭建、django實現讀寫分離

目錄

 

我們使用python鏡像源構建的出的容器,是一個純淨的debian系統下的python環境,在容器內部要想安裝vim、nginx等,就不能使用yum install ...了,需要使用apt-get源。首先更新apt-get源,使用apt-get update ,之後就可以使用apt-get install ...了。

docker部署django項目

1.1 基於python基礎鏡像

將本地django項目打包併發到遠程服務器上

本機是Windows系統,現在要將本機的一個django項目部署到遠程的服務器上。
1.先將本地的django文件壓縮成.zip格式的壓縮包。
2.使用xshell遠程連接服務器,在服務器上的/home/路徑下創建一個文件夾名爲test_project的文件夾,cd到該文件夾內;
3.直接將django的壓縮包拖到xshell中。# 發現一直上傳不成功,上網查詢,發現需要在服務器端安裝一個包lrzsz,直接使用yum install lrzsz  命令安裝,之後再次拖曳就能上傳到我們cd的文件夾了,具體如下圖。

將服務器上的.zip django項目解壓

安裝unzip、和zip 包
yum install -y unzip zip

# 解壓django項目
unzip  myproject.zip 

部署的具體流程

# 前臺運行一個python容器、端口映射及目錄掛載
docker run -di --name=myproject -p 8080:8080 -v /home/myproject:/home python:3.6
# 進入容器I 
docker exec -it myproject /bin/bash
# 切到項目路徑下:安裝依賴
pip install -r requirement.txt -i https://pypi.douban.com/simple/
# pip list  
apt-get update
apt-get vim
# setting.py 改成下面
ALLOWED_HOSTS = ['*']
# 運行項目(wsgiref)
python manage.py runserver 0.0.0.0:8080
# 換uwsgi跑
pip install uwsgi
# 在項目根路徑下創建一個uwsgi.ini 文件,寫入

[uwsgi]
#配置和nginx連接的socket連接
socket=0.0.0.0:8080
#也可以使用http
#http=0.0.0.0:8080
#配置項目路徑,項目的所在目錄
chdir=/home/django_test
#配置wsgi接口模塊文件路徑
wsgi-file=django_test/wsgi.py
#配置啓動的進程數
processes=4
#配置每個進程的線程數
threads=2
#配置啓動管理主進程
master=True
#配置存放主進程的進程號文件
pidfile=uwsgi.pid
#配置dump日誌記錄
daemonize=uwsgi.log


#啓動,停止,重啓,查看
uwsgi --ini uwsgi.ini #啓動
lsof -i :8001    #按照端口號查詢
ps aux | grep uwsgi   #按照程序名查詢
kill -9 13844       #殺死進程
uwsgi --stop uwsgi.pid      #通過uwsg停止uwsgi
uwsgi --reload uwsgi.pid  #重啓

# nginx轉發

mkdir -p nginx/conf nginx/html nginx/logs

在conf目錄下新建nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
          #uwsgi_pass 101.133.225.166:8080;
          proxy_pass http://101.133.225.166:8080;
        }  
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

docker run --name nginx -id -p 80:80 -v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /home/nginx/html:/etc/nginx/html -v /home/nginx/logs:/var/log/nginx nginx

# 在 python的docker中用uwsgi跑起項目來即可

外部訪問:http://101.133.225.166/

基於wsgiref:

向django後臺發送請求:

後臺的views的 index函數內部print(request.Meta)結果:

1.2 基於dockerfile


# 第二種方式:dockerfile

# 寫一個dockerfile即可

FROM python:3.6
MAINTAINER lqz
WORKDIR /home
RUN pip install django==1.11.9
RUN pip install uwsgi
EXPOSE 8080
CMD ["uwsgi","--ini","/home/django_test/uwsgi.ini"] 

# 這句命令,是後臺執行的,不會夯住,容器裏面就停了

# dockerfile路徑下要有一個django_test.tar

#構建鏡像
docker build -t='django_1.11.9' .
# 運行容器
docker run -di --name=mydjango -p 8080:8080 -v /home/myproject:/home django_1.11.9


# 以後只需要從git上拉下最新代碼,重啓,完事(最新代碼)

2 mysql主從搭建

# 爲什麼要搭建mysql主從?提高併發量(兩臺機器)
主mysql  從mysql,當主mysql數據發送變化,從mysql也跟着變化
10請求,3個寫的,7個讀請求
讀寫分離:寫往主庫中寫  ,讀從從庫中讀

# mysql版本必須一致,兩個庫的server-id 不能一致
# docker 模擬

# 創建文件夾 mysql  配置文件
# 創建文件夾 mysql2 配置文件

docker run  -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 33307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
# 從庫
docker run  -di -v /home/mysql2/data/:/var/lib/mysql -v /home/mysql2/conf.d:/etc/mysql/conf.d -v /home/mysql2/my.cnf:/etc/mysql/my.cnf -p 33306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
          
 # 遠程連接主庫
mysql -h 101.133.225.166 -P 33307 -u root -p123456
#在主庫創建用戶並授權
##創建test用戶
create user 'test'@'%' identified by '123';
##授權用戶
grant all privileges on *.* to 'test'@'%' ;
###刷新權限
flush privileges;
#查看主服務器狀態(顯示如下圖)
show master status; 

# 遠程連接從庫
mysql -h 101.133.225.166 -P 33306 -u root -p123456
change master to master_host='101.133.225.166',master_port=33307,master_user='test',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0;
#啓用從庫
start slave;
#查看從庫狀態(如下圖)
show slave status\G;

# 以後只向主庫寫數據
# 從庫用來讀(讀和寫的分離),你如果還向從庫寫東西(數據不統一)

3 django實現讀寫分離


migrate app01 --databse="db1"

# 手動操作(queryset對象)
ret=Book.objects.all().using("db1")

# 自動做(通過配置,程序,讀去從庫讀,寫去主庫寫)
# 寫一個router
在項目路徑下創建db_router.py
在裏面寫一個類
class Router1:
		def db_for_read(self, model, **hints):
				return 'db1'

		def db_for_write(self, model, **hints):
				return 'default'
      
#在setting中配置
DATABASE_ROUTERS = ['db_router.Router1',]
# 只要是寫的操作,都到default上,只要是讀的操作,都到db1上了

nginx:

動態請求和靜態請求(css,js,圖片)

來源:https://www.cnblogs.com/zhangchaocoming/p/12683505.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章