成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Part 2: Containers

Soarkey / 799人閱讀

摘要:在默認(rèn)情況下使用的公共注冊(cè)表。注意我們將在這里使用的公共注冊(cè)表,因?yàn)樗敲赓M(fèi)和預(yù)配置的,但是有許多公共注冊(cè)中心可供選擇,而且您甚至可以使用可信注冊(cè)表建立您自己的私有注冊(cè)表。標(biāo)記鏡像將本地映像與注冊(cè)表中的存儲(chǔ)庫關(guān)聯(lián)的符號(hào)是。

要求

安裝了1.13或者更高版本的Docker

閱讀了Part1中的定位(我沒寫)

介紹

是時(shí)候用Docker構(gòu)建一個(gè)app了。我們會(huì)從構(gòu)建這樣一個(gè)app的最底層開始,容器——我們這節(jié)所介紹的內(nèi)容。在這層之上是服務(wù),服務(wù)定義了容器們的在生產(chǎn)中的行為,在第3章介紹。最上層的是堆,定義了服務(wù)的交互行為,在第5章介紹。

堆(Stack)

服務(wù)(Services)

容器(container)

新開發(fā)環(huán)境

使用docker,您可以直接獲取一個(gè)可移植的Python運(yùn)行時(shí)作為映像。然后,您的構(gòu)建可以在應(yīng)用程序代碼旁邊包含基本的Python映像,確保應(yīng)用程序、它的依賴項(xiàng)和運(yùn)行時(shí)環(huán)境一起運(yùn)行。

Dockerfile定義一個(gè)容器

Dockerfile將定義容器內(nèi)環(huán)境的內(nèi)容。訪問像網(wǎng)絡(luò)接口和磁盤驅(qū)動(dòng)器之類的資源在這個(gè)環(huán)境中是虛擬化的,這與系統(tǒng)的其他部分是隔離的,因此您必須將端口映射到外部世界,并具體地說明您想要“復(fù)制”到該環(huán)境中的文件。然而,在做了這些之后,您可以期望在這個(gè)Dockerfile中定義的應(yīng)用程序的構(gòu)建在運(yùn)行的任何地方都是完全相同的。

Dockerfile

創(chuàng)建一個(gè)空目錄。將目錄(cd)更改為新目錄,創(chuàng)建一個(gè)名為Dockerfile的文件,將以下內(nèi)容復(fù)制粘貼到該文件中,并保存它。注意在新Dockerfile中解釋每個(gè)語句的注釋。

# 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"]
您是否使用了代理服務(wù)器?

代理服務(wù)器一旦啟動(dòng)并運(yùn)行,就可以阻塞連接到您的web應(yīng)用程序。如果您在代理服務(wù)器后面,請(qǐng)?jiān)贒ockerfile中添加以下幾行,使用ENV命令為您的代理服務(wù)器指定主機(jī)和端口:

# Set proxy server, replace host:port with values for your servers
ENV http_proxy host:port
ENV https_proxy host:port

這個(gè)Dockerfile和我們還沒有創(chuàng)建的兩個(gè)文件有聯(lián)系,即app.py和requirements.txt。接下來讓我們創(chuàng)建這些。

應(yīng)用程序本身

創(chuàng)建兩個(gè)更多的文件,requirements.txt和app.py,并將它們放在與Dockerfile相同的文件夾中。這就完成了我們的應(yīng)用程序,正如您所看到的非常簡單。當(dāng)上述Dockerfile被構(gòu)建成一個(gè)Image,由于Dockerfile的ADD命令會(huì)添加requirements.txt和app.py,感謝EXPOSE使app.py的輸出可以通過HTTP訪問。

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 = "

Hello {name}!

" "Hostname: {hostname}
" "Visits: {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()的輸出。最后,因?yàn)镽edis沒有運(yùn)行(因?yàn)槲覀冎话惭b了Python庫,而不是Redis本身),我們應(yīng)該期望在這里使用它的嘗試會(huì)失敗并產(chǎn)生錯(cuò)誤消息。

注意:當(dāng)容器內(nèi)檢索容器ID時(shí)訪問主機(jī)名,這就像運(yùn)行可執(zhí)行文件的進(jìn)程ID
就是這樣!您不需要Python或requirements.txt中的任何東西在你的系統(tǒng)上,也不會(huì)在你的系統(tǒng)上安裝或運(yùn)行這個(gè)映像。看起來你并沒有真正建立一個(gè)包含Python和Flask的環(huán)境,但是你有。

構(gòu)建應(yīng)用

我們已經(jīng)準(zhǔn)備好構(gòu)建應(yīng)用程序,確保您仍然處于新目錄的頂層。下面是ls應(yīng)該展示的:

