目錄
我們使用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,圖片)