1. 程式人生 > >Docker 建立本地映像

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.pyrequirements.txt接下來建立這些。

應用程式本身

再建立兩個檔案,requirements.txt然後app.py將它們放在同一個資料夾中Dockerfile這完成了我們的應用程式,您可以看到它非常簡單。當上述Dockerfile被內建到的影象,app.py並且 requirements.txt是因為存在DockerfileADD命令,並從輸出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你的終端退出。