Docker構建Python Web環境


出於尋找Docker對Python相關項目部署的學習,找到騰訊課堂NEXT公開課中【Docker構建Python Web環境】的課程,本文對其進行內容梳理及知識點匯總。

該課程總計6小時左右,是個適合小白入門Docker部署的基礎課程。課程主要章節內容如下:

系統及軟件配置:

Win10 + CentOS7 + Python3 + MySQL8 + PyCharm  + VMware15 pro + MobaXterm + Navicat Premium 12

 

一、基礎篇

1、CentOS默認安裝了Python2,可以再安裝Python3,原有Python2不做卸載,CentOS7存在對Python2程序依賴。

2、yum命令不能直接安裝Python,需先安裝epel源

yum install epel-release

3、Linux各文件夾含義

 1 /boot 該目錄默認下存放的是Linux的啟動文件和內核。
 2 /bin 該目錄中存放Linux的常用命令。
 3 /sbin 該目錄用來存放系統管理員使用的管理程序。
 4 /var 該目錄存放那些經常被修改的文件,包括各種日志、數據文件。
 5 /etc 該目錄存放系統管理時要用到的各種配置文件和子目錄,例如網絡配置文件、Mysql配置文件。
 6 /dev 該目錄包含了Linux系統中使用的所有外部設備,它實際上是訪問這些外部設備的端口,如打印機等。
 7 /mnt 臨時將別的文件系統掛在該目錄下。
 8 /root 如果你是以超級用戶的身份登錄的,這個就是超級用戶的主目錄。
 9 /home 如果建立一個名為“xx”的用戶,那么在/home目錄下就有一個對應的“/home/xx”路徑,用來存放該用戶的主目錄。
10 /usr 用戶的應用程序和文件幾乎都存放在該目錄下。
11 /lib 該目錄用來存放系統動態鏈接共享庫,幾乎所有的應用程序都會用到該目錄下的共享庫。
12 /opt 第三方軟件在安裝時默認會找這個目錄,所以你沒有安裝此類軟件時它是空的,但如果你一旦把它刪除了,以后在安裝此類軟件時就有可能碰到麻煩。
13 /tmp 用來存放不同程序執行時產生的臨時文件,該目錄會被系統自動清理干凈。
14 /proc 可以在該目錄下獲取系統信息,這些信息是在內存中由系統自己產生的,該目錄的內容不在硬盤上而在內存里。
15 /misc 可以讓多用戶堆積和臨時轉移自己的文件。
16 /lost+found 該目錄在大多數情況下都是空的。但當突然停電、或者非正常關機后,有些文件就臨時存放在這里。
17 文件顏色的含義:藍色為文件夾;綠色是可執行文件;淺藍色是鏈接文件;紅框文件是加了SUID位,任意限權;紅色為壓縮文件;褐色為設備文件。

4、常用Linux命令

1 touch  #創建空白文件
2 rm -rf  #刪除文件或文件夾(-r 代表遞歸操作 -f代表強制刪除)
3 mkdir  #創建空文件夾
4 cd  ..   #返回上一層
5 tar      #壓縮解壓縮,參數-cvf壓縮,-xvf解壓縮
#.tar是Linux上面特有的壓縮文件格式,這種壓縮文件可以保留文件的權限信息

二、Web篇

1、Flask框架跟Django比起來是一個輕量級的Web框架,它可以通過第三方擴展增加功能。

2、Flask有非常多的擴張庫,開發者可以自由選擇安裝:

1 Flask-Admin:增加后台管理插件
2 Flask-Cache:連接Redis
3 Flask-Cors:ajax跨域
4 Flask-User:用戶管理模塊
5 Flask-Snow:雪花算法,生產全局唯一主鍵值
6 Flask-SSE:消息推送
7 Flask-SQLAlchemy:讀寫MySQL數據庫
8 Flask-Uploads:接受瀏覽器上傳的文件

3、Flask框架優點:

  1. 入門簡單,可以通過官方指南便可以清楚的了解Flask的運作留存
  2. 支持MVC模型(Model-View-Controller)
  3. Falsk可以兼容多種數據庫、模板
  4. Flask的路由以及路由函數由修飾器設定,開發人員不需要借助其他文件匹配

 4、MVC模式:一個復雜的軟件系統,通過抽象成模型層(Model)、視圖層(View)和控制層(Controller),划分出明確的職責

 

 5、Flask項目的藍圖功能可以把WEB函數定義到不同的模塊中

 

 6、Flask定義模塊文件:首先創建Python文件,然后創建藍圖對象(Blueprint),把Web函數注冊到藍圖對象上面,最后再把藍圖對象注冊給Flask對象。

7、Flask模塊語言:

  1. Flask支持動態頁面技術,在后台渲染出動態HTML頁面
  2. Jinja2是Python下一個被廣泛應用的模板引擎,語法簡單易學
  3. Flask中的模板文件存放在templates目錄,圖片、樣式和腳本存放在static目錄

8、WEB方法中,render_template()函數用來把模板文件渲染成動態HTML

 

 9、模板文件中,雙大括號({{變量/表達式}})可以對模板頁面插值

 

 10、部署Python項目的時候,為了不泄露Python程序代碼,所有我們要編譯Python程序(pycharm項目文件夾會自動生成pyc文件)

 

 11、Flask只允許本機訪問5000端口,如果外機訪問,需修改python源代碼,app.run(host='0.0.0.0')

