Docker入階

      網友投稿 720 2025-04-01

      docker現在是Github社區最火開源項目之一,它基于 Google 公司推出的 Go 語言實現。 項目后來加入了 Linux 基金會,遵從了 Apache 2.0 協議,項目代碼在 GitHub 上進行維護。docker 的基礎是 Linux 容器(LXC)等技術。在 LXC 的基礎上 Docker 進行了進一步的封裝,讓用戶不需要去關心容器的管理,使得操作更為簡便。用戶操作 Docker 的容器就像操作一個快速輕量級的虛擬機一樣簡單。

      舉個貨物運輸的例子。在1960年之前,大部分貨物運輸的過程中,托運人和搬運工都會擔心不同類型的貨物之間會發生互相損壞(比如:一堆鐵鍬在運輸時,有可能倒下壓壞同時在運輸的一袋香蕉)。同樣的,將不同貨品做分類的運輸也是非常痛苦的一件事情。有些需要被轉運的貨物在運輸途中,會在一個港口卸下來,等待相同類型的貨物一起重新裝到指定的火車、貨車或者其他運輸工具上。一路上,很多貨物被損壞,也有很多的貨物被偷盜。不同的運輸機制和不同的貨物組成了一個N乘N的矩陣。

      幸運的是,這個問題已經解決,一個標準化的運輸集裝箱可以解決這個問題。任何類型的貨物,不管是開心果,還是保時捷。都能被集中打包放入一個標準的運輸集裝箱內。這個集裝箱在運輸途中是封閉不可以打開的,直到將它運輸到目的地。這整個集裝箱看做一個個體,裝載,卸下,堆放,運輸,有效的解決長距離的運輸帶來的問題。在運輸過程中,從輪船到火車,再到卡車,都可以通過起重機(吊車),形成流程自動化。不需要管集裝箱里面的東西。

      在代碼方面Docker就類似于這里的貨物集裝箱綜合運輸系統。Docker 能讓任何的應用和它的依賴打包成為一個輕量級的、便攜的、獨立的一個集裝箱。集裝箱有標準的運作模式,因此可以方便自動化。他們被設計成能跑在幾乎所有LINUX服務器上的容器。一個開發者在筆記本上建立和測試的一個Docker容器,能跑在測試環境、生產環境、虛擬機、新買的服務器、OpenStack集群、公共環境、或者是以上的組合的服務器群上。

      物理集裝箱

      Docker

      集裝箱幾乎支持所有類型的貨物

      能壓縮任何負載和依賴

      標準化的尺寸和交接使得集裝箱可以通過貨船火車貨車運輸,用起重機交接不需要換一個容器或者打開集裝箱

      使用操作系統的基本體(像LXC)能一致的跑在幾乎任何硬件下,不需要對硬件做額外的修改

      不需要關心鐵鍬會砸壞香蕉。集裝箱可以一起堆放一起運輸

      資源、網絡和內容的獨立避免了依賴問題

      標準化使得自動化裝載卸貨和移動變得方便

      使用標準的操作指令去運行。對運營人員:CI、CD、自動化測試更為便捷,一鍵式操作

      不需要打開不需要改動什么,高效的點對點的方式

      輕量級,幾乎沒有啟動的消耗,高效的移植性和操控性

      發貨人只需要關心箱子內部的事情,托運人只需要關心箱子外部的東西

      開發者只需要關心代碼層面,運營人員只需要關心服務器的基礎環境

      換句話說,開發者可以搭建他們的應用僅僅一次,就能保證讓這個應用保持一致的跑在任何地方。運營人員可以將他們的服務器配置一遍,就能跑任何應用。

      區別這兩者的關鍵是,兩者的底層架構是完完全全不同的。容器是在操作系統層面上實現虛擬化,直接復用本地主機的操作系統,而傳統虛擬機(像VMWare/KVM/Xen?EC2)通過硬件虛擬化來創造一整個虛擬系統。每一個虛擬機內的應用不僅僅包含這個應用的一些類庫代碼(這個應用可能只有10幾M),而且還包含一整個操作系統。

      除了底層架構的差別,相比之下Docker容器相會顯的更便捷、高效。在傳統的虛擬機,每一個應用,每一個應用的副本,和一個應用要求的輕微的修改都要求重新創造一整個新的虛擬機。其實有時候一個新應用,僅僅需要這個應用和它的文件/類庫,并不需要新的操作系統。 如果你想在一臺主機上跑幾個這個應用的副本,你甚至不需要復制已經被分享的這些文件。 最后,如果你的應用有修改,你只需要將不同的地方復制過來。正如下圖描述的,如果Docker的鏡像有修改,你往往不是修改整個的鏡像,只需要更新和原版本不同的東西。

      4、為什么要使用 Docker?

      作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。

      首先,Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機方式要快得多。

      其次,Docker 對系統資源的利用率很高,一個單機計算機所支持的容器數量比虛擬機數量要多得多,一般為十倍以上的差距。

      容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷盡量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而Docker 只需要啟動 10 個隔離的應用即可。

      具體說來,Docker 在如下幾個方面具有較大的優勢。

      更快速的交付和部署

      對開發和運維(devop)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行。

      開發者可以使用一個標準的鏡像來構建一套開發容器,開發完成之后,運維人員可以直接使用這個容器來部署代碼。 Docker 可以快速創建容器,快速迭代應用程序,并讓整個過程全程可見,使團隊中的其他成員更容易理解應用程序是如何創建和工作的。 Docker 容器很輕很快!容器的啟動時間是秒級的,大量地節約開發、測試、部署的時間。

      更高效的虛擬化

      Docker 容器的運行不需要額外的 hypervisor 支持,它是內核級的虛擬化,因此可以實現更高的性能和效率。

      更輕松的遷移和擴展

      Docker 容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等。 這種兼容性可以讓用戶把一個應用程序從一個平臺直接遷移到另外一個。

      更簡單的管理

      Docker入階

      使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分發和更新,從而實現自動化并且高效的管理。

      Docker使用客戶端-服務器(client-server)架構模式。Docker客戶端會與Docker守護進程進行通信。Docker守護進程會處理復雜繁重的任務,例如建立、運行、發布你的Docker容器。Docker客戶端和守護進程可以運行在同一個系統上,當然你也可以使用Docker客戶端去連接一個遠程的Docker守護進程。Docker客戶端和守護進程之間通過socket或者RESTful API進行通信。

      下面介紹一下docker包括的三個基本概念:

      ?? 鏡像(Image)

      ?? 容器(Container)

      ?? 倉庫(Repository)

      1.???????? images(鏡像)

      Docker 鏡像就是一個只讀的模板。例如,一個鏡像可以包含一個完整的 ubuntu 操作系統環境,里面僅安裝了 Apache 或用戶需要的其它應用程序。

      鏡像可以用來創建 Docker 容器。

      Docker 提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那里下載一個已經做好的鏡像來直接使用。

      2.???????? container(容器)

      Docker 利用容器來運行應用。容器是從鏡像創建的運行實例。它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺。可以把容器看做是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序。

      鏡像是只讀的,容器在啟動的時候創建一層可寫層作為最上層。

      3.???????? repository(倉庫)

      倉庫是集中存放鏡像文件的場所。有時候會把倉庫和倉庫注冊服務器(Registry)混為一談,并不嚴格區分。實際上,倉庫注冊服務器上往往存放著多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag)。

      倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式。

      最大的公開倉庫是Docker Hub,存放了數量龐大的鏡像供用戶下載。國內的公開倉庫包括:時速云、網易云等,可以提供大陸用戶更穩定快速的訪問。當然,用戶也可以在本地網絡內創建一個私有倉庫(參考“nexus 3.0 Private Registry for Docker”一文)。當用戶創建了自己的鏡像之后就可以使用push命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上pull下來就可以了。Docker倉庫的概念跟Git類似,注冊服務器可以理解為GitHub這樣的托管服務。

      根據自己的理解,總的來說分為以下幾種:

      容器生命周期管理 — docker [run|start|stop|restart|kill|rm|pause|unpause]

      容器操作運維 — docker [ps|inspect|top|attach|events|logs|wait|export|port]

      容器rootfs命令 — docker [commit|cp|diff]

      鏡像倉庫 — docker [login|pull|push|search]

      本地鏡像管理 — docker [images|rmi|tag|build|history|save|import]

      其他命令 — docker [info|version]

      可以通過這張圖對docker的常用命令有個概括的了解。

      1. 列出機器上的鏡像(images)

      # docker images

      REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE

      ubuntu 14.10 2185fd50e2ca 13 days ago 236.9 MB

      其中我們可以根據REPOSITORY來判斷這個鏡像是來自哪個服務器,如果沒有 / 則表示官方鏡像,類似于username/repos_name表示Github的個人公共庫,類似于regsistory.example.com:5000/repos_name則表示的是私服。IMAGE ID列其實是縮寫,要顯示完整則帶上--no-trunc選項。

      2. 在docker index中搜索image(search)

      Usage: docker search TERM

      # docker search seanlo

      NAME DESCRIPTION STARS OFFICIAL AUTOMATED

      seanloook/centos6 sean's docker repos 0

      搜索的范圍是官方鏡像和所有個人公共鏡像。NAME列的 / 后面是倉庫的名字。

      3. 從docker registry server 中下拉image或repository(pull)

      Usage: docker pull [OPTIONS] NAME[:TAG]

      # docker pull centos

      上面的命令需要注意,在docker v1.2版本以前,會下載官方鏡像的centos倉庫里的所有鏡像,而從v.13開始官方文檔里的說明變了,只會下載tag為latest的鏡像(以及同一images id的其他tag)。

      如果你沒有網絡,或者從其他私服獲取鏡像,形如docker pull registry.domain.com:port/repos:

      # docker pull ? dl.dockerpool.com:5000/mongo:latest

      4. 推送一個image或repository到registry(push)

      與上面的pull對應,可以推送到Docker Hub的Public、Private以及私服,但不能推送到Top Level Repository。

      # docker push seanlook/mongo

      # docker push registry.tp-link.net:5000/mongo:2014-10-27

      registry.tp-link.net也可以寫成IP,172.29.88.222。

      在repository不存在的情況下,命令行下push上去的會為我們創建為私有庫,然而通過瀏覽器創建的默認為公共庫.

      5. 從image啟動一個container(run)

      docker run命令首先會從特定的image創之上create一層可寫的container,然后通過start命令來啟動它。停止的container可以重新啟動并保留原來的修改。run命令啟動參數有很多。

      1)?使用image創建container并進入交互模式, login shell是/bin/bash

      # docker run -i -t --name mytest centos:centos6 /bin/bash

      bash-4.1#

      上面的--name參數可以指定啟動后的容器名字,如果不指定則docker會幫我們取一個名字。鏡像centos:centos6也可以用IMAGE ID (68edf809afe7) 代替),并且會啟動一個偽終端,但通過ps或top命令我們卻只能看到一兩個進程,因為容器的核心是所執行的應用程序,所需要的資源都是應用程序運行所必需的,除此之外,并沒有其它的資源,可見Docker對資源的利用率極高。此時使用exit或Ctrl+D退出后,這個容器也就消失了(消失后的容器并沒有完全刪除)

      2)?運行出一個container放到后臺運行

      # docker run -d ubuntu /bin/sh -c "while ? true; do echo hello world; sleep 2; done"

      ae60c4b64205

      它將直接把啟動的container掛起放在后臺運行(這才叫saas),并且會輸出一個CONTAINER ID,通過docker ps可以看到這個容器的信息,可在container外面查看它的輸出docker logs ae60c4b64205,也可以通過docker attach ae60c4b64205連接到這個正在運行的終端,此時在Ctrl+C退出container就消失了,按ctrl-p ctrl-q可以退出到宿主機,而保持container仍然在運行另外,如果-d啟動但后面的命令執行完就結束了,如/bin/bash、echo test,則container做完該做的時候依然會終止。而且-d不能與–rm同時使用。

      3)??映射host到container的端口和目錄

      映射主機到容器的端口是很有用的,比如在container中運行memcached,端口為11211,運行容器的host可以連接container的 internel_ip:11211 訪問,如果有從其他主機訪問memcached需求那就可以通過-p選項,形如-p ,存在以下幾種寫法:

      -p 11211:11211 這個即是默認情況下,綁定主機所有網卡(0.0.0.0)的11211端口到容器的11211端口上

      -p 127.0.0.1:11211:11211 只綁定localhost這個接口的11211端口

      目錄映射其實是“綁定掛載”host的路徑到container的目錄,這對于內外傳送文件比較方便,為了避免私服container停止以后保存的images不被刪除,就要把提交的images保存到掛載的主機目錄下。使用比較簡單,-v ,綁定多個目錄時再加-v。

      另外在兩個container之間建立聯系可用--link。

      下面是一個例子:

      # docker run --name nginx_test \

      > -v /tmp/docker:/usr/share/nginx/html:ro \

      > -p 80:80 -d \

      > nginx:1.7.6

      在主機的/tmp/docker下建立index.html,就可以通過http://localhost:80/或http://host-ip:80訪問了。

      6. 開啟/停止/重啟container(start/stop/restart)

      容器可以通過run新建一個來運行,也可以重新start已經停止的container,但start不能夠再指定容器啟動時運行的指令,因為docker只能有一個前臺進程。

      容器stop(或Ctrl+D)時,會在保存當前容器的狀態之后退出,下次start時保有上次關閉時更改。而且每次進入attach進去的界面是一樣的,與第一次run啟動或commit提交的時刻相同。

      CONTAINER_ID=$(docker start )

      docker stop $CONTAINER_ID

      docker restart $CONTAINER_ID

      7. 連接到正在運行中的container(attach)

      要attach上去的容器必須正在運行,可以同時連接上同一個container來共享屏幕(與screen命令的attach類似)。

      官方文檔中說attach后可以通過CTRL-C來detach,但實際上經過我的測試,如果container當前在運行bash,CTRL-C自然是當前行的輸入,沒有退出;如果container當前正在前臺運行進程,如輸出nginx的access.log日志,CTRL-C不僅會導致退出容器,而且還stop了。這不是我們想要的,detach的意思按理應該是脫離容器終端,但容器依然運行。好在attach是可以帶上--sig-proxy=false來確保CTRL-D或CTRL-C不會關閉容器。

      # docker attach --sig-proxy=false $CONTAINER_ID

      8. 刪除一個或多個container、image(rm、rmi)

      你可能在使用過程中會build或commit許多鏡像,無用的鏡像需要刪除。但刪除這些鏡像是有一些條件的:

      ?? 同一個IMAGE ID可能會有多個TAG(可能還在不同的倉庫),首先你要根據這些 image names 來刪除標簽,當刪除最后一個tag的時候就會自動刪除鏡像;

      ?? 承上,如果要刪除的多個IMAGE NAME在同一個REPOSITORY,可以通過docker rmi 來同時刪除剩下的TAG;若在不同Repo則還是需要手動逐個刪除TAG;

      ?? 還存在由這個鏡像啟動的container時(即便已經停止),也無法刪除鏡像;

      刪除容器

      docker rm

      刪除所有停止的容器

      docker rm $(docker ps -a -q)

      刪除鏡像

      docker rmi

      9. docker build 使用此配置生成新的image

      build命令可以從Dockerfile和上下文來創建鏡像:

      docker build [OPTIONS] PATH | URL | -

      上面的PATH或URL中的文件被稱作上下文,build image的過程會先把這些文件傳送到docker的服務端來進行的。

      如果PATH直接就是一個單獨的Dockerfile文件則可以不需要上下文;如果URL是一個Git倉庫地址,那么創建image的過程中會自動git clone一份到本機的臨時目錄,它就成為了本次build的上下文。無論指定的PATH是什么,Dockerfile是至關重要的

      FROM seanlook/nginx:bash_vim

      EXPOSE 80

      ENTRYPOINT /usr/sbin/nginx -c /etc/nginx/nginx.conf && /bin/bash

      # docker build -t seanlook/nginx:bash_vim_Df .

      Sending build context to Docker daemon 73.45 MB

      Sending build context to Docker daemon

      Step 0 : FROM seanlook/nginx:bash_vim

      ---> aa8516fa0bb7

      Step 1 : EXPOSE 80

      ---> Using cache

      ---> fece07e2b515

      Step 2 : ENTRYPOINT /usr/sbin/nginx -c /etc/nginx/nginx.conf && /bin/bash

      ---> Running in e08963fd5afb

      ---> d9bbd13f5066

      Removing intermediate container e08963fd5afb

      Successfully built d9bbd13f5066

      面的PATH為.,所以在當前目錄下的所有文件(不包括.dockerignore中的)將會被tar打包并傳送到docker daemon(一般在本機),從輸出我們可以到Sending build context...,最后有個Removing intermediate container的過程,可以通過--rm=false來保留容器。

      10. 給鏡像打上標簽(tag)

      tag的作用主要有兩點:一是為鏡像起一個容易理解的名字,二是可以通過docker tag來重新指定鏡像的倉庫,這樣在push時自動提交到倉庫。

      將同一IMAGE_ID的所有tag,合并為一個新的

      # docker tag 195eb90b5349 ? seanlook/ubuntu:rm_test

      新建一個tag,保留舊的那條記錄

      # docker tag Registry/Repos:Tag ? New_Registry/New_Repos:New_Tag

      轉載請注明出處:華為云博客 https://portal.hwclouds.com/blogs

      Docker

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

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

      上一篇:如何在Excel中合并兩個沒有重復的列表?
      下一篇:怎樣變換顏色(怎樣改顏色)
      相關文章
      亚洲人成色77777| 亚洲色图综合在线| 久久精品九九亚洲精品天堂| 国产精品亚洲а∨无码播放不卡| 亚洲一区二区三区国产精华液| 91亚洲精品麻豆| 亚洲国产超清无码专区| 337p日本欧洲亚洲大胆精品555588| 婷婷久久久亚洲欧洲日产国码AV | 亚洲第一AV网站| 国产国拍亚洲精品mv在线观看| 亚洲一区二区三区在线观看精品中文 | 国产亚洲色婷婷久久99精品| 伊伊人成亚洲综合人网7777| 亚洲无线码一区二区三区| 亚洲色精品aⅴ一区区三区| 亚洲乱码日产一区三区| 国产亚洲综合久久系列| 亚洲av无码成人黄网站在线观看| 亚洲AV无码乱码在线观看富二代 | 亚洲AV无码第一区二区三区| 亚洲日本在线观看| 亚洲精品午夜视频| 亚洲一区二区三区四区视频| 亚洲最大的成人网| 亚洲成a人无码亚洲成www牛牛| 久久水蜜桃亚洲AV无码精品| 无码国产亚洲日韩国精品视频一区二区三区| 色欲色欲天天天www亚洲伊| 天堂亚洲免费视频| 久久亚洲国产成人影院网站 | 亚洲一区二区三区乱码在线欧洲| 在线精品亚洲一区二区| 亚洲av日韩精品久久久久久a| 亚洲AⅤ优女AV综合久久久| 精品亚洲视频在线观看| 国产V亚洲V天堂A无码| 久久综合亚洲鲁鲁五月天| 亚洲a视频在线观看| 亚洲JIZZJIZZ妇女| 亚洲午夜精品久久久久久浪潮 |