偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

在AWS上運(yùn)行Docker:一個(gè)更好的開(kāi)發(fā)&測(cè)試體驗(yàn)

云計(jì)算
在軟件開(kāi)發(fā)過(guò)程中,這個(gè)問(wèn)題并不稀奇,開(kāi)發(fā)、測(cè)試、演示、生產(chǎn)環(huán)境中的微小的區(qū)別都會(huì)引起各種各樣的問(wèn)題,而之前的處理流程已經(jīng)適應(yīng)不了現(xiàn)在應(yīng)用程序快速的構(gòu)建和部署流程。我們需要的是將開(kāi)發(fā)環(huán)境與測(cè)試環(huán)境無(wú)縫對(duì)接,減少人工干涉以及配置。

假如你正在為一個(gè)跟蹤健康和健身的移動(dòng)應(yīng)用編寫(xiě)REST API。一開(kāi)始你在你的筆記本上的開(kāi)發(fā)環(huán)境中編寫(xiě)代碼,在運(yùn)行了所有單元測(cè)試并成功通過(guò)后,你將所有代碼提交到Git,并且通知QA工程師測(cè)試。然而,當(dāng)QA工程師認(rèn)真地將***版本代碼部署到測(cè)試環(huán)境后卻發(fā)現(xiàn),這個(gè)新開(kāi)發(fā)的REST程序往往連前幾分鐘的測(cè)試都通不過(guò)。

為什么會(huì)發(fā)生這樣的情況?你明明已經(jīng)完整的運(yùn)行了單元測(cè)試,而代碼移交給QA工程師之前又沒(méi)發(fā)生任何問(wèn)題。在與QA工程師一起奮斗數(shù)個(gè)小時(shí)后,你發(fā)現(xiàn)測(cè)試環(huán)境使用了一個(gè)過(guò)時(shí)版本的第三方庫(kù),而正是這個(gè)原因?qū)е铝四愕腞EST程序無(wú)法正常運(yùn)行。

在軟件開(kāi)發(fā)過(guò)程中,這個(gè)問(wèn)題并不稀奇,開(kāi)發(fā)、測(cè)試、演示、生產(chǎn)環(huán)境中的微小的區(qū)別都會(huì)引起各種各樣的問(wèn)題,而之前的處理流程已經(jīng)適應(yīng)不了現(xiàn)在應(yīng)用程序快速的構(gòu)建和部署流程。我們需要的是將開(kāi)發(fā)環(huán)境與測(cè)試環(huán)境無(wú)縫對(duì)接,減少人工干涉以及配置。

AWS為開(kāi)發(fā)者提供了自動(dòng)化構(gòu)建可靠及高效的開(kāi)發(fā)環(huán)境。類(lèi)似Amazon EC2和AWS CloudFormation等服務(wù)都允許開(kāi)發(fā)者們通過(guò)代碼的方式管理基礎(chǔ)設(shè)施。通過(guò)CloudFormation服務(wù),AWS資源可以使用JSON做預(yù)分配。CloudFormation模板可以在應(yīng)用程序代碼中正確的進(jìn)行描述,通過(guò)EC2的自動(dòng)化能力,用戶(hù)可以快速和可靠地新建及結(jié)束某個(gè)環(huán)境。正是基于這個(gè)原因,AWS非常適合開(kāi)發(fā)和測(cè)試工作。

類(lèi)似Docker之類(lèi)的容器技術(shù)讓資源配置聲明的理念成為現(xiàn)實(shí)。類(lèi)似CloudFormation提供給EC2實(shí)例的功能,Docker為容器建立提供了一個(gè)非常實(shí)用的聲明語(yǔ)法。同時(shí),Docker容器并不依賴(lài)任何虛擬化平臺(tái),或者一個(gè)專(zhuān)用的操作系統(tǒng)。容器的運(yùn)行僅僅需要一個(gè)Linux內(nèi)核,這就意味著它幾乎可以運(yùn)行在任何環(huán)境之下——不管是筆記本或者是EC2實(shí)例。
Docker容器的架構(gòu)如下圖所示:

