Can you summarize the following document?
        
  專業名詞Docker有兩個意思:

  Docker引擎(Docker Engine)是一個服務端-客戶端結構的應用,主要有這些部分:Docker守護程序、Docker Engine AP、Docker客戶端。

  Docker註冊中心(Docker registry)是用於儲存Docker的映象。Docker Hub 是一個公共的註冊中心,任何人都可以使用,預設配置下,Docker將會在這裡尋找映象。  另外,使用者可以自行構建私有註冊中心。Docker Datacenter (DDC)的使用者,可以直接使用 Docker Trusted Registry (DTR)。

  Docker的物件是指Images、Containers、Networks、Volumes、Plugins等等。

  

  Compose可譯為組合物。Compose 是用於定義和執行 多個容器Docker應用程式 的工具。通過Compose,你可以使用YAML檔案來配置應用程式需要的所有服務,然後通過使用一個命令,就可以建立並啟動所有服務。Compose對應的命令為codice_5。

  當說到 Docker Swarm 時,一般是指單獨專案 Docker Swarm。而在Docker 1.12時,將swarm mode整合到Docker 引擎中,可用Docker引擎API 和 CLI 命令直接使用。官方推薦使用者使用整合的 swarm mode 。  Swarm Mode 內建 kv 儲存功能,提供了眾多的新特性,比如:具有容錯能力的去中心化設計、內建服務發現、負載均衡、路由網格、動態伸縮、滾動更新、安全傳輸等。使得 Docker 原生的 codice_6 叢集具備與 Mesos、Kubernetes 競爭的實力。  cluster(中文:叢集),Docker將叢集定義為:一群共同作業並提供高可用性的機器 。swarm(中文:群),是指一個叢集的Docker引擎以swarm mode形式執行。swarm mode是指Docker引擎內嵌的叢集管理和編排功能。當你初始化了一個swarm(cluster)或者將節點加入一個swarm時,其Docker引擎就會以swarm mode的形式執行。

  swarm中的Docker機器中分為 managers(管理者) 和 workers(員工),管理者用於處理叢集的關係和委派,員工則用於執行 swarm服務。 當你建立swarm服務時,你可以為其增加各種額外的狀態(如:數量、網路、埠、儲存資源等等)。Docker會去維持使用者想要的狀態。如:一個工作節點如果掛了,那麼Docker會去把這個節點的任務給另外一個節點。此處的任務(task)是指:被swarm管理者管理的一個執行中的容器。  swarm服務比單獨容器好在,修改swarm服務的配置之後不用重啟。同時,Docker以swarm mode形式執行時,也可以選擇直接啟動單獨的容器。另外,swarm mode下,你也可以通過 codice_7 使用 Compose file 部署應用棧。 swarm服務分為兩種,一種是replicated services,可以指定節點任務的總數量;global services,則是每個節點都會執行一個指定任務。 swarm管理員使用 ingress 負載均衡使服務可被外部接觸。 swarm管理員會自動地給服務分配PublishedPort(或者手動配置)。外部元件,如雲負載均衡器能通過叢集中任何節點上的PublishedPort去接入服務(不管該服務是否啟動)。另外 swarm mode有內部DNS元件,它會為每個服務分配一個DNS條目。swarm管理員使用 internal load balancing 去分發請求時,就是依靠這個DNS元件。  swarm mode的功能是由swarmkit(一個獨立專案)提供的,它實現了Docker的編排層。swarm可以直接被Docker使用。

  Docker有兩種檔案格式,Dockerfile和Compose file。Dockerfile定義了單個容器的內容和啟動時候的行為。Compose file定義了一個多容器應用。

  Docker 可以依照 Dockerfile 的內容,自動化地構建映象。 Dockerfile 是包含著使用者想要如何構建映象的所有命令的文字。 FROM ubuntu:18.04 COPY. /app RUN make /app CMD python /app/app.py 關鍵詞:

  Compose檔案 是一個YAML檔案,定義了服務(service)、網路、卷(volume)。  codice_23 命令中有一些選項,和 Dockerfile檔案中的指令效果一樣(如:codice_15, codice_28, codice_29, codice_30),如果Dockerfile檔案中使用這些指令,那麼這些指令就會被視為預設引數,所以開發者無需特意在 Compose檔案中再指定一次。  Compose檔案 可使用 Shell變數(Variable),如: db: Compose檔案 可通過自身的codice_31變數,將引數傳給Dockerfile的 codice_31 指令。

  參考文件:Docker文件-網路概要

  在Docker裡,網橋網路 使用的是 軟體形式的網橋。使用相同的網橋的容器連線進入該網路,而非該網路的容器刷故無法接入。Docker網橋驅動會自動地在Docker主機上安裝規則,這些規則讓不同橋接網路之間不能直接通訊。 橋接經常用於:在單獨容器上執行應用時,可通過 網橋 進行通訊。 網橋網路 適用於容器執行在相同地Docker守護程序的主機上。不同Docker守護程序主機上的容器,它們之間的通訊需要依靠作業系統層次的路由,或者你應該使用 overlay網路 進行代替。  codice_33 是網橋驅動,是Docker預設的網路驅動(介面名為 codice_34),當你不為容器指定一個網路時候,Docker將會使用該驅動。 可通過 codice_35 檔案修改相關配置。  自定義網橋可通過 codice_36 命令進行配置。

  主機模式  codice_37 用於單獨容器,該網路下容器只能和Docker主機進行直接連線。codice_37 只適用於 Docker 17.06或以上版本的swarm服務。  host網路和VirtualBox的 僅主機網路(Host-only Networking) 類似。

  codice_39 (中文:覆蓋網路)網路驅動將會建立分散式網路,該網路可以覆蓋若干個 Docker守護程序主機。該網路是基於 主機特定網路(host-specific networks),允許 swarm服務 和 容器 進行安全通訊(當加密功能開啟時)。在該網路下,Docker能夠清晰地掌握 資料包的路由 以及 傳送接收容器。  codice_39 有兩種網路型別網路:  在 codice_39 網路下,單獨的容器 和 swarm服務 的行為和配置概念 是不一樣。  該策略不需要 容器們 具有作業系統級別的路由,因為Docker負責路由。

  codice_45 網路允許你賦予容器 MAC地址,在該網路裡,容器會被認為是物理裝置。Docker守護程序會路由

  該策略下,容器不使用任何網路。codice_46 常常用於連線自定義網路驅動的情況下。

  其他第三方外掛。

  Docker預設下,所有檔案將會儲存在容器裡的可寫的容器層(container layer)。  容器有兩種永久化儲存方式:卷(volumes)和 繫結掛載(bind mounts)。另外,Linux使用者還可使用 tmpfs 進行掛載;window使用者還可以使用 命名管道(named pipe)。在容器中,不管是哪種永久化儲存,表現形式都是一樣的。

  卷(volumes)是宿主機器的檔案系統的一部分,由Docker進行管理( 在Linux,儲存於codice_47)。非Docker程式不應該去修改這些檔案。Docker推薦使用 卷 進行持久化資料。 卷 可支援 卷驅動(volume drivers),該驅動允許使用者將資料儲存到 遠端主機 或 雲服務商(cloud provider)或 其他。  沒有名字的卷叫匿名卷(anonymous volume),有名字的卷叫命名卷(named volume)。匿名卷沒有明確的名字,當被初始化時,會被賦予一個隨機名字。

  繫結掛載(bind mounts)通過將宿主機器的路徑掛載到容器裡的這種方式,從而資料持續化,因此繫結掛載可將資料儲存在宿主機器的檔案系統的任何地方。非Docker程式可修改這些檔案。 繫結掛載是Docker早期就存在的,相比起卷,繫結掛載十分簡單明瞭。 在開發Docker應用時,應使用命名卷(named volume)代替繫結掛載,因為使用者不能對繫結掛載進行 Docker CLI 命令操作。  繫結掛載常用於:

  codice_49 掛載(tmpfs mounts),僅僅儲存於記憶體中,並不操作 宿主機器的檔案系統(不持久化於磁碟)。它可用於儲存一些 非持久化狀態、敏感資料。 舉例,swarm服務 通過codice_49 將 secrets(密碼、金鑰、證書等)儲存到swarm服務。

  命名管道(named pipes),通過 codice_51 掛載的形式,使 Docker主機 和 容器 之間能互相通訊。常見用例是在容器內執行第三方工具,並使用命名管道連線到Docker Engine API。

  當掛載 空的卷 至一個目錄中,目錄中的內容會被複制於卷中(不會覆蓋)。如果掛載 非空的卷 或 繫結掛載 至一個目錄中,那麼該目錄的內容將會被隱藏(obscured ),當解除安裝後內容將會恢復顯示。

  在Linux和UNIX中,常見的 I/O流() 分為三種:codice_52(輸入 )、 codice_53(正常輸出)、codice_54(錯誤輸出)。  預設配置下,Docker的日誌(如:codice_55、codice_56)所記載的是命令列的輸出結果(codice_53和codice_54)。而codice_53 和 codice_54 對應的檔案路徑分別是 codice_61和codice_62。 另外,也可以在宿主主機上檢視容器的日誌,使用以下命令可以檢視到容器的日誌位置。 $ docker inspect --format=" $INSTANCE_ID

  Docker命令在過去的發展中誕生了40種以上的命令,過多的命令導致混論以及難以使用tab自動補充,因此在docker 1.13版本(2017.1.19)中,命令列被重構,根據邏輯物件進行劃分。官方建議使用者使用新的語法進行操作。

  

  參考Swarm Mode章節。

  Docker Machine 是一個工具,它允許你在虛擬宿主機上安裝 Docker引擎,並使用 docker-machine 命令管理這些宿主機。你可以使用 Machine 在你本地的 Mac 或 Windows box、公司網路、資料中心、或像 AWS 或 Digital Ocean 這樣的雲提供商上建立 Docker 宿主機。  Docker Machine 最後更新時間是在0.16.0 (2018-11-08)版本。官方建議在1.12以及之後版本使用Docker Desktop for Mac和Docker Desktop for Windows進行代替。

  Docker Toolbox是用於幫 Windows系統和Mac系統 安裝Docker環境。新版本建議使用Docker Desktop for Mac和Docker Desktop for Windows進行安裝。最後更新版本是 19.03.1(2019-08-01)。
Docker 是一個開放原始碼軟體,是一個開放平臺,用於開發應用、交付(shipping)應用、執行應用。 Docker允許使用者將基礎設施(Infrastructure)中的應用單獨分割出來,形成更小的顆粒(容器),從而提高交付軟體的速度。