天天看點

Docker基礎-14-Dockerfile實戰練習2

前面我們學習了Dockerfile的文法,大部分的指令都介紹過了。今天就來一個Dockerfile的練習。把一個python中的flask web程式打包成鏡像,這個鏡像包括python編譯環境和flask web程式輸出hello world的python代碼。

1 程式準備

這是一個python中一個web架構的一個簡單例子,flask程式的一個hello world的入門例子。

先看看linux中python的版本号,預設是python 2.7系列

Docker基礎-14-Dockerfile實戰練習2

建立一個flask-hello-world的檔案夾,然後在這個檔案夾下建立一個app.py檔案

Docker基礎-14-Dockerfile實戰練習2
Docker基礎-14-Dockerfile實戰練習2

檔案app.py代碼如下

Docker基礎-14-Dockerfile實戰練習2

這裡貼下代碼

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元件。

Docker基礎-14-Dockerfile實戰練習2

然後再運作yum 安裝pip

Docker基礎-14-Dockerfile實戰練習2

可能需要更新pip版本(執行  sudo pip install --upgrade pip)

Docker基礎-14-Dockerfile實戰練習2

然後pip install flask

Docker基礎-14-Dockerfile實戰練習2

等flask安裝完成之後,輸入python app.py看看效果

Docker基礎-14-Dockerfile實戰練習2

根據上面提示,浏覽器輸入http://127.0.0.1:5000,由于我們IP位址是192.168.24.128,而且是在linux 系統,是以,我們到自己筆記本電腦浏覽器去通路。

Docker基礎-14-Dockerfile實戰練習2

如果你上面浏覽器打不開,先在linux機器上關閉防火牆,指令為sudo  systemctl stop firewalld. 然後重新整理浏覽器,如果還是出現不了hello docker字元串,那麼編輯app.py檔案,修改如下:

Docker基礎-14-Dockerfile實戰練習2

這樣修改之後,應該是可以通路并且顯示hello docker的效果。

2. 編寫Dockerfile

我們在flask-hello-world檔案下建立一個Dockerfile,并寫下如下内容

Docker基礎-14-Dockerfile實戰練習2

貼出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。

Docker基礎-14-Dockerfile實戰練習2

下載下傳完之後,我在安裝flask之後,報錯了。

Docker基礎-14-Dockerfile實戰練習2

這裡來說一下debug技巧,我們發現在執行RUN pip install flask這行出問題了,我們怎麼去調試呢?先主意到這裡。

Docker基礎-14-Dockerfile實戰練習2

上面紅圈表示之執行step 2/7中,紅圈這個是一個臨時的容器,在docker build的過程中自動建立的容器,運作完之後又自動删除了這個臨時的容器。是以,我們可以找到報錯這個步驟的容器的id是上面我滑鼠話白色背景的,那麼我們可以進入這個容器,執行容器裡面的bash程式,進行調試。

Docker基礎-14-Dockerfile實戰練習2

發現容器裡面就是這個步驟報錯了。然後這個問題網上搜尋下,說是dns設定修改就可以了,和pip安裝源沒有關系。

我們需要修改一個檔案vim /lib/systemd/system/docker.service

Docker基礎-14-Dockerfile實戰練習2

添加這行之後(這種方法隻在centos和redhat系統裡适合),重新開機docker服務,然後再來docker build

Docker基礎-14-Dockerfile實戰練習2
Docker基礎-14-Dockerfile實戰練習2

4. 啟動鏡像測試

Docker基礎-14-Dockerfile實戰練習2

這個加參數-d是背景運作的意思,來一個不加參數d的對比效果

Docker基礎-14-Dockerfile實戰練習2

這個時候,我們的容器是通路看不到hello docker的效果。我們需要run容器的時候指定端口。

Docker基礎-14-Dockerfile實戰練習2

看看浏覽器通路效果

Docker基礎-14-Dockerfile實戰練習2

現在不用去明白為什麼外層linux機器我指定8001端口,而容器指定5000端口就能通路,端口之間映射關系暫時不要去弄明白。