$ ls
Dockerfile        app.py            requirements.txt

現(xiàn)在運(yùn)行build命令。這創(chuàng)建了一個(gè)Docker映像,我們將使用- t標(biāo)記它,因此它有一個(gè)友好的名稱。

docker build -t friendlyhello .

你的構(gòu)建的Image在哪里?就在你的機(jī)器的本地Docker圖像注冊(cè)表中:

$ docker images

REPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea398

提示:您可以使用命令docker images或較新的docker image ls查看所有的鏡像。它們給出相同的輸出。

運(yùn)行應(yīng)用

運(yùn)行應(yīng)用程序,使用-p,將您的機(jī)器的端口4000映射到容器已經(jīng)發(fā)布的端口80:

docker run -p 4000:80 friendlyhello

您應(yīng)該看到一條消息,Python正在以http://0.0.0.0:80為您的應(yīng)用服務(wù)。但是這個(gè)消息來自容器內(nèi)部,它不知道您將該容器的80端口映射到4000,從而使正確的URL http://localhost:4000。
在web瀏覽器中訪問該URL,可以看到web頁面上顯示的顯示內(nèi)容,包括“Hello World”文本、容器ID和Redis錯(cuò)誤消息。

注意:如果您在Windows 7上使用Docker工具,使用Docker機(jī)器IP而不是localhost。例如,http://192.168.99.100:4000。要查看IP地址,請(qǐng)使用命令docker -machine IP。

您還可以在shell中使用curl命令來查看相同的內(nèi)容。

$ curl http://localhost:4000

Hello World!

Hostname: 8fc990912a14
Visits: cannot connect to Redis, counter disabled

這個(gè)端口映射4000:80是為了演示在Dockerfile中公開的內(nèi)容和使用docker run - p發(fā)布的內(nèi)容之間的區(qū)別。在后面的步驟中,我們將把端口80映射到容器中的80端口,并使用http://localhost。
在你的終端按CTRL + C退出。

現(xiàn)在讓我們?cè)诤笈_(tái)運(yùn)行應(yīng)用程序,在分離的模式下:

docker run -d -p 4000:80 friendlyhello

你得到了你的應(yīng)用程序的容器長ID,然后被離開你的終端。您的容器將在后臺(tái)運(yùn)行。您還可以看到縮寫容器ID通過docker container ls(在運(yùn)行命令時(shí),這兩個(gè)工作都可以互換):

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED
1fa4ab2cf395        friendlyhello       "python app.py"     28 seconds ago

您將看到匹配http://localhost:4000上的CONTAINER ID

現(xiàn)在使用docker容器停止進(jìn)程,使用容器ID,例如:

docker container stop 1fa4ab2cf395
分享你的鏡像

為了演示我們剛剛創(chuàng)建的可移植性,讓我們上傳我們構(gòu)建的映像并在其他地方運(yùn)行它。畢竟,當(dāng)您想要將容器部署到生產(chǎn)時(shí),您需要學(xué)習(xí)如何推動(dòng)注冊(cè)。

注冊(cè)表是存儲(chǔ)庫的集合,而存儲(chǔ)庫是鏡像的集合——有點(diǎn)像GitHub庫,只是代碼已經(jīng)構(gòu)建好了。注冊(cè)表上的帳戶可以創(chuàng)建許多存儲(chǔ)庫。docker CLI在默認(rèn)情況下使用docker的公共注冊(cè)表。

注意:我們將在這里使用Docker的公共注冊(cè)表,因?yàn)樗敲赓M(fèi)和預(yù)配置的,但是有許多公共注冊(cè)中心可供選擇,而且您甚至可以使用Docker可信注冊(cè)表建立您自己的私有注冊(cè)表。

使用您的Docker ID登錄

如果你沒有Docker帳戶,在cloud.docker.com注冊(cè)一個(gè)。記下你的用戶名。

登錄到本地機(jī)器上的Docker公共注冊(cè)表。

$ docker login
標(biāo)記鏡像

將本地映像與注冊(cè)表中的存儲(chǔ)庫關(guān)聯(lián)的符號(hào)是username/repository:tag。標(biāo)簽是可選的,但推薦,因?yàn)樗亲?cè)中心用來給Docker映像提供一個(gè)版本的機(jī)制。提供存儲(chǔ)庫并為上下文標(biāo)記有意義的名稱,例如get - started:part2。這將把鏡像放到get-started存儲(chǔ)庫中,并將其標(biāo)記為part2。

docker tag image username/repository:tag

例如:

docker tag image username/repository:tag

運(yùn)行docker image以查看新標(biāo)記的圖像。(您也可以使用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
...
發(fā)布鏡像

將您的標(biāo)記鏡像上載到存儲(chǔ)庫

docker push username/repository:tag

一旦完成,這個(gè)上傳的結(jié)果是公開的。如果您登錄到Docker Hub,您將在那里看到新的圖像,使用它的pull命令。

從遠(yuǎn)程存儲(chǔ)庫中提取和運(yùn)行映像

從現(xiàn)在開始,你可以使用docker run在任何機(jī)器上運(yùn)行你的應(yīng)用程序:

docker run -p 4000:80 username/repository:tag

如果映像在機(jī)器上沒有本地可用,Docker將從存儲(chǔ)庫中提取該映像。

$ 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)

注意:如果您沒有指定這些命令的標(biāo)記部分:tag,那么將會(huì)假定您在構(gòu)建和運(yùn)行映像時(shí)都將使用最新的標(biāo)記:latest。Docker將使用沒有指定標(biāo)記的圖像的最后一個(gè)版本(不一定是最近的圖像)。

無論docker運(yùn)行在哪里,它都會(huì)拉出您的映像,以及Python以及來自需求的所有依賴項(xiàng)requirements.txt,并運(yùn)行您的代碼。它在一個(gè)整潔的小程序包中一起運(yùn)行,而主機(jī)不需要安裝任何東西,而是安裝Docker來運(yùn)行它。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/27113.html

相關(guān)文章

  • Docker 系列教程,Part 8: Docker Remote API

    摘要:注這篇文章是系列教程中的一篇,本篇文章由發(fā)布,原文地址在前面的文章中,作為正在進(jìn)行的教程系列的一部分,我們討論了。這個(gè)系列的其他教程 注:這篇文章是系列教程中的一篇,本篇文章由 Flux7 Labs 發(fā)布,原文地址 Docker Tutorial Series, Part 8: Docker Remote API 在前面的文章中,作為正在進(jìn)行的 Docker 教程系列的一部分...

    姘擱『 評(píng)論0 收藏0
  • Laravel Container (容器) 概念詳解 (上)

    摘要:上文書,創(chuàng)建對(duì)象需要先創(chuàng)建對(duì)象。創(chuàng)建對(duì)象的雜活是嵌入在中的。對(duì)象使用來管理依賴關(guān)系非常好,但不是必須的。很容易實(shí)現(xiàn),但手工維護(hù)各種亂七八糟的對(duì)象還是很麻煩。所有文章均已收錄至項(xiàng)目。 本文翻譯自 Symfony 作者 Fabien Potencier 的 《Dependency Injection in general and the implementation of a Depend...

    FullStackDeveloper 評(píng)論0 收藏0
  • 從頭開始,徹底理解服務(wù)端渲染原理(8千字匯總長文)

    摘要:到此,就初步實(shí)現(xiàn)了一個(gè)組件是服務(wù)端渲染。服務(wù)端渲染完成頁面結(jié)構(gòu),瀏覽器端渲染完成事件綁定。但是,在服務(wù)端渲染中卻出現(xiàn)了問題。根據(jù)這個(gè)思路,服務(wù)端渲染中異步數(shù)據(jù)的獲取功能就完成啦。 大家好,我是神三元,這一次,讓我們來以React為例,把服務(wù)端渲染(Server Side Render,簡稱SSR)學(xué)個(gè)明明白白。 這里附上這個(gè)項(xiàng)目的github地址:https://github.com/...

    hiyang 評(píng)論0 收藏0
  • Flux7 Docker 系列教程(八):Docker Remote API

    摘要:本系列教程翻譯自,系列共有九篇,本文譯自第八篇。是將會(huì)用來取代命令的工具。準(zhǔn)備示例系統(tǒng)是,配置文件在。修改完畢后,重啟。列出所有容器創(chuàng)建新容器檢查容器用于獲取容器底層信息。進(jìn)程列表獲取容器內(nèi)運(yùn)行進(jìn)程的列表。下篇文章介紹的是用于鏡像操作的。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自第八篇 Part 8: Docker Rem...

    geekidentity 評(píng)論0 收藏0
  • Flux7 Docker 系列教程(八):Docker Remote API

    摘要:本系列教程翻譯自,系列共有九篇,本文譯自第八篇。是將會(huì)用來取代命令的工具。準(zhǔn)備示例系統(tǒng)是,配置文件在。修改完畢后,重啟。列出所有容器創(chuàng)建新容器檢查容器用于獲取容器底層信息。進(jìn)程列表獲取容器內(nèi)運(yùn)行進(jìn)程的列表。下篇文章介紹的是用于鏡像操作的。 本系列教程翻譯自 Flux7 Docker Tutorial Series,系列共有九篇,本文譯自第八篇 Part 8: Docker Rem...

    philadelphia 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<