Docker容器使用了一個(gè)被稱(chēng)為L(zhǎng)ibcontainer的執(zhí)行環(huán)境,它為不同的Linux內(nèi)核隔離特性提供了一個(gè)接口,類(lèi)似命名空間及控制組。這種架構(gòu)允許多個(gè)容器在共享同一個(gè)Linux內(nèi)核的情況下完全隔離地運(yùn)行。鑒于Docker容器并不需要一個(gè)專(zhuān)用的操作系統(tǒng),因此它比虛擬機(jī)更加的便捷和輕量。
Docker平臺(tái)架構(gòu)由下圖一系列組件組成:

Docker客戶(hù)端并不與運(yùn)行的容器直接通信,取而代之,它通過(guò)TCP Sockets或REST與Docker守護(hù)進(jìn)程通信,而守護(hù)進(jìn)程將與主機(jī)上的容器直接通信。同時(shí),Docker客戶(hù)端并不需要與守護(hù)進(jìn)程安裝在同一臺(tái)主機(jī)上。

在使用Docker時(shí)有3個(gè)理念必須理解:鏡像(image)、注冊(cè)表(registry)和容器(container)。

鏡像,用于建立容器組件,它是個(gè)只讀模板,使用它可以發(fā)布一個(gè)以上的容器實(shí)例。理論上說(shuō),它非常類(lèi)似于AMI。

Registry用于儲(chǔ)存鏡像,既可以在本地,也可以在遠(yuǎn)程。當(dāng)我們發(fā)布一個(gè)容器時(shí),Docker首先會(huì)在本地Registry上搜索鏡像。如果在本地Registry上沒(méi)有發(fā)現(xiàn),它隨后會(huì)搜索遠(yuǎn)程公用的Registry,也就是DockerHub。如果在DockerHub發(fā)現(xiàn)所需鏡像,Docker會(huì)將它下載到本地注冊(cè)表,并使用它來(lái)發(fā)布所需容器。DockerHub非常類(lèi)似于GitHub,我們可以使用它來(lái)建立公用或私有鏡像資源。鑒于這個(gè)屬性,有效及安全的鏡像發(fā)布將非常便捷。

可以這么說(shuō),容器運(yùn)行在一個(gè)鏡像的實(shí)例上,Docker使用容器來(lái)執(zhí)行和運(yùn)行打包在鏡像中的軟件。

你也可以為一個(gè)正在運(yùn)行的容器建立一個(gè)Docker鏡像,類(lèi)似為一個(gè)EC2實(shí)例建立AMI。舉個(gè)例子,用戶(hù)可以發(fā)布一個(gè)容器,并使用類(lèi)似APT或者YUM的包管理器安裝大量的軟件,然后將更新提交到一個(gè)新的Docker鏡像。

但是這里還存在更有效和靈活的途徑來(lái)建立鏡像,那就是使用Dockerfile,它允許聲明式的鏡像定義。Dockerfile語(yǔ)法由一系列的命令組成,我們可以用之安裝和配置鏡像中包括的各種組件。寫(xiě)一個(gè)Dockerfile就像茶余飯后使用UserData配置一個(gè)EC2實(shí)例那么簡(jiǎn)單。類(lèi)似一個(gè)CloudFormation模板,Dockerfile可以使用一個(gè)版本控制系統(tǒng)進(jìn)行跟蹤和發(fā)布,你可以將Dockerfile比作一個(gè)鏡像的建立文件。

那么在運(yùn)動(dòng)健身移動(dòng)應(yīng)用的打造中,Docker又會(huì)起到什么樣的作用?應(yīng)用程序架構(gòu)由下圖中的組件構(gòu)成:

#p#

