前面我們學習了Dockerfile的文法,大部分的指令都介紹過了。今天就來一個Dockerfile的練習。把一個python中的flask web程式打包成鏡像,這個鏡像包括python編譯環境和flask web程式輸出hello world的python代碼。
1 程式準備
這是一個python中一個web架構的一個簡單例子,flask程式的一個hello world的入門例子。
先看看linux中python的版本号,預設是python 2.7系列
建立一個flask-hello-world的檔案夾,然後在這個檔案夾下建立一個app.py檔案
檔案app.py代碼如下
這裡貼下代碼
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "hello docker"
if __name__ == '__main__':
app.run()
儲存退出,然後本地先通過pip install flask安裝flask
我檢查了我centos 7環境,雖然給我安裝了python2.7, 但是沒有安裝pip2元件。
然後再運作yum 安裝pip
可能需要更新pip版本(執行 sudo pip install --upgrade pip)
然後pip install flask
等flask安裝完成之後,輸入python app.py看看效果
根據上面提示,浏覽器輸入http://127.0.0.1:5000,由于我們IP位址是192.168.24.128,而且是在linux 系統,是以,我們到自己筆記本電腦浏覽器去通路。
如果你上面浏覽器打不開,先在linux機器上關閉防火牆,指令為sudo systemctl stop firewalld. 然後重新整理浏覽器,如果還是出現不了hello docker字元串,那麼編輯app.py檔案,修改如下:
這樣修改之後,應該是可以通路并且顯示hello docker的效果。
2. 編寫Dockerfile
我們在flask-hello-world檔案下建立一個Dockerfile,并寫下如下内容
貼出Dockerfile的代碼
FROM python:2.7
LABEL maintainer="Anthony<[email protected]>"
RUN pip install flask
COPY app.py /app/
WORKDIR /app
EXPOSE 5000
CMD ["python","/app/app.py"]
3. 制作鏡像
利用之前學習過的docker build指令來制作鏡像
由于我們FROM使用的base image是python:2.7,這個鏡像在我們本地沒有下載下傳過,是以需要先下載下傳python:2.7這個鏡像裡面的不同layer。
下載下傳完之後,我在安裝flask之後,報錯了。
這裡來說一下debug技巧,我們發現在執行RUN pip install flask這行出問題了,我們怎麼去調試呢?先主意到這裡。
上面紅圈表示之執行step 2/7中,紅圈這個是一個臨時的容器,在docker build的過程中自動建立的容器,運作完之後又自動删除了這個臨時的容器。是以,我們可以找到報錯這個步驟的容器的id是上面我滑鼠話白色背景的,那麼我們可以進入這個容器,執行容器裡面的bash程式,進行調試。
發現容器裡面就是這個步驟報錯了。然後這個問題網上搜尋下,說是dns設定修改就可以了,和pip安裝源沒有關系。
我們需要修改一個檔案vim /lib/systemd/system/docker.service
添加這行之後(這種方法隻在centos和redhat系統裡适合),重新開機docker服務,然後再來docker build
4. 啟動鏡像測試
這個加參數-d是背景運作的意思,來一個不加參數d的對比效果
這個時候,我們的容器是通路看不到hello docker的效果。我們需要run容器的時候指定端口。
看看浏覽器通路效果
現在不用去明白為什麼外層linux機器我指定8001端口,而容器指定5000端口就能通路,端口之間映射關系暫時不要去弄明白。