Docker 建立本地映像
當然如果你對Docker稍微瞭解一點,你可以從官方介紹文件URL中,看出至少文件這部分是運用docker本身封裝的.
在下載官方資料包時,由於國內網速較慢,建議連線VPN,進行下載.
介紹
現在是開始以Docker方式構建應用程式的時候了。我們從這種應用程式的層次結構的底部開始,這是一個容器,我們將在此頁面上介紹。在這個層次上面是一個服務,它定義了容器在生產中的行為方式,如第3部分所述。最後,在頂層是堆疊,定義了第5部分中涵蓋的所有服務的互動。
- 堆
- 服務
- 容器(你在這裡)
您的新開發環境
過去,如果您要開始編寫Python應用程式,您的第一個業務就是在您的機器上安裝Python執行時。
使用Docker,您可以將一個可移植的Python執行時作為一個映像獲取,無需安裝。然後,您的構建可以將基礎Python影象與應用程式程式碼一起包括在內,確保您的應用程式,依賴項和執行時都一起旅行。
這些行動式影象是由稱為a的東西定義的Dockerfile
。
定義一個容器 Dockerfile
Dockerfile
定義您的容器內環境中發生了什麼。訪問網路介面和磁碟驅動器等資源是在此環境中虛擬化的,與系統其餘部分隔離,因此您需要將埠對映到外部世界,並明確要將哪些檔案“複製”到那個環境。但是,在完成這些之後,您可以期望在其中定義的應用程式的構建Dockerfile
在其執行的任何位置都完全相同。
Dockerfile
建立一個空目錄。將目錄(cd
)更改為新目錄,建立一個名為的檔案Dockerfile
,將以下內容複製並貼上到該檔案中並儲存。注意解釋新Dockerfile中每條語句的註釋。
# Use an official Python runtime as a parent image
FROM python:2.7-slim
# Set the working directory to /app
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install --trusted-host pypi.python.org -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Define environment variable
ENV NAME World
# Run app.py when the container launches
CMD ["python", "app.py"]
你在代理伺服器後面嗎?
代理伺服器在啟動並執行後可以阻止與您的網路應用程式的連線。如果您位於代理伺服器的後面,請使用以下
ENV
命令為代理伺服器指定主機和埠,將以下行新增到Dockerfile中:# Set proxy server, replace host:port with values for your servers ENV http_proxy host:port ENV https_proxy host:port
在呼叫之前新增這些行
pip
以便安裝成功。
這Dockerfile
是指我們還沒有建立的幾個檔案,即 app.py
和requirements.txt
。接下來建立這些。
應用程式本身
再建立兩個檔案,requirements.txt
然後app.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相似。
而已!您requirements.txt
的系統中不需要Python或其他任何東西,也不需要在系統上安裝或執行此映像。看起來你並沒有真正用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
。
ctrl + c 退出,退出之後,在瀏覽器中將無法訪問.
在網路瀏覽器中轉到該URL以檢視網頁上顯示的顯示內容。
注意:如果您在Windows 7上使用Docker Toolbox,請使用Docker Machine IP而不是
localhost
。例如,http://192.168.99.100:4000/。要查詢IP地址,請使用該命令docker-machine ip
。
您也可以curl
在shell中使用該命令來檢視相同的內容。
這個埠重新對映4000:80
是為了展示你EXPOSE
在內部Dockerfile
和你publish
使用的 內容之間的區別docker run -p
。在後面的步驟中,我們只需將主機上的埠80對映到容器中的埠80並使用即可http://localhost
。
擊中CTRL+C
你的終端退出。