0x2 Docker系列:Docker官方文檔翻譯2

      網友投稿 661 2025-04-02

      1??? 容器

      1.1 準備工作

      ·????? 安裝docker,版本為1.13或者1.13之上。

      ·????? 閱讀第一篇文章的內容

      ·????? 給你的docker環境一個快速的測試,確保所有的工作準備就緒:

      docker run hello-world

      1.2 介紹

      是時候以Docker的方式開始構建一個應用程序了。我們從這個層次結構的底部開始,即它是一個容器,這是我們在這個界面上介紹的。在這個層次(容器?)之上是一個服務,它定義了容器在生產環境中的表現行為,在下一篇文章中我們會進行探討。最后,在頂層是堆棧,定義了第5篇文章中介紹的所有服務的交互。

      ·????? 堆棧(第五篇文章介紹)

      ·????? 服務(第三篇文章介紹)

      ·????? 容器(這篇文章介紹,you are here)

      1.3 你的新的開發環境

      在過去,如果你寫一個pyhton的應用,你的第一步是在你的機器上安裝python的開發環境。但是需要你的機器上的運行環境與應用程序完美適合,并且也需要匹配生產環境。

      利用docker,你能移植一個便捷的python的運行庫作為鏡像,無需安裝。然后,通過構建包含python運行環境和你的應用代碼一起的鏡像,能夠確保你的代碼和運行環境完美結合并運行。

      這些便捷的鏡像通過被稱作DockeFile的文件定義。

      1.4 通過Dockerfile定義一個鏡像

      dockerfile定義了在容器內部跑什么運行環境。訪問網絡接口和磁盤驅動器等資源是在此環境中虛擬化的,與系統其余部分隔離,因此你需要將端口映射到外部世界,并明確要將哪些文件“復制”到 運行的環境。 然而,在完成這些之后,你可以預期,在此Dockerfile中定義的應用程序的構建在運行時的行為完全相同。

      1.4.1 Dockerfile

      創建一個空的文件夾。通過cd命令進入到新創建的文件夾,創建一個文件取名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關聯了2個我們還沒有創建的文件,,即app.py和requirements.txt。下面我們來創建。

      1.5 應用程序部分

      創建2個文件,requirements.txt和app.py,并且將它們放到和Dockerfile放進同一個文件夾中。這就完成了我們的應用,你可以發現用創建應用很簡單。當上面的Dockerfile構建成鏡像,app.py和requirements.txt通過Add命令加入到鏡像去了,Expose命令能夠暴露端口,可以通過http訪問。

      1.5.1 requirements.txt

      Flask

      Redis

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

      現在我們看到pip install -r requirements.txt為Python安裝Flask和Redis庫,并且該應用程序打印環境變量NAME以及調用socket.gethostname()的輸出。 最后,因為Redis沒有運行(因為我們只安裝了Python庫,而不是Redis本身),所以我們應該期望在這里嘗試使用它會失敗并產生錯誤消息。

      那正是要點! 您的系統上不需要Python或任何requirements.txt文件,也不需要在您的系統上安裝或運行此映像。看起來你并沒有真正用Python和Flask建立一個環境,但是你已經擁有了。

      1.6 構建應用

      我們已經為構建應用做好了準備。確保你對新建的文件與最高的權限。下面是通過ls命令,應該顯示以下內容:

      $?ls

      Dockerfile????????app.py????????????requirements.txt

      現在運行構建命令。創建一個Docker鏡像,通過-t標記,從而使鏡像有一個友好的名字。

      docker?build?-t?friendlyhello?.

      你構建的鏡像在哪里?在你的機器的本地Docker鏡像注冊庫“

      $?docker?image?ls

      REPOSITORY????????????TAG?????????????????IMAGE?ID

      friendlyhello?????????latest??????????????326387cea398

      1.6.1 運行應用

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

      docker?run?-p?4000:80?friendlyhello

      你應該在http://0.0.0.0:80看到一條消息,Python正在為你的應用程序提供服務。 但是該消息來自容器內部,它不知道將該容器的端口80映射到4000,

      在瀏覽器中http://localhost:4000 可以查看網頁上顯示的顯示內容。

      你也可以通過curl命令查看相同的內容:

      $?curl?http://localhost:4000

      Hello?World!

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

      這個4000:80的端口重映射是為了演示Dockerfile中的EXPOSE與使用docker run -p發布的內容之間的區別。 在后面的步驟中,我們只需將主機上的端口80映射到容器中的端口80并使用http:// localhost。

      按CTRL+C結束進程。

      現在可以讓應用程序在后端進程中運行,用detached 模式。

      docker?run?-d?-p?4000:80?friendlyhello

      你可以獲取應用的容器ID,通過容器ID將應用程序停止。 容器正在后臺運行。 可以使用docker container ls命令查看縮寫的容器ID:

      $?docker?container?ls

      CONTAINER?ID????????IMAGE???????????????COMMAND?????????????CREATED

      1fa4ab2cf395????????friendlyhello???????"python?app.py"?????28?seconds?ago

      現在用docker containner stop 命令結束進程,需要用到 container id,如下:

      docker?container?stop?1fa4ab2cf395

      1.7 分享你的鏡像:

      為了演示我們剛才創建的容器具有可移植性,我們上傳我們構建的映像并可以在其他的任何地方運行。 畢竟,當你想要將容器部署到生產環境時,弄需要知道如何推送注冊倉庫。

      0x2 Docker系列:Docker官方文檔翻譯2

      注冊倉庫是存儲庫的集合,而存儲庫是圖像的集合 - 有點像GitHub存儲庫,但代碼已經創建。 注冊倉庫上的帳戶可以創建許多存儲庫。 docker CLI默認使用Docker的公共注冊庫。

      1.8 登錄dokcer Id

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

      登錄到本地計算機上的Docker公共注冊庫。

      $?docker?login

      1.9 標記鏡像

      將本地映像與注冊庫中的存儲庫相關聯的命令是username / repository:tag。 該標簽是可選的,但建議使用,因為它是注冊管理機構用于為Docker鏡像提供版本的機制。 為該上下文提供存儲庫并標記有意義的名稱,例如get-started:part2。 這將圖像放入啟動存儲庫并將其標記為part2。

      現在,把它放在一起來標記圖像。使用你的用戶名,存儲庫和標簽名稱運行碼頭標簽圖像,以便將圖像上傳到您想要的目的地。 該命令的語法是:

      docker?tag?image?username/repository:tag

      比如:

      docker?tag?friendlyhello?john/get-started:part2

      運行 docker image ls 命令去查看你的新的標記的鏡像。

      $?docker?image?ls

      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

      ...

      1.10 推送鏡像

      上傳你的標記的鏡像去倉庫

      docker?push?username/repository:tag

      完成后,此上傳的結果將公開發布。 如果你登錄到Docker Hub,則可以通過其pull命令在那里看到新映像。

      1.11 從遠程倉庫獲取并運行鏡像

      從現在起,你可以使用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。

      1.12 總結

      這就是這個頁面的內容。 在下一節中,我們將學習如何通過在服務中運行此容器來擴展我們的應用程序。

      1.13 命令復習

      這里列出了這個頁面的基本Docker命令,以及一些相關的命令,如果你想在繼續之前探索一下。

      ocker?build?-t?friendlyhello?.??#?Create?image?using?this?directory's?Dockerfile

      docker?run?-p?4000:80?friendlyhello??#?Run?"friendlyname"?mapping?port?4000?to?80

      docker?run?-d?-p?4000:80?friendlyhello?????????#?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????????????#?Gracefully?stop?the?specified?container

      docker?container?kill??????????#?Force?shutdown?of?the?specified?container

      docker?container?rm?????????#?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?????????????#?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??username/repository:tag??#?Tag??for?upload?to?registry

      docker?push?username/repository:tag????????????#?Upload?tagged?image?to?registry

      docker?run?username/repository:tag

      Docker

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Python:Peewee實踐記錄
      下一篇:怎么在Excel2013表格中插入可視化地圖(Excel可視化地圖)
      相關文章
      国产亚洲精品一品区99热| 亚洲成在人线aⅴ免费毛片| 亚洲精品宾馆在线精品酒店| 亚洲激情中文字幕| 亚洲AV永久无码区成人网站| 国产综合精品久久亚洲| 国产精品亚洲综合专区片高清久久久 | 亚洲欧洲精品一区二区三区| 久久久亚洲精品无码| 亚洲国产AV无码专区亚洲AV| 久久亚洲伊人中字综合精品| 亚洲va无码手机在线电影| 亚洲人精品午夜射精日韩| 久久久精品国产亚洲成人满18免费网站| 国产亚洲精品美女久久久久久下载| 日日摸日日碰夜夜爽亚洲| 午夜亚洲国产理论片二级港台二级| 亚洲国产欧美国产综合一区 | 日韩一卡2卡3卡4卡新区亚洲| 亚洲日韩国产一区二区三区| 亚洲午夜精品一级在线播放放 | 国产亚洲av片在线观看18女人 | 亚洲国产精品无码专区影院| 亚洲高清专区日韩精品| 亚洲国产综合专区在线电影| 精品日韩亚洲AV无码 | 国产精品亚洲玖玖玖在线观看| 日本亚洲国产一区二区三区| 国产亚洲精品资源在线26u| 亚洲av无码成人黄网站在线观看| 亚洲国产第一页www| 亚洲最新中文字幕| 亚洲入口无毒网址你懂的| 亚洲欧美中文日韩视频| 亚洲国产免费综合| 亚洲午夜福利在线观看| 亚洲韩国—中文字幕| 亚洲成人一级电影| 亚洲人成色777777老人头| 成人亚洲综合天堂| 国产V亚洲V天堂A无码|