12、Linux開發5000端口持久生效:

1 firewall -cmd --zone=pulic --add-port=5000/tcp --permanent

 三、Docker篇

 1、虛擬化部署環境的重要性:

  1. 直接把程序按照或者部署在Linux操作系統上,很容易引發資源沖突(比如CentOS自帶MariaDB數據庫,再安裝MySQL數據庫會沖突)
  2. 程序卸載不干凈,導致無法安裝或部署新程序
  3. 每次部署之前要安裝很多軟件,修改復雜的配置文件
  4. 無法讓服務器硬件資源實現多租戶服務
  5. 增大了在Linux系統上部署集群和分布式的難度

2、Vmware和Docker對比:

  1. Vmare是重量級虛擬機,每個虛擬實例都虛擬了完整的硬件環境,所以對硬件要求較高
  2. Docker是輕量級虛擬機,只虛擬了少量的硬件設備,虛擬實例共享使用Linux內核

 

3、Docker是跨平台的輕量級虛擬機,但是在Window和MacOS上面有部分功能無法使用(Win10 有內置Linux虛擬機,故能運行Docker)

4、雲計算中的Docker虛擬機:

 

5、SELINUX是CentOS系統捆綁的安全服務程序,因為安全策略太過嚴格,建議關閉,修改/etc/selinux/config文件,設置SELINUX=disabled

6、使用yum命令安裝Docker服務即可

1 yum install docker -y #-y代表默認安裝

 

7、DockerHub是Docker公共鏡像倉庫,為用戶提供大量的鏡像文件:https://hub.docker.com/,由於國內網絡訪問DockerHub很慢,無法下載鏡像文件,可以使用Docker加速器:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://n1mngx9r.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

8、Docker 包含三個基本概念,分別是鏡像(Image)、容器(Container)和倉庫(Repository)。鏡像是 Docker 運行容器的前提,倉庫是存放鏡像的場所。

9、什么是鏡像:

  1. 為了快速打包和部署軟件環境,Docker引入鏡像機制
  2. 鏡像是一個配置好的只讀層軟件環境
  3. 我們可以通過dockerfile文件創建出鏡像,也可以從Docker倉庫中下載到鏡像

10、什么是容器:

  1. 容器是鏡像基礎之上創建出的虛擬實例,內容可讀可寫
  2. 一個Docker鏡像可以創建出多個容器,而且容器直接相互隔離,部署的程序不會相互干擾
  3. 所有的容器直接使用書主機的Linxux內核、內存和硬盤,所以容器的性能非常接近於宿主機

11、常用Docker命令:

 

 

 

12、Docker網絡環境:容器默認會分配動態IP地址,會導致下次啟動容器時候IP地址發生變化,因此可以創建一個Docker內部網段:

docker network create --subnet=172.18.0.0/16 mynet #創建18網段名稱為mynet
docker network rm mynet #刪除mynet網段

 

13、創建容器示例(容器使用端口映射/目錄掛載/網絡分配技術):

docker run -it -d --name=p1 -p 9500:5000 -v /root/project:/root/project -net mynet --ip 172.18.0.2 python:3.8 bash
#創建容器,-d后台默認運行,--name容器名稱p1,-p端口映射宿主機9500端口,-v目錄掛載,-net使用mynet網絡並分配ip,使用python3:3.8鏡像,bash命令行界面

 

14、容器安裝flask,可以使用國內鏡像加快速度(sqlalchemy / mysql-connector-python):

docker exec -it p1 bash #進入p1容器
pip install flask -i https://pypi.tuna.tsinghua.edu.cn.simple/#清華大學鏡像

 

15、用docker pull命令下載MySQL鏡像(為確保部署沒問題,Win端與Linux的各軟件版本應盡量保持一致)

 

 16、創建MySQL容器:

docker run --name m1 -p 4306:3306 --net mynet --ip 172.18.0.3 -v /root/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=abc123456 -d mysql:8.0.18
#創建MySQL容器不需要加-it,--name容器名稱,--net分配網絡 -v目錄掛載(數據庫掛了文件仍能提取),-e用戶密碼 ,-d該容器創建即后台運行

 

17、創建Session類(用來連接數據庫)

from sqlalchemy.orm import sessionmaker #用以創建session類
from sqlalchemy import create_engine #保存數據庫連接信息
url="myslq+mysqlconnector://root:123456@192.168.99.49:4306/test" #數據庫用戶名密碼地址端口及庫名
engin=create_engine(url,pool_size=5)  #數據庫連接池對象個數
Session=sessionmaker(bind=engin) #創建session類

 

18、執行查詢語句:先創建Session對象,然后才可以執行SQL語句,最后還要關閉數據庫連接

session=Session()
sql="select empno,ename,job from t_emp"
cursor=session.execute(sql)
result=cursor.fetchall()
session.close()

 

補充常用Docker命令

docker中 啟動所有的容器命令
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)

docker中 關閉所有的容器命令
docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)

docker中 刪除所有的容器命令
docker rm $(docker ps -a | awk '{ print $1}' | tail -n +2)

docker中 刪除所有的鏡像
docker rmi $(docker images | awk '{print $3}' |tail -n +2)

  

最后補下課程鏈接:

https://ke.qq.com/course/478268?taid=4069730621541436


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM