1. 程式人生 > >Dockerfile構建映象並測試執行(docker學習筆記2)

Dockerfile構建映象並測試執行(docker學習筆記2)

Dockerfile構建映象並測試執行

1建立Dockerfile

建立一個空目錄,建立一個名為的檔案Dockerfile,將以下內容複製並貼上到該檔案中,然後儲存。記下解釋新Dockerfile中每個語句的註釋。

# 使用官方Python作為執行時父映象

FROM python:2.7-slim

# 設定工作目錄 /app

WORKDIR /app

#將當前目錄內容複製到應用程式容器中

ADD . /app

#安裝所有requirements.txt規定的的包

RUN pip install --trusted-host pypi.python.org -r requirements.txt

#將80的埠號暴露在容器外

EXPOSE 80

#定義環境變數

ENV NAME World

# 當容器啟動時執行app.py

CMD ["python", "app.py"]

Dockerfile是指我們尚未建立的幾個檔案,即 app.pyrequirements.txt。讓我們建立下一個。

再建立兩個檔案,requirements.txtapp.py,然後將它們放在Dockerfile同一個資料夾中。這完成了我們的應用程式,您可以看到它非常簡單。當上述Dockerfile被內建到的影象,app.py並且requirements.txt是因為存在Dockerfile

ADD命令,並從輸出app.py是通過HTTP得益於訪問EXPOSE 命令。

requirements.txt

Flask

Redis

app.py

from flask import Flask

from redis import Redis, RedisError

import os

import socket

# Connect to Redis

redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route

("/")

def hello():

    try:

        visits = redis.incr("counter")

    except RedisError:

        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \

           "<b>Hostname:</b> {hostname}<br/>" \

           "<b>Visits:</b> {visits}"

    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":

    app.run(host='0.0.0.0', port=80)

現在我們看到pip install -r requirements.txt為Python安裝Flask和Redis庫,應用程式列印環境變數NAME,以及呼叫的輸出socket.gethostname()。最後,因為Redis沒有執行(因為我們只安裝了Python庫,而不是Redis本身),我們應該期望在這裡使用它的嘗試失敗併產生錯誤訊息。

注意:在容器內部訪問容器ID時,訪問主機名稱,這類似於正在執行的可執行檔案的程序ID。

您不需要Python或requirements.txt系統中的任何內容,也不需要構建或執行此映像將它們安裝在您的系統上。看起來你並沒有真正建立一個Python和Flask的環境,但你已經在使用了

我們準備構建應用程式。確保您仍處於新目錄的頂層。這是ls應該顯示的內容:

$ ls 

Dockerfile   app.py   requirements.txt

現在執行build命令。這會建立一個Docker映象,我們將使用-t它來標記。

docker build -t friendlyhello .                                        #建立映象

你的建築形象在哪裡?它位於您機器的本地Docker映象登錄檔中:

$ docker image ls

REPOSITORY            TAG                 IMAGE ID

friendlyhello         latest              326387cea398

執行該應用程式

執行應用程式,使用以下方法將計算機的埠4000對映到容器的已釋出埠80 -p

docker run -p 4000:80 friendlyhello

您應該看到Python正在為您的應用程式提供服務的訊息http://0.0.0.0:80。但是該訊息來自容器內部,它不知道您將該容器的埠80對映到4000,從而生成正確的URL http://localhost:4000

在Web瀏覽器中轉到該URL,以檢視在網頁上提供的顯示內容。

您還可以curl在shell中使用該命令來檢視相同的內容。

$ curl http://localhost:4000

<h3>Hello World!</h3><b>Hostname:</b> 8fc990912a14<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>

這個埠重新對映的4000:80演示之間的差異EXPOSE中的Dockerfile哪些的publish執行時值設定docker run -p。在後面的步驟中,將主機上的埠4000對映到容器中的埠80並使用http://localhost

點選CTRL+C你的終端退出。

現在讓我們以分離模式在後臺執行應用程式:

docker run -d -p 4000:80 friendlyhello

您獲得應用程式的長容器ID,然後被踢回終端。您的容器正在後臺執行。您還可以看到縮寫的容器ID docker container ls(並且在執行命令時都可以互換):(COMMAND代表執行時啟動命令)

$ docker container ls

CONTAINER ID        IMAGE               COMMAND             CREATED

1fa4ab2cf395        friendlyhello       "python app.py"     28 seconds ago

請注意,CONTAINER ID匹配的是什麼http://localhost:4000

現在docker container stop用來結束這個過程,使用CONTAINER ID如下:

docker container stop 1fa4ab2cf395