首先,我們需要建立一個(gè)Docker鏡像,用于發(fā)布運(yùn)行中REST程序的容器。我們可以在筆記本上測(cè)試我們的代碼,而QA工程師則可以使用這個(gè)鏡像在EC2實(shí)例上對(duì)應(yīng)用程序進(jìn)行測(cè)試。REST程序使用Ruby和Sinatra框架編寫(xiě),因此它們需要被封裝到容器中。我們將使用Amazon DynamoDB作為后端,因此,為了保證應(yīng)用程序在AWS內(nèi)外都可以使用,Docker鏡像同樣需要封裝DynamoDB數(shù)據(jù)庫(kù)。這樣一來(lái),Dockerfile的代碼可能如下所示:

  1. FROM ubuntu:14.04 
  2. MAINTAINER Nate Slater <slatern@amazon.com> 
  3. RUN apt-get update && apt-get install -y curl wget default-jre git 
  4. RUN adduser --home /home/sinatra --disabled-password --gecos '' sinatra 
  5. RUN adduser sinatra sudo 
  6. RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers 
  7. USER sinatra 
  8. RUN curl -sSL https://get.rvm.io | bash-s stable 
  9. RUN /bin/bash -l -c "source /home/sinatra/.rvm/scripts/rvm" 
  10. RUN /bin/bash -l -c "rvm install 2.1.2" 
  11. RUN /bin/bash -l -c "gem install sinatra" 
  12. RUN /bin/bash -l -c "gem install thin" 
  13. RUN /bin/bash -l -c "gem install aws-sdk" 
  14. RUN wget -O /home/sinatra/dynamodb_local.tar.gz https://s3-us-west 
  15. -2.amazonaws.com/dynamodb-local/dynamodb_local_2013-12-12.tar.gz 
  16. RUN tar -C /home/sinatra -xvzf /home/sinatra/dynamodb_local.tar.gz 

DockefFile的內(nèi)容不再解釋了,RUN關(guān)鍵字用以執(zhí)行命令。默認(rèn)情況下,命令執(zhí)行在超級(jí)用戶(hù)權(quán)限下。鑒于需要使用RVM來(lái)安裝Ruby,我們需要使用USER關(guān)鍵字來(lái)轉(zhuǎn)換到Sinatra用戶(hù)權(quán)限,因此Ruby相關(guān)文件會(huì)安裝到用戶(hù)目錄下。從USER命令生效起,隨后的RUN命令都是使用Sinatra用戶(hù)權(quán)限來(lái)執(zhí)行。這同樣意味著,當(dāng)容器發(fā)布后,它也是以Sinatra用戶(hù)權(quán)限來(lái)執(zhí)行命令的。

Docker守護(hù)進(jìn)程負(fù)責(zé)管理鏡像與運(yùn)行容器,而Docker客戶(hù)端通常被用以將命令發(fā)送到守護(hù)進(jìn)程。因此在使用上文Dockerfile建立鏡像時(shí),我們需要執(zhí)行這個(gè)客戶(hù)端命令:

  1. $ docker build --tag=”aws_activate/sinatra:v1&quot; . 

在docker.io網(wǎng)站上,我們可以發(fā)現(xiàn)完整的Docker客戶(hù)端命令說(shuō)明文檔。下面,我們著重看一下建立鏡像所使用的命令。Tag選項(xiàng)用于在鏡像上建立識(shí)別符,其典型值是owner/repository:version。這樣一來(lái),我們可以輕易的識(shí)別鏡像中所包含的內(nèi)容,并且可以從注冊(cè)表中輕易的發(fā)現(xiàn)這個(gè)鏡像的所有權(quán)。

在執(zhí)行build命令后,我們可以在Dockerfile中使用聲明來(lái)?yè)碛幸粋€(gè)配置好的鏡像。Dockerfile如下:

  1. $ docker imagesREPOSITORY TAG IMAGE ID CREATED 
  2. VIRTUAL SIZE 
  3. aws_activate/sinatra v1 84b6d4a5a22b 
  4. 36 hours ago 942.2 MB 
  5. ubuntu 14.04 96864a7d2df3 
  6. 6 days ago 205.1 MB 

毫無(wú)疑問(wèn),我們可以看到Docker建立好了我們所需的鏡像,并給它分配tag中指定的所有權(quán),同時(shí)還會(huì)擁有一個(gè)唯一的鏡像ID?,F(xiàn)在,我們就可以通過(guò)新建立好的鏡像來(lái)發(fā)布容器:

  1. $ docker run -it aws_activate/sinatra:v1 /bin/bash 

運(yùn)行這個(gè)命令后,容器將成功發(fā)布,同時(shí)我們將進(jìn)入Bash shell。在Bash shell中,我們可以像與Linux服務(wù)器一樣與容器交互。鑒于我們建立的是一個(gè)Web應(yīng)用程序,我們會(huì)從Git repository中克隆***版本到容器,用以運(yùn)行我們的單元測(cè)試,并做好給QA傳送的準(zhǔn)備。當(dāng)代碼被克隆到容器之后,并且做好了被測(cè)試的準(zhǔn)備,我們會(huì)將運(yùn)行容器中所做的更新克隆到一個(gè)新的鏡像。為了完成這個(gè)步驟,我們需要確定容器的ID:

  1. $ docker ps 
  2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
  3. b9d03d60ba89 aws_activate/sinatra:v1 "/bin/bash" 11 minutes ago Up 
  4. 11 minutes nostalgic_davinci 

下一步,我們運(yùn)行提交命令:

  1. $ docker commit -m “ready for testing” b9d03d60ba89 
  2. aws_activate/sinatra:v1.1 

現(xiàn)在我們?cè)诒镜刈?cè)表中會(huì)擁有一個(gè)新的容器:

  1. $ docker imagesREPOSITORY TAG IMAGE ID CREATED 
  2. VIRTUAL SIZE 
  3. aws_activate/sinatra v1.1 40355be9eb8f 
  4. 21 hours ago 947.5 MB 
  5. aws_activate/sinatra v1 84b6d4a5a22b 
  6. 3 days ago 942.2 MB 
  7. ubuntu 14.04 96864a7d2df3 
  8. 8 days ago 205.1 MB 

Version 1.1版本鏡像擁有服務(wù)我們REST端點(diǎn)所需的Sinatra應(yīng)用程序。我們可以使用以下命令來(lái)運(yùn)行Web應(yīng)用程序:

  1. $ docker run -d -w /home/sinatra -p 10001:4567 
  2. aws_activate/sinatra:v1.1 ./run_app.sh 

上面命令告訴Docker需要做以下的工作:

  • 從鏡像aws_activate/sinatra:v1.1建立一個(gè)容器
  • (-d)表示以分離的形式運(yùn)行容器
  • 將工作路徑設(shè)置為/home/sinatra (-w)
  • 映射容器端口到主機(jī)端口4567——10001
  • 在容器中執(zhí)行一個(gè)叫做run_app.sh的shell script

這個(gè)shell script會(huì)在容器中啟動(dòng)DynamoDB,并且在4567下使用Thin網(wǎng)絡(luò)服務(wù)器的模式發(fā)布Sinatra應(yīng)用程序?,F(xiàn)在,如果我們?cè)谶\(yùn)行這個(gè)Docker容器的筆記本瀏覽器中指向http://localhost:10001/activity/1,我們將看到以下結(jié)果:

  1. {"activity_id":"1"
  2. "user_id":" db430d35-92a0-49d6-ba79-0f37ea1b35f7"
  3. "type":"meal"
  4. "calories":100
  5. "date":"2014-09-26 15:33:58 +0000"

我們的程序看起來(lái)運(yùn)行良好——活動(dòng)記錄從本地DynamoDB中取出,并從Sinatra應(yīng)用程序代碼中以JSON的格式返回。

如果想讓這個(gè)容器可以給QA工程師做進(jìn)一步測(cè)試,我們可以將之推送給DockerHub這個(gè)公用的注冊(cè)表。類(lèi)似GitHub,DockerHub提供了公用和私有兩個(gè)選項(xiàng),可以滿(mǎn)足這個(gè)容器不面向所有人的需求。

QA工程師將在EC2中運(yùn)行這個(gè)實(shí)例,這就意味著我們將需要一個(gè)配置了Docker守護(hù)進(jìn)程和客戶(hù)端軟件的EC2實(shí)例。假設(shè)需要使用CloudFormation啟動(dòng)一個(gè)EC2實(shí)例和CloudFormation表,我們可以借助CloudFormation AWS::EC2::Instance類(lèi)型的UserData屬性,使用Docker軟件安裝程序中的引導(dǎo)程序。CloudFormation中規(guī)定EC2實(shí)例的JSON文件可能擁有類(lèi)似如下代碼:

  1. "DockerInstance": { 
  2. "Type""AWS::EC2::Instance"
  3. "Properties": { 
  4. "InstanceType""t2.micro"
  5. "ImageId": {"Fn::FindInMap" : ["RegionMap",{"Ref" : 
  6. "AWS::Region"}, "64"]}, 
  7. "KeyName": {"Ref""KeyName"}, 
  8. "SubnetId": {"Ref""SubnetId"}, 
  9. "SecurityGroupIds": [{"Ref""SecurityGroupId"}], 
  10. "Tags": [{"Key""Name""Value""DockerHost"}], 
  11. "UserData": {"Fn::Base64"
  12. "#include https://get.docker.io" } 
  13. }} 

這樣一來(lái),如果QA工程師登入CloudFormation堆棧建立的EC2實(shí)例,鏡像可以使用如下命令從遠(yuǎn)程的DockerHub注冊(cè)表中取出:

  1. $ docker pull aws_activate/sinatra:v1.1 

這里從鏡像中啟動(dòng)容器的命令和上文沒(méi)太大的區(qū)別,有一個(gè)區(qū)別是環(huán)境變量會(huì)使用“-e”選項(xiàng)來(lái)設(shè)置,而Sinatra應(yīng)用程序則會(huì)被配置為“test”環(huán)境。這個(gè)配置將使用區(qū)域端點(diǎn)(regional endpoint)來(lái)連接DynamoDB,而不是本地端點(diǎn):

  1. $ docker run -d -w /home/sinatra –e “RACK_ENV=test” -p 10001:4567 
  2. aws_activate/sinatra:v1.1 ./run_app.sh  

到這里,QA工程師就可以通過(guò)HTTP在公共DNS(名稱(chēng)是EC2實(shí)例,端口號(hào)是10001)下訪問(wèn)REST端點(diǎn)。當(dāng)然,前提你還需要設(shè)置一個(gè)安全組規(guī)則,并允許10001端口訪問(wèn)。如果發(fā)現(xiàn)任何bug,運(yùn)行的容器可以提交到一個(gè)新的鏡像,指定一個(gè)合適的版本號(hào),并將之提交到注冊(cè)表。容器的狀態(tài)會(huì)被完整的保存,因此軟件工程師可以便捷的復(fù)制QA中發(fā)現(xiàn)的問(wèn)題,檢查日志文件并且做常規(guī)的排錯(cuò)。

我們希望通過(guò)本文讓用戶(hù)對(duì)Docker有一個(gè)很好的認(rèn)識(shí),同時(shí)也認(rèn)識(shí)到AWS和Docker的***兼容。Docker的可移植性讓它非常適合開(kāi)發(fā)和測(cè)試,因?yàn)槲覀兛梢栽诙鄠€(gè)團(tuán)隊(duì)中非常便捷的共享容器。EC2和CloudFormation***的支撐了容器在AWS中的運(yùn)行,但是AWS的便利絕不止于此。AWS ElasticBeanstalk,允許開(kāi)發(fā)者將整個(gè)應(yīng)用程序堆棧部署到Docker容器。經(jīng)常關(guān)注本網(wǎng)站,你將看到更多關(guān)于AWS中運(yùn)行Docker的博客。

原文鏈接:http://dockerone.com/article/177

責(zé)任編輯:Ophira 來(lái)源: dockerone
相關(guān)推薦

2014-05-26 09:13:46

DockerPython

2023-04-11 16:58:35

embark視頻

2021-11-23 09:20:25

Wine 6.22LinuxWindows

2024-01-18 09:47:23

云計(jì)算容器

2020-07-20 18:30:44

Fedora 32DockerLinux

2019-07-26 09:20:21

ClusterShel命令Linux

2018-12-14 16:06:11

大華AWS云計(jì)算

2021-04-26 14:02:37

AMD串流硬件

2024-02-28 07:48:05

Rust項(xiàng)目框架

2014-02-14 09:37:01

JavascriptDOM

2022-10-11 15:15:31

應(yīng)用開(kāi)發(fā)鴻蒙

2024-05-20 08:49:07

ArkUI鴻蒙應(yīng)用開(kāi)發(fā)

2013-03-08 11:00:41

IBMKVM

2018-01-10 12:09:12

Android開(kāi)發(fā)程序員

2017-03-03 10:40:41

2019-05-23 14:36:24

LinuxSOSReportxsos

2020-11-20 10:50:01

Docker容器

2020-03-31 09:47:04

Vue開(kāi)發(fā)代碼

2020-10-30 09:48:03

Hi3861開(kāi)發(fā)板get請(qǐng)求

2021-03-02 06:00:05

Docker.NET 5 Dockerfile
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)