Docker官方入門指南一(容器)
給你的環境一個快速的測試執行,以確保你所有的設定:
docker run hello-world
介紹
現在是開始構建Docker方式的應用程式的時候了。我們將從這個應用程式的層次結構的底部開始,這個應用程式是一個容器,我們在這個頁面上覆蓋。在這個層次上面是一個服務,它定義了容器在生產中的行為方式。最後,在頂層是堆疊,定義所有服務的互動。
● 堆
● 服務
● 容器(你在這裡)
你的新開發環境
在過去,如果你要開始編寫一個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"]
你在代理伺服器後面嗎?
代理伺服器啟動並執行後,可以阻止與您的網路應用程式的連線。如果您位於代理伺服器後面,請將以下行新增到Dockerfile中,使用以下ENV命令指定代理伺服器的主機和埠:
# 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 = “cannot connect to Redis, counter disabled”
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 images
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。
在網路瀏覽器中轉到該URL,檢視網頁上提供的顯示內容。
注意:如果您在Windows 7上使用Docker Toolbox,請使用Docker Machine IP而不是localhost。例如,http://192.168.99.100:4000/。要找到IP地址,請使用該命令docker-machine ip。
您也可以curl在shell中使用該命令來檢視相同的內容。
$ curl http://localhost:4000
Hello World!
Hostname: 8fc990912a14Visits: cannot connect to Redis, counter disabled
這個埠重新對映4000:80是為了展示你EXPOSE內部Dockerfile和你publish使用 什麼之間的區別docker run -p。在後面的步驟中,我們將主機上的埠80對映到容器中的埠80並使用http://localhost。
打CTRL+C在你的終端退出。
在Windows上,顯式停止容器
在Windows系統上,CTRL+C不停止容器。所以,先輸入CTRL+C提示符(或開啟另一個shell),然後鍵入 docker container ls列出正在執行的容器,然後 docker container stop 停止容器。否則,當您嘗試在下一步中重新執行容器時,將從守護程式中收到錯誤響應。
現在讓我們以分離模式在後臺執行應用程式:
docker run -d -p 4000:80 friendlyhello
你得到你的應用程式的長容器ID,然後被踢回你的終端。您的容器正在後臺執行。您還可以看到縮寫容器ID docker container ls(在執行命令時可以互換使用):
$ 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
分享您的映象
為了演示我們剛剛建立的可移植性,我們上傳我們構建的映像,並在其他地方執行它。畢竟,當你想將容器部署到生產環境中時,你需要學習如何推動登錄檔。
一個登錄檔是一個儲存庫的集合,一個儲存庫是一個影象集合 - 有點像GitHub儲存庫,除了程式碼已經建立。登錄檔上的帳戶可以建立許多儲存庫。該dockerCLI使用泊塢窗的公共登錄檔預設情況下。
注意:我們將在這裡使用Docker的公共登錄檔,因為它是免費的,並且是預配置的,但是有許多公共選擇,甚至可以使用Docker Trusted Registry設定您自己的私有登錄檔。
使用您的Docker ID登入
如果您沒有Docker帳戶,請在cloud.docker.com註冊一個 。記下你的使用者名稱。
登入到本地計算機上的Docker公共登錄檔。
$ docker login
標記映象
將本地映像與登錄檔上的儲存庫相關聯的符號是 username/repository:tag。該標籤是可選的,但推薦使用,因為這是註冊管理機構為Docker映象提供版本的機制。給儲存庫併為上下文標記有意義的名稱,例如 get-started:part2。這將把影象放入get-started儲存庫並標記為part2。
現在,把它們放在一起來標記影象。執行docker tag image您的使用者名稱,儲存庫和標籤名稱,以便影象將上傳到您想要的目的地。該命令的語法是:
docker tag image username/repository:tag
例如:
docker tag friendlyhello john/get-started:part2
執行docker映象以檢視新標記的映象。(你也可以用docker image ls。)
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
friendlyhello latest d9e555c53008 3 minutes ago 195MB
john/get-started part2 d9e555c53008 3 minutes ago 195MB
python 2.7-slim 1c7128a655f6 5 days ago 183MB
…
釋出映象
將您的標記圖片上傳到儲存庫:
docker push username/repository:tag
一旦完成,這個上傳的結果是公開的。如果你登入到Docker Hub,你將會看到那個新的映象和它的pull命令。
從遠端儲存庫中提取並執行映像
從現在起,您可以使用docker run此命令在任何機器上使用並執行您的應用程式:
docker run -p 4000:80 username/repository:tag
如果影象在機器上本地不可用,Docker將從儲存庫中取出。
$ docker run -p 4000:80 john/get-started:part2
Unable to find image ‘john/get-started:part2’ locally
part2: Pulling from john/get-started
10a267c67f42: Already exists
f68a39a6a5e4: Already exists
9beaffc0cf19: Already exists
3c1fe835fb6b: Already exists
4c9f1fa8fcb8: Already exists
ee7d8f576a14: Already exists
fbccdcced46e: Already exists
Digest: sha256:0601c866aab2adcc6498200efd0f754037e909e5fd42069adeff72d1e2439068
Status: Downloaded newer image for john/get-started:part2
* Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
無論在哪裡docker run執行,它都會將您的映象,Python以及所有依賴關係從中拉出requirements.txt,然後執行您的程式碼。它們一起旅行在一個整潔的小包裡,主機不需要安裝任何東西,除了Docker來執行它。