centos部署python flask_用Dockerfile部署你的Flask Web应用
背景故事
話說去年年底給另外一個組的同事寫了一個簡單的工單查詢系統,用flask寫的,當時是部署在我們組的一臺測試物理機上,操作系統是Redhat 7。后來我們組的這臺測試物理機要做其它用途,領導給兩天時間讓把應用遷走,問了使用這個應用的同事,他們組自己有一臺測試機,可以部署到他們自己的測試機上,于是又搞一通部署。最近使用這個應用的同事又跑過來找我,說他們那臺測試機要重裝系統,有其它用途。徹底無語,忍無可忍了,用docker吧!搞完之后總結一下,記個筆記。
準備環境
Linux OS
[root@labhost ~]# cat /etc/redhat-releaseCentOS Linux release 7.8.2003 (Core)Docker Engine
Docker安裝請參考官網:https://docs.docker.com/engine/install/centos/#install-using-the-repository
[root@labhost pyalpine]# docker versionClient: Docker Engine - Community Version: ? ? ? ? ? 19.03.12 API version: ? ? ? 1.40 Go version: ? ? ? go1.13.10 Git commit: ? ? ? 48a66213fe Built: ? ? ? ? ? ? Mon Jun 22 15:46:54 2020 OS/Arch: ? ? ? ? ? linux/amd64 Experimental: ? ? ?falseServer: Docker Engine - Community Engine: Version: ? ? ? ? ?19.03.12 API version: ? ? ?1.40 (minimum version 1.12) Go version: ? ? ? go1.13.10 Git commit: ? ? ? 48a66213fe Built: ? ? ? ? ? Mon Jun 22 15:45:28 2020 OS/Arch: ? ? ? ? linux/amd64 Experimental: ? ? false containerd: Version: ? ? ? ? ?1.2.13 GitCommit: ? ? ? 7ad184331fa3e55e52b890ea95e65ba581ae3429 runc: Version: ? ? ? ? ?1.0.0-rc10 GitCommit: ? ? ? dc9208a3303feef5b3839f4323d9beb36df0a9dd docker-init: Version: ? ? ? ? ?0.18.0 GitCommit: ? ? ? fec3683環境準備好之后開搞
#創建項目文件夾[root@labhost ~]# mkdir pyalpine#進入項目文件夾[root@labhost ~]# cd pyalpine#創建requirements.txt,實際項目開發中是直接用pip freeze直接生成,這里為了方便是手動創建的,而且這里面我只放了Flask,實際項目會有很多依賴包。[root@labhost pyalpine]# vim requirements.txt[root@labhost pyalpine]# cat requirements.txtFlask>=1.1.1,<1.2#創建app.py文件[root@labhost pyalpine]# vim app.py#代碼如下:[root@labhost pyalpine]# cat app.pyfrom flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world(): ? return 'Hello, Flask which is running on Docker container!'if __name__ == "__main__": ? app.run(debug=True, host="0.0.0.0", port="5000")#接下來我們創建Dockerfile,注意:Dockerfile的首字母是大寫!!![root@labhost pyalpine]# vim DockerfileDockerfile內容如下:
[root@labhost pyalpine]# cat Dockerfile#拉取鏡像FROM python:3.7-alpine#指定工作目錄,目錄名稱自己定義,如果當前指定的目錄不存在的話,這個目錄會自動被創建WORKDIR /demoapp#復制當前文件夾下的所有項目文件到docker的工作目錄,也就是我們上面指定的目錄COPY ./ ./#根據requirements.txt文件,安裝相關依賴包RUN pip install -r requirements.txt#指定docker運行的時候默認執行的命令,我們想讓flask網站隨docker啟動時就運行CMD ["python", "app.py"]接下來我們來構建我們自己的docker image:(注意不要把點號給遺漏了!-t參數指定tag,也就是你的docker image叫什么名字)
[root@labhost pyalpine]# docker build . -t mypyalpineSending build context to Docker daemon ?4.096kBStep 1/5 : FROM python:3.7-alpine ---> 6ca3e0b1ab69Step 2/5 : WORKDIR /demoapp ---> Using cache ---> c89343983176Step 3/5 : COPY ./ ./ ---> 2cb8fce548c8Step 4/5 : RUN pip install -r requirements.txt ---> Running in 00911a463614Collecting Flask<1.2,>=1.1.1 Downloading Flask-1.1.2-py2.py3-none-any.whl (94 kB)Collecting itsdangerous>=0.24 Downloading itsdangerous-1.1.0-py2.py3-none-any.whl (16 kB)Collecting Jinja2>=2.10.1 Downloading Jinja2-2.11.2-py2.py3-none-any.whl (125 kB)Collecting click>=5.1 Downloading click-7.1.2-py2.py3-none-any.whl (82 kB)Collecting Werkzeug>=0.15 Downloading Werkzeug-1.0.1-py2.py3-none-any.whl (298 kB)Collecting MarkupSafe>=0.23 Downloading MarkupSafe-1.1.1.tar.gz (19 kB)Building wheels for collected packages: MarkupSafe Building wheel for MarkupSafe (setup.py): started Building wheel for MarkupSafe (setup.py): finished with status 'done' Created wheel for MarkupSafe: filename=MarkupSafe-1.1.1-py3-none-any.whl size=12629 sha256=f9ec10f37be2db2c6a39211640b9b8336c7be48743dd4a91d13db0ea5e8fe727 Stored in directory: /root/.cache/pip/wheels/b9/d9/ae/63bf9056b0a22b13ade9f6b9e08187c1bb71c47ef21a8c9924Successfully built MarkupSafeInstalling collected packages: itsdangerous, MarkupSafe, Jinja2, click, Werkzeug, FlaskSuccessfully installed Flask-1.1.2 Jinja2-2.11.2 MarkupSafe-1.1.1 Werkzeug-1.0.1 click-7.1.2 itsdangerous-1.1.0Removing intermediate container 00911a463614 ---> 12e21da37c96Step 5/5 : CMD ['python', 'app.py'] ---> Running in ad78a874fd79Removing intermediate container ad78a874fd79 ---> f0d4b0160413Successfully built f0d4b0160413Successfully tagged mypyalpine:latest恭喜你,你已經成功構建了一個自己的docker image:mypyalpine,那我們現在來讓他跑起來:
[root@labhost ~]# docker run -p 5050:5000 --name myflask mypyalpine * Serving Flask app "app" (lazy loading) * Environment: production ? WARNING: This is a development server. Do not use it in a production deployment. ? Use a production WSGI server instead. * Debug mode: on * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger PIN: 236-169-898簡單介紹一下:
docker run:想要跑一個docker,必須要敲的命令
-p 5050:5000:指定端口映射,冒號前面的是暴露到外面的端口號,冒號后面的是在docker里面的端口號
--name ?myflask:指定將要跑起來的docker的名稱,可選參考,但是推薦加上,否則docker服務會自己隨機給你的docker起個名字,你都不認識,所以自己的孩子還是起個好聽點的名字,方便自己記憶和使用。
mypyalpine:這個是上一步我們構建docker image時,給image起的名字,這個必須指定,別指定錯了。
小伙伴發現了沒有,上面我們運行docker之后,終端直接顯示的我們的flask程序啟動的信息,沒辦法再輸入其它命令了,如果你想繼續輸入指令怎么搞?所以上面運行docker的命令格式不是太好,我們再來改造一下,讓我們的docker啟動之后在后臺運行,只需加上一個 -d參數即可,然后我們再用docker ps來查看正在運行的container信息:
[root@labhost pyalpine]# docker run -d -p 5050:5000 --name myflask mypyalpined464fd0fa04893db4640cc3f2afe201ca07718978bc55f7a17bcc909cab25475[root@labhost pyalpine]# docker psCONTAINER ID ? ? ? IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? PORTS ? ? ? ? ? ? ? ? ? NAMESd464fd0fa048 ? ? ? mypyalpine ? ? ? ? ?"python app.py" ? ? 3 seconds ago ? ? ? Up 2 seconds ? ? ? ?0.0.0.0:5050->5000/tcp ? myflask[root@labhost pyalpine]#注意:如果你第一次運行docker run沒有加 -d參數,想再次運行docker run加-d參數,是會報錯的,此時你需要先停止當前運行的container,然后刪除container,最后再運行加上 -d參數的命令就可以了。
[root@labhost ~]# docker run -d -p 5050:5000 mypyalpine387d43c0920574fd8ea7c75db611c74de7fbc4bdb5be2961246fb8642ad7bc5cdocker: Error response from daemon: driver failed programming external connectivity on endpoint quizzical_bassi (0696007b82f3f83880fc6b43830b5b6680bf8cfc6cd48856fd7b504dc0e87abc): Bind for 0.0.0.0:5050 failed: port is already allocated.[root@labhost ~]# docker psCONTAINER ID ? ? ? IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? PORTS ? ? ? ? ? ? ? ? ? NAMES42b0bd3bf39c ? ? ? mypyalpine ? ? ? ? ?"python app.py" ? ? 4 hours ago ? ? ? ? Up 4 hours ? ? ? ? ?0.0.0.0:5050->5000/tcp ? goofy_faraday[root@labhost ~]# docker stop 42b0bd3bf39c42b0bd3bf39c[root@labhost ~]# docker rm 42b0bd3bf39c42b0bd3bf39c[root@labhost pyalpine]# docker run -d -p 5050:5000 --name myflask mypyalpined464fd0fa04893db4640cc3f2afe201ca07718978bc55f7a17bcc909cab25475[root@labhost pyalpine]# docker psCONTAINER ID ? ? ? IMAGE ? ? ? ? ? ? ? COMMAND ? ? ? ? ? ? CREATED ? ? ? ? ? ? STATUS ? ? ? ? ? ? PORTS ? ? ? ? ? ? ? ? ? NAMESd464fd0fa048 ? ? ? mypyalpine ? ? ? ? ?"python app.py" ? ? 3 seconds ago ? ? ? Up 2 seconds ? ? ? ?0.0.0.0:5050->5000/tcp ? myflask[root@labhost pyalpine]#我們現在來訪問一下flask網站:http://192.168.137.200:5050
可能大家對上面我們拉取的base image有點疑問,為什么選擇python:3.7-alpine這個image作為我們的base image來構建我們的docker?原因很簡單:身材苗條。我們可以看一下build好的image mypyalpine大小和一個ubuntu或者centos的image大小比較:
myflask這個是我用python:3.6這個base image構建的,925MB,將近1GB.
mypyalpine這個是我們用python:3.7-alpine構建的,只有83.8MB,不到100MB.
最后,Enjoy your Docker!
總結
以上是生活随笔為你收集整理的centos部署python flask_用Dockerfile部署你的Flask Web应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 申请大额信用卡怎么填写申请表
- 下一篇: php怎么创建进程,在php中为长时间运