?
本文檔使用 php中文網(wǎng)手冊 發(fā)布
1:概況介紹
2:集裝箱
3:服務(wù)
4:成群
5:堆疊
6:部署應(yīng)用程序
安裝Docker版本1.13或更高版本...
閱讀第1部分中的方向。
給您的環(huán)境一個快速測試運行,以確保您已經(jīng)設(shè)置好了:
碼頭經(jīng)營哈羅-世界
現(xiàn)在是開始以Docker方式構(gòu)建應(yīng)用程序的時候了。我們將從這種應(yīng)用程序的層次結(jié)構(gòu)的底部開始,該應(yīng)用程序是一個容器,我們將在此頁面上進行介紹。在這個層次上面是一個服務(wù),它定義了容器在生產(chǎn)中的行為方式,在第3部分中進行了討論。最后,在頂層是堆棧,定義了第5部分中介紹的所有服務(wù)的交互。
堆疊
服務(wù)
集裝箱你在這里
在過去,如果您要開始編寫Python應(yīng)用程序,您的首要任務(wù)就是將Python運行時安裝到您的計算機上。但是,這就造成了這樣一種情況:為了使應(yīng)用程序按預(yù)期運行,計算機上的環(huán)境必須是這樣的;運行應(yīng)用程序的服務(wù)器也是如此。
使用Docker,您只需獲取一個可移植的Python運行時作為映像,無需安裝。然后,您的構(gòu)建可以將基本Python映像與應(yīng)用程序代碼放在一起,確保應(yīng)用程序、其依賴項和運行時都能一起運行。
這些便攜式圖像是由稱為a的東西定義的Dockerfile
。
Dockerfile
Dockerfile
將定義容器內(nèi)環(huán)境中發(fā)生的事情。在這個環(huán)境中,對網(wǎng)絡(luò)接口和磁盤驅(qū)動器等資源的訪問是虛擬化的,這與系統(tǒng)的其他部分是隔離的,因此您必須將端口映射到外部世界,并具體說明要將哪些文件“復(fù)制”到該環(huán)境。但是,在這樣做之后,您可以預(yù)期您的應(yīng)用程序的構(gòu)建是在Dockerfile
無論在哪里運行都會表現(xiàn)得完全一樣。
Dockerfile
創(chuàng)建一個空目錄。將目錄(cd
)更改為新目錄,創(chuàng)建一個名為的文件Dockerfile
,將以下內(nèi)容復(fù)制并粘貼到該文件中并保存。注意解釋新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 -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
指我們還沒有創(chuàng)建的幾個文件,即app.py
和requirements.txt
讓我們創(chuàng)造下一個。
再創(chuàng)建兩個文件,requirements.txt
和app.py
,并將它們放在同一個文件夾中,Dockerfile
這就完成了我們的應(yīng)用程序,正如您所看到的,這個應(yīng)用程序非常簡單。當(dāng)以上Dockerfile
被塑造成一幅圖像,app.py
和requirements.txt
會因為這個而出現(xiàn)Dockerfile
氏ADD
命令的輸出。app.py
可以通過HTTP訪問,這要感謝EXPOSE
命令。
requirements.txt
Flask Redis
app.py
from flask import Flaskfrom redis import Redis, RedisErrorimport osimport 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)
現(xiàn)在我們看到了pip install -r requirements.txt
安裝用于Python的Flask和Redis庫,應(yīng)用程序打印環(huán)境變量NAME
,以及調(diào)用的輸出socket.gethostname()
最后,由于Redis沒有運行%28,我們只安裝了Python庫,而沒有安裝Redis本身的%29,因此我們應(yīng)該期望在這里使用它的嘗試會失敗并產(chǎn)生錯誤消息。
注:在容器中檢索容器ID時訪問主機的名稱,這就像正在運行的可執(zhí)行文件的進程ID一樣。
而已!您requirements.txt
的系統(tǒng)中不需要Python或其他任何東西,也不會在您的系統(tǒng)上安裝或運行此映像??雌饋砟悴]有真正用Python和Flask建立一個環(huán)境,但是你已經(jīng)擁有了。
我們已經(jīng)準(zhǔn)備好構(gòu)建這個應(yīng)用程序了。確保您仍然處于新目錄的頂層。這是什么ls
應(yīng)顯示:
$ ls Dockerfile app.py requirements.txt
現(xiàn)在運行Build命令。這將創(chuàng)建一個Docker映像,我們將使用它進行標(biāo)記-t
所以它有個友好的名字。
docker build -t friendlyhello .
你的形象在哪里?它在您機器的本地Docker映像注冊表中:
$ docker images REPOSITORY TAG IMAGE ID friendlyhello latest 326387cea398
運行應(yīng)用程序,使用以下方法將機器的端口4000映射到容器的已發(fā)布端口80-p
*
docker run -p 4000:80 friendlyhello
您應(yīng)該會看到Python正在為您的應(yīng)用提供服務(wù)的通知http://0.0.0.0:80
。但是該消息來自容器內(nèi)部,它不知道你將該容器的端口80映射到4000,從而制作正確的URL http://localhost:4000
。
轉(zhuǎn)到Web瀏覽器中的URL,查看網(wǎng)頁上的顯示內(nèi)容,包括“HelloWorld”文本、容器ID和Redis錯誤消息。
您還可以使用curl
命令在shell中查看相同的內(nèi)容。
$ 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
在后面的步驟中,我們將只將主機上的端口80映射到容器中的端口80,然后使用http://localhost
...
命中CTRL+C
在你的終點站辭職。
現(xiàn)在讓我們在后臺以分離模式運行該應(yīng)用程序:
docker run -d -p 4000:80 friendlyhello
你得到你的應(yīng)用程序的長容器ID,然后被踢回你的終端。您的容器正在后臺運行。您還可以看到縮寫的容器IDdocker container ls
%28并且在運行命令%29時兩者都可以互換工作:
$ docker container ls CONTAINER ID IMAGE COMMAND CREATED 1fa4ab2cf395 friendlyhello "python app.py" 28 seconds ago
你會看到的CONTAINER ID
匹配正在進行的http://localhost:4000
...
現(xiàn)在用docker stop
若要結(jié)束該進程,請使用CONTAINER ID
,就像這樣:
docker stop 1fa4ab2cf395
為了演示我們剛剛創(chuàng)建的圖像的可移植性,讓我們上傳構(gòu)建的映像并在其他地方運行它。畢竟,當(dāng)您想要將容器部署到生產(chǎn)中時,您將需要學(xué)習(xí)如何推送到注冊表。
注冊表是存儲庫的集合,存儲庫是圖像的集合--有點像GitHub存儲庫,只是代碼已經(jīng)構(gòu)建。注冊中心上的帳戶可以創(chuàng)建許多存儲庫。大docker
默認(rèn)情況下,CLI使用Docker的公共注冊表。
注:我們在這里使用Docker的公共注冊表,僅僅是因為它是免費的和預(yù)先配置的,但是有許多公共注冊表可供選擇,您甚至可以使用碼頭受信任登記處...
如果您沒有碼頭帳戶,請在Cloud.docker.com請記下你的用戶名。
登錄到本地計算機上的Docker公共注冊表。
docker login
將本地映像與注冊表上的存儲庫關(guān)聯(lián)的符號是username/repository:tag
標(biāo)記是可選的,但建議使用它,因為它是注冊表用于為Docker圖像提供一個版本的機制。為上下文提供存儲庫和標(biāo)記有意義的名稱,如get-started:part1
。這將把圖像放在get-started
存儲庫并將其標(biāo)記為part1
...
現(xiàn)在,把它放在一起標(biāo)記圖像。跑docker tag image
使用您的用戶名、存儲庫和標(biāo)簽名,以便圖像將上載到您想要的目的地。該命令的語法是:
docker tag image username/repository:tag
例如:
docker tag friendlyhello john/get-started:part1
跑碼頭形象才能看到你的新標(biāo)記圖像。%28你也可以使用docker image ls
.%29
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE friendlyhello latest d9e555c53008 3 minutes ago 195MB john/get-started part1 d9e555c53008 3 minutes ago 195MB python 2.7-slim 1c7128a655f6 5 days ago 183MB...
將標(biāo)記的圖像上載到存儲庫:
docker push username/repository:tag
一旦完成,這個上傳的結(jié)果是公開的。如果你登錄到碼頭樞紐,您將看到新的圖像,在那里,它的拉命令。
從現(xiàn)在開始,你可以用docker run
并使用以下命令在任何機器上運行您的應(yīng)用程序:
docker run -p 4000:80 username/repository:tag
如果映像在機器上本地不可用,Docker將從存儲庫中提取它。
docker image rm <image id>
$ docker run -p 4000:80 john/get-started:part1 Unable to find image 'john/get-started:part1' locally part1: Pulling from orangesnap/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:part1 * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
注*如果不指定
:tag
這些命令的一部分,標(biāo)記為:latest
將在構(gòu)建和運行映像時假設(shè)。Docker將使用沒有指定%28標(biāo)記而運行的映像的最后一個版本,而不一定是最近的映像%29。
不管在哪里docker run
執(zhí)行時,它將提取您的圖像以及Python和requirements.txt
運行你的代碼。所有這些都是在一個整潔的小包中一起運行的,主機只需要安裝Docker就可以運行它了。
這一頁就這么多了。在下一節(jié)中,我們將學(xué)習(xí)如何通過在服務(wù)...
繼續(xù)第3部分
這是本頁所涵蓋內(nèi)容的終端記錄*
下面列出了這個頁面中的基本Docker命令,以及一些相關(guān)的命令,如果您想在繼續(xù)之前進行一番探索的話。
docker build -t friendlyname . # Create image using this directory's Dockerfile docker run -p 4000:80 friendlyname # Run "friendlyname" mapping port 4000 to 80docker run -d -p 4000:80 friendlyname # Same thing, but in detached mode docker container ls # List all running containers docker container ls -a # List all containers, even those not running docker container stop <hash> # Gracefully stop the specified container docker container kill <hash> # Force shutdown of the specified container docker container rm <hash> # Remove specified container from this machine docker container rm $(docker container ls -a -q) # Remove all containers docker image ls -a # List all images on this machine docker image rm <image id> # Remove specified image from this machine docker image rm $(docker image ls -a -q) # Remove all images from this machine docker login # Log in this CLI session using your Docker credentials docker tag <image> username/repository:tag # Tag <image> for upload to registry docker push username/repository:tag # Upload tagged image to registry docker run username/repository:tag # Run image from a registry