Part 2: Containers

要求

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

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

介紹

是時候用Docker構建一個app了。我們會從構建這樣一個app的最底層開始,容器——我們這節所介紹的內容。在這層之上是服務,服務定義了容器們的在生產中的行為,在第3章介紹。最上層的是堆,定義了服務的交互行為,在第5章介紹。

  • 堆(Stack)

  • 服務(Services)

  • 容器(container)

新開發環境

使用docker,您可以直接獲取一個可移植的Python運行時作為映像。然后,您的構建可以在應用程序代碼旁邊包含基本的Python映像,確保應用程序、它的依賴項和運行時環境一起運行。

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

您是否使用了代理服務器?

代理服務器一旦啟動并運行,就可以阻塞連接到您的web應用程序。如果您在代理服務器后面,請在Dockerfile中添加以下幾行,使用ENV命令為您的代理服務器指定主機和端口:

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

這個Dockerfile和我們還沒有創建的兩個文件有聯系,即app.py和requirements.txt。接下來讓我們創建這些。

應用程序本身

創建兩個更多的文件,requirements.txt和app.py,并將它們放在與Dockerfile相同的文件夾中。這就完成了我們的應用程序,正如您所看到的非常簡單。當上述Dockerfile被構建成一個Image,由于Dockerfile的ADD命令會添加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 = "<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
就是這樣!您不需要Python或requirements.txt中的任何東西在你的系統上,也不會在你的系統上安裝或運行這個映像。看起來你并沒有真正建立一個包含Python和Flask的環境,但是你有。

構建應用

我們已經準備好構建應用程序,確保您仍然處于新目錄的頂層。下面是ls應該展示的:

$ ls
Dockerfile        app.py            requirements.txt

現在運行build命令。這創建了一個Docker映像,我們將使用- t標記它,因此它有一個友好的名稱。

docker build -t friendlyhello .

你的構建的Image在哪里?就在你的機器的本地Docker圖像注冊表中:

$ docker imagesREPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea398

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

運行應用

運行應用程序,使用-p,將您的機器的端口4000映射到容器已經發布的端口80:

docker run -p 4000:80 friendlyhello

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

clipboard.png

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

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

$ 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是為了演示在Dockerfile中公開的內容和使用docker run - p發布的內容之間的區別。在后面的步驟中,我們將把端口80映射到容器中的80端口,并使用http://localhost。
在你的終端按CTRL + C退出。

現在讓我們在后臺運行應用程序,在分離的模式下:

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

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

現在使用docker容器停止進程,使用容器ID,例如:

docker container stop 1fa4ab2cf395

分享你的鏡像

為了演示我們剛剛創建的可移植性,讓我們上傳我們構建的映像并在其他地方運行它。畢竟,當您想要將容器部署到生產時,您需要學習如何推動注冊。

注冊表是存儲庫的集合,而存儲庫是鏡像的集合——有點像GitHub庫,只是代碼已經構建好了。注冊表上的帳戶可以創建許多存儲庫。docker CLI在默認情況下使用docker的公共注冊表。

注意:我們將在這里使用Docker的公共注冊表,因為它是免費和預配置的,但是有許多公共注冊中心可供選擇,而且您甚至可以使用Docker可信注冊表建立您自己的私有注冊表。

使用您的Docker ID登錄

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

登錄到本地機器上的Docker公共注冊表。

$ docker login

標記鏡像

將本地映像與注冊表中的存儲庫關聯的符號是username/repository:tag。標簽是可選的,但推薦,因為它是注冊中心用來給Docker映像提供一個版本的機制。提供存儲庫并為上下文標記有意義的名稱,例如get - started:part2。這將把鏡像放到get-started存儲庫中,并將其標記為part2。

docker tag image username/repository:tag

例如:

docker tag image username/repository:tag

運行docker image以查看新標記的圖像。(您也可以使用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)

注意:如果您沒有指定這些命令的標記部分:tag,那么將會假定您在構建和運行映像時都將使用最新的標記:latest。Docker將使用沒有指定標記的圖像的最后一個版本(不一定是最近的圖像)。

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540105.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540105.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540105.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

(論文)WS-DAN (弱監督數據增強)

背景 近期在做外賣分類的項目&#xff0c;外賣分類屬于細粒度圖像分類&#xff0c;在分類的過程中要從圖片的行人中和非機動車中區分出各類外賣&#xff08;主要是美團、餓了嗎&#xff09;。剛好近期發現了一片關于細粒度圖像分類較新的論文&#xff08;See Better Before Lo…

羅馬音平假名片假名轉換器_關于五十音你所要知道的一切!文末附日網高清字帖...

今天開始&#xff0c;木子小花日本語教室將開始同時更新日語文法系列文章 和 日語真題詳解系列文章&#xff0c;從五十音圖的記憶方法到日語助詞的用法整理&#xff0c;從N5的簡單句子構成到N1復雜文法的接續記憶方法&#xff0c;力求做出全知乎&#xff08;小聲&#xff1a;全…

django的web開發筆記1(智能診斷系統數據概覽記錄)

接于上一篇&#xff0c;這一篇主要記錄如何鏈接mysql數據庫以及從數據庫中調用數據信息到頁面&#xff0c;同時包含百度地圖api的一些使用。 其中包括模塊&#xff0c;echert圖表繪制數據調用&#xff0c;百度地圖數據信息調用以及一些單機效果&#xff0c;頁面數據調用等。 1…

Spring中應用反射機制淺析

我們知道,Spring中大量使用了反射機制&#xff0c;那么究竟是什么地方使用了呢&#xff1f;就從源頭說起吧。 一 反射源頭Class類 對類的概念我們已經非常熟悉了。比如可以有Student這個類&#xff0c;Person這個類。但是我們要知道&#xff0c;有一個叫Class的類&#xff0c;…

ios nslog 例子_iOS開發-使用宏自定義輸出(NSLog)

前言&#xff1a;1)輸出日志是會大量損耗系統性能2)輸出的信息很容易會被截取到&#xff0c;導致信息不安全。所以我們會在發行版(Release)取消所有的Log。如果一行一行地去注釋掉Log&#xff0c;顯然不是一個明確的選擇。因此我們可以使用宏去自定義Log輸出。最簡單的一個例子…

python小技巧積累--題庫(持續更新)

介紹 作為一名程序員&#xff0c;除了需要具備解決問題的思路以外&#xff0c;代碼的質量和簡潔性也很關鍵。 python內置庫中就有很多簡潔而又優雅的操作&#xff0c;這里的知識都來源于網絡積累&#xff0c; 閑暇時整理下來方便溫故。目錄 >選擇正確的內置功能 使用enum…

提高SQL執行性能方案:如何讓你的SQL運行得更快

---- 人們在使用SQL時往往會陷入一個誤區&#xff0c;即太關注于所得的結果是否正確&#xff0c;而忽略了不同的實現方法之間可能存在的性能差異&#xff0c;這種性能差異在大型的或是復雜的數據庫環境中&#xff08;如聯機事務處理OLTP或決策支持系統DSS&#xff09;中表現得尤…

休眠后gpio狀態_STM32中GPIO的8種工作模式總結

STM32中GPIO的8種工作模式總結一、推挽輸出&#xff1a;可以輸出高、低電平&#xff0c;連接數字器件;推挽結構一般是指兩個三極管分別受兩個互補信號的控制&#xff0c;總是在一個三極管導通的時候另一個截止。高低電平由IC的電源決定。形象點解釋&#xff1a;推挽&#xff0c…

Ubuntu16.04 下 tensorRT安裝

環境準備 主要是根據工程環境需要&#xff0c;參考trt文檔安裝trt 1.查看trt適配情況 &#xff1a;鏈接跳轉&#xff0c;注意&#xff0c;不同版本的trt有不同版本的文檔&#xff0c;請以最新文檔為準。 2.根據自己系統情況下載相關包 因為我自己拉的docker鏡像是ubuntu16.04…

左右xcode的重構選項的一些理解

Rename(重命名):對標示符進行重命名,以獲得更好的代碼可讀性,這些標示符包含類,方法或者函數的名稱. Extract(抽取):將你在XCode種選擇的代碼抽取到一個新的方法或函數中. Create SuperClass(創建父類):為Xcode中當前所選的類定義父類 Move Up(上移):將所選擇的方法,屬性,或實例…

window 如何查看tomcat 實時日志_如何處理生產環境Tomcat的catalina.out日志?

前語&#xff1a;不要為了讀文章而讀文章&#xff0c;一定要帶著問題來讀文章&#xff0c;勤思考。作者&#xff1a;jmcui 來源&#xff1a;http://1t.click/x4q# 前言隨著每天業務的增長&#xff0c;Tomcat 的catalina.out日志 變得越來越大&#xff0c;占用磁盤空間不說。要…

zabbix的agent端的主動模式關鍵三個參數

如多主機超過300和隊列內容過多,就采用主動模式. [rootweb03 zabbix]# egrep -v "^#|^$" zabbix_agentd.conf PidFile/var/run/zabbix/zabbix_agentd.pid LogFile/var/log/zabbix/zabbix_agentd.log LogFileSize0 StartAgents0 ServerActive172.16.1.8 Hostnameweb03…

opencv 繪制坐標曲線_OpenCV手工實現灰度及RGB直方圖

#include #include#include#include#include#include#include#include#includeusing namespacecv;using namespacestd;//單通道圖片直方圖繪制void drawHist(vectornums){Mat hist Mat::zeros(600, 800, CV_8UC3);auto Max max_element(nums.begin(), nums.end());//max迭代器類…

onnx 測試_用于ONNX的TensorRT后端

用于ONNX的TensorRT后端解析ONNX模型以使用TensorRT執行。另請參閱TensorRT文檔。有關最近更改的列表&#xff0c;請參見changelog。支持的TensorRT版本Master分支上的開發適用于具有完整維度和動態架構shape支持的TensorRT 7.2.1的最新版本。對于TensorRT的早期版本&#xff0…

paddlepaddle測試安裝_百度paddlepaddle深度學習7日入門-CV疫情特輯心得

正值疫情嚴重之日&#xff0c;作為一名研究生被迫待在家里學習&#xff0c;手頭的科研項目也嚴重受挫。。。偶然間&#xff0c;看到微信公眾號發布這門課&#xff0c;馬上報名&#xff0c;入坑&#xff01;&#xff01;&#xff01;瞬間疫情其間有學習的目標了。。該課程學習依…

apache目錄 vscode_VsCode搭建Java開發環境(Spring Boot項目創建、運行、調試)

VsCode搭建Java開發環境(Spring Boot項目創建、運行、調試)安裝如下兩個主要擴展即可&#xff0c;這兩個擴展已關聯java項目開發主要使用的maven、springboot等所需要的擴展。開始步驟&#xff1a;在 Visual Studio Code 中打開擴展視圖(CtrlShiftX)。輸入“java”搜索商店擴展…

android dp轉px的公式_Android特效專輯——自定義不一樣的Toast

大家都知道&#xff0c;Android的控件有時候很難滿足我們的需求&#xff0c;所以我們需要自定義View。自定義的方式很多&#xff0c;有繼承原生控件也有直接自定義View的&#xff0c;今天寫的是自定義的Toast&#xff0c;當然&#xff0c;這個不是復寫Toast,是換一種表達形式&a…

code iban 是有什么組成_深入淺出Zookeeper(四):客戶端的請求在服務器中經歷了什么...

作者 泊浮目 沃趣科技高級研發工程師出品 沃趣科技1. 前言當我們向zk發出一個數據更新請求時&#xff0c;這個請求的處理流程是什么樣的&#xff1f;zk又是使用了什么共識算法來保證一致性呢&#xff1f;帶著這些問題&#xff0c;我們進入今天的正文。2. 設計模式&#xff1…

Centos7: 配置IO調度

今天有同事問我個問題&#xff1a;“CentOS7如何修改IO默認的調度”&#xff0c;我這里簡單整理下如何調整的方法&#xff1a; 1、查看CentOS7下IO支持的調度 1234[rootkvm02 ~]# dmesg | grep -i scheduler [ 16.900459] io scheduler noop registered[ 16.900473] io sch…

啟動activemq_「Java」 - SpringBoot amp; ActiveMQ

一、消息隊列消息隊列中間件是分布式系統中重要的組件&#xff0c;主要解決應用耦合、異步消息、流量削鋒等問題&#xff0c;實現高性能、高可用、可伸縮和最終一致性架構&#xff0c;是大型分布式系統不可缺少的中間件。目前在生產環境中使用較多的消息隊列有ActiveMQ、Rabbit…