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.py和requirements.txt。讓我們建立下一個。
再建立兩個檔案,requirements.txt和app.py,然後將它們放在和Dockerfile同一個資料夾中。這完成了我們的應用程式,您可以看到它非常簡單。當上述Dockerfile被內建到的影象,app.py並且requirements.txt是因為存在Dockerfile的
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
2 執行該應用程式
執行應用程式,使用以下方法將計算機的埠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