出於尋找Docker對Python相關項目部署的學習,找到騰訊課堂NEXT公開課中【Docker構建Python Web環境】的課程,本文對其進行內容梳理及知識點彙總。python
該課程總計6小時左右,是個適合小白入門Docker部署的基礎課程。課程主要章節內容以下:mysql
系統及軟件配置:linux
Win10 + CentOS7 + Python3 + MySQL8 + PyCharm + VMware15 pro + MobaXterm + Navicat Premium 12ajax
1、基礎篇算法
一、CentOS默認安裝了Python2,能夠再安裝Python3,原有Python2不作卸載,CentOS7存在對Python2程序依賴。sql
二、yum命令不能直接安裝Python,需先安裝epel源docker
yum install epel-release
三、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位,任意限權;紅色爲壓縮文件;褐色爲設備文件。
四、經常使用Linux命令json
1 touch #建立空白文件 2 rm -rf #刪除文件或文件夾(-r 表明遞歸操做 -f表明強制刪除) 3 mkdir #建立空文件夾 4 cd .. #返回上一層 5 tar #壓縮解壓縮,參數-cvf壓縮,-xvf解壓縮 #.tar是Linux上面特有的壓縮文件格式,這種壓縮文件能夠保留文件的權限信息
2、Web篇flask
一、Flask框架跟Django比起來是一個輕量級的Web框架,它能夠經過第三方擴展增長功能。
二、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:接受瀏覽器上傳的文件
三、Flask框架優勢:
四、MVC模式:一個複雜的軟件系統,經過抽象成模型層(Model)、視圖層(View)和控制層(Controller),劃分出明確的職責
五、Flask項目的藍圖功能能夠把WEB函數定義到不一樣的模塊中
六、Flask定義模塊文件:首先建立Python文件,而後建立藍圖對象(Blueprint),把Web函數註冊到藍圖對象上面,最後再把藍圖對象註冊給Flask對象。
七、Flask模塊語言:
八、WEB方法中,render_template()函數用來把模板文件渲染成動態HTML
九、模板文件中,雙大括號({{變量/表達式}})能夠對模板頁面插值
十、部署Python項目的時候,爲了避免泄露Python程序代碼,全部咱們要編譯Python程序(pycharm項目文件夾會自動生成pyc文件)
十一、Flask只容許本機訪問5000端口,若是外機訪問,需修改python源代碼,app.run(host='0.0.0.0')
十二、Linux開發5000端口持久生效:
1 firewall -cmd --zone=pulic --add-port=5000/tcp --permanent
3、Docker篇
一、虛擬化部署環境的重要性:
二、Vmware和Docker對比:
三、Docker是跨平臺的輕量級虛擬機,可是在Window和MacOS上面有部分功能沒法使用(Win10 有內置Linux虛擬機,故能運行Docker)
四、雲計算中的Docker虛擬機:
五、SELINUX是CentOS系統捆綁的安全服務程序,由於安全策略太過嚴格,建議關閉,修改/etc/selinux/config文件,設置SELINUX=disabled
六、使用yum命令安裝Docker服務便可
1 yum install docker -y #-y表明默認安裝
七、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
八、Docker 包含三個基本概念,分別是鏡像(Image)、容器(Container)和倉庫(Repository)。鏡像是 Docker 運行容器的前提,倉庫是存放鏡像的場所。
九、什麼是鏡像:
十、什麼是容器:
十一、經常使用Docker命令:
十二、Docker網絡環境:容器默認會分配動態IP地址,會致使下次啓動容器時候IP地址發生變化,所以能夠建立一個Docker內部網段:
docker network create --subnet=172.18.0.0/16 mynet #建立18網段名稱爲mynet docker network rm mynet #刪除mynet網段
1三、建立容器示例(容器使用端口映射/目錄掛載/網絡分配技術):
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命令行界面
1四、容器安裝flask,可使用國內鏡像加快速度(sqlalchemy / mysql-connector-python):
docker exec -it p1 bash #進入p1容器
pip install flask -i https://pypi.tuna.tsinghua.edu.cn.simple/#清華大學鏡像
1五、用docker pull命令下載MySQL鏡像(爲確保部署沒問題,Win端與Linux的各軟件版本應儘可能保持一致)
1六、建立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該容器建立即後臺運行
1七、建立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類
1八、執行查詢語句:先建立Session對象,而後才能夠執行SQL語句,最後還要關閉數據庫鏈接
session=Session() sql="select empno,ename,job from t_emp" cursor=session.execute(sql) result=cursor.fetchall() session.close()
最後補下課程連接: