出於尋找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框架優點:
- 入門簡單,可以通過官方指南便可以清楚的了解Flask的運作留存
- 支持MVC模型(Model-View-Controller)
- Falsk可以兼容多種數據庫、模板
- Flask的路由以及路由函數由修飾器設定,開發人員不需要借助其他文件匹配
4、MVC模式:一個復雜的軟件系統,通過抽象成模型層(Model)、視圖層(View)和控制層(Controller),划分出明確的職責
5、Flask項目的藍圖功能可以把WEB函數定義到不同的模塊中
6、Flask定義模塊文件:首先創建Python文件,然后創建藍圖對象(Blueprint),把Web函數注冊到藍圖對象上面,最后再把藍圖對象注冊給Flask對象。
7、Flask模塊語言:
- Flask支持動態頁面技術,在后台渲染出動態HTML頁面
- Jinja2是Python下一個被廣泛應用的模板引擎,語法簡單易學
- 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、虛擬化部署環境的重要性:
- 直接把程序按照或者部署在Linux操作系統上,很容易引發資源沖突(比如CentOS自帶MariaDB數據庫,再安裝MySQL數據庫會沖突)
- 程序卸載不干凈,導致無法安裝或部署新程序
- 每次部署之前要安裝很多軟件,修改復雜的配置文件
- 無法讓服務器硬件資源實現多租戶服務
- 增大了在Linux系統上部署集群和分布式的難度
2、Vmware和Docker對比:
- Vmare是重量級虛擬機,每個虛擬實例都虛擬了完整的硬件環境,所以對硬件要求較高
- 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、什么是鏡像:
- 為了快速打包和部署軟件環境,Docker引入鏡像機制
- 鏡像是一個配置好的只讀層軟件環境
- 我們可以通過dockerfile文件創建出鏡像,也可以從Docker倉庫中下載到鏡像
10、什么是容器:
- 容器是鏡像基礎之上創建出的虛擬實例,內容可讀可寫
- 一個Docker鏡像可以創建出多個容器,而且容器直接相互隔離,部署的程序不會相互干擾
- 所有的容器直接使用書主機的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)
最后補下課程鏈接: