?
本文檔使用 PHP中文網(wǎng)手冊 發(fā)布
您可以在 Docker 容器中運行 Linux 和 Windows 程序以及可執(zhí)行文件。Docker 平臺在 Linux 上(在x84-64,ARM 和許多其他CPU體系結(jié)構(gòu)上)和 Windows(x86-64)上本機運行。
Docker Inc.構(gòu)建可讓您在Linux,Windows 和 MacOS上構(gòu)建和運行容器的產(chǎn)品。
Docker 技術(shù)不是 LXC 的替代品?!癓XC”指的是 Linux 內(nèi)核(特別是命名空間和控制組)的功能,它們允許相互之間的沙盒過程并控制其資源分配。除了內(nèi)核特性的這個底層基礎(chǔ)之外,Docker 還提供了一個具有以下強大功能的高級工具:
跨機器的便攜式部署。Docker 定義了一種用于將應(yīng)用程序及其所有依賴項捆綁到一個稱為容器的單個對象中的格式。這個容器可以被轉(zhuǎn)移到任何支持 Docker 的機器上。容器可以在那里執(zhí)行,保證暴露給應(yīng)用程序的執(zhí)行環(huán)境在開發(fā),測試和生產(chǎn)中是相同的。LXC 實現(xiàn)流程沙盒,這是便攜式部署的重要先決條件,但對于便攜式部署來說不夠。如果您向我發(fā)送了一份安裝在自定義LXC配置中的應(yīng)用程序副本,那么它幾乎肯定不會像您的方式那樣在我的機器上運行。您發(fā)送給我的應(yīng)用程序與您的計算機的特定配置有關(guān):網(wǎng)絡(luò),存儲,日志記錄等。Docker 為這些機器特定的設(shè)置定義了一個抽象。
以應(yīng)用為中心。Docker 針對應(yīng)用程序的部署進(jìn)行了優(yōu)化,而不是機器。這反映在其 API,用戶界面,設(shè)計理念和文檔中。相比之下,lxc
輔助腳本將容器作為輕量級機器 - 基本上是啟動速度更快,所需 RAM 更少的服務(wù)器。我們認(rèn)為容器不僅僅是這些。
自動構(gòu)建。泊塢窗包括為開發(fā)工具來自動組裝從他們的源代碼的容器,有超過應(yīng)用程序依賴的完全控制,編譯工具,包裝等,他們都可以自由使用make
,maven
,chef
,puppet
,salt,
Debian 軟件包,RPM 包,源碼包,或任意組合以上,無論機器的配置如何。
版本。Docker 包括用于跟蹤容器的連續(xù)版本,檢查版本之間的差異,提交新版本,回滾等的類似 git 的功能。歷史記錄還包括容器如何組裝以及由誰組裝,以便從生產(chǎn)服務(wù)器獲得完整的可追溯性一路回到上游開發(fā)商。Docker 也實現(xiàn)了增量上傳和下載,類似于git pull
,所以新版本的容器只需發(fā)送差異即可傳輸。
組件重用。任何容器都可以用作“父圖像”來創(chuàng)建更專業(yè)的組件。這可以手動完成或作為自動構(gòu)建的一部分。例如,您可以準(zhǔn)備理想的Python環(huán)境,并將其用作10個不同應(yīng)用程序的基礎(chǔ)。您理想的PostgreSQL設(shè)置可以重新用于您未來的所有項目。等等。
共享。Docker 可以訪問Docker Hub上的公共注冊表,該成千上萬的人上傳了有用的圖像:從 Redis,CouchDB,PostgreSQL 到 IRC 保護(hù)者到 Rails 應(yīng)用服務(wù)器到 Hadoop 的任何內(nèi)容,以便為各種 Linux發(fā)行版映射基礎(chǔ)。該注冊中心還包括由 Docker 團(tuán)隊維護(hù)的有用容器的官方“標(biāo)準(zhǔn)庫”。注冊表本身是開源的,因此任何人都可以部署他們自己的注冊表來存儲和傳輸私有容器,例如用于內(nèi)部服務(wù)器部署。
工具生態(tài)系統(tǒng) Docker 定義了一個用于自動化和自定義容器的創(chuàng)建和部署的 API。有大量與 Docker 集成的工具來擴展其功能。PaaS 式部署(Dokku,Deis,F(xiàn)lynn),多節(jié)點編排(Maestro,Salt,Mesos,Openstack Nova),管理儀表板(docker-ui,Openstack Horizon,Shipyard),配置管理(Chef,Puppet),持續(xù)集成(Jenkins,Strider,Travis)等。Docker正在迅速將自己建立為基于容器的工具的標(biāo)準(zhǔn)。Docker容器和VM之間有什么不同?有一個很棒的StackOverflow答案,顯示了差異。當(dāng)容器退出時,我的數(shù)據(jù)是否丟失?完全沒有!應(yīng)用程序?qū)懭氪疟P的任何數(shù)據(jù)都將保留在其容器中,直到您明確刪除容器。即使容器暫停,容器的文件系統(tǒng)仍然存在。Docker 容器的擴展程度如何?當(dāng)今世界上一些最大的服務(wù)器場是基于容器的。Google和Twitter等大型 Web 部署以及Heroku等平臺提供程序運行在容器技術(shù)上,規(guī)模為數(shù)十萬甚至數(shù)百萬個容器。如何連接Docker容器?目前推薦的連接容器的方法是通過Docker網(wǎng)絡(luò)功能。您可以在這里看到如何使用Docker網(wǎng)絡(luò)的詳細(xì)信息。如何在Docker容器中運行多個進(jìn)程?對于大多數(shù)使用情況,這種方法是不鼓勵的。為了最大限度地提高效率和隔離度,每個容器應(yīng)該解決一個特定的關(guān)注領(lǐng)域 但是,如果您需要在單個容器中運行多個服務(wù),請參閱在容器中運行多個服務(wù)。Docker運行在哪個平臺上?Linux:
任何運行 Linux 內(nèi)核版本3.10以上的發(fā)行版
大多數(shù)Linux發(fā)行版都提供了特定的說明,其中包括RHEL,Ubuntu,SuSE等等。
微軟Windows:
WindowsServer 2016
Windows 10
云:
AmazonEC 2
Google計算引擎
微軟Azure
Rackspace
您可以在此處了解項目的安全策略,并將安全問題報告給此郵箱。
請閱讀我們的博客文章,介紹DCO。
這是關(guān)于 docker-dev郵件列表討論的總結(jié)。
幾乎所有的程序都依賴于第三方庫。大多數(shù)情況下,他們會使用動態(tài)鏈接和某種程序包依賴性,這樣當(dāng)多個程序需要相同的庫時,它只安裝一次。
但是,有些程序會綁定第三方庫,因為它們依賴于這些庫的非常特定的版本。例如,Node.js捆綁了OpenSSL; MongoDB 捆綁了 V8和 Boost(等等)。
在創(chuàng)建 Docker 鏡像時,最好使用捆綁的庫,還是應(yīng)該構(gòu)建這些程序,以便它們使用默認(rèn)的系統(tǒng)庫?
關(guān)于系統(tǒng)庫的關(guān)鍵點不在于節(jié)省磁盤或內(nèi)存空間。這關(guān)乎安全。所有主要的發(fā)行版都認(rèn)真對待安全性,擁有專門的安全團(tuán)隊,密切關(guān)注已發(fā)布的漏洞,并自行公布報告。(請查看Debian安全信息以獲取這些過程的示例。)但是,上游開發(fā)人員并不總是執(zhí)行類似的操作。
在設(shè)置 Docker 鏡像以從源代碼編譯程序之前,如果您想使用捆綁的庫,您應(yīng)該檢查上游作者是否提供了一種方便的方式來公布安全漏洞,以及是否及時更新其捆綁的庫。如果他們不這樣做,那么您正在將自己(和圖像的用戶)暴露于安全漏洞。
同樣,在使用其他軟件包構(gòu)建之前,您應(yīng)該檢查提供這些軟件包的渠道是否實施了類似的安全最佳實踐。下載并安裝“all-in-one”.deb或.rpm聽起來很棒,除非你無法弄清楚它包含一個容易受Heartbleed bug 影響的OpenSSL庫。
DEBIAN_FRONTEND=noninteractive
在Dockerfiles中不鼓勵?在 Debian 和 Ubuntu 上構(gòu)建 Docker 鏡像時,您可能會看到以下錯誤:
unable to initialize frontend: Dialog
這些錯誤不會停止生成映像,但會通知您安裝過程嘗試打開對話框,但無法執(zhí)行。通常,這些錯誤是安全的,無法忽視。
有些人通過使用以下方法更改DEBIAN_FRONTEND
Dockerfile中的環(huán)境變量來規(guī)避這些錯誤:
ENV DEBIAN_FRONTEND=noninteractive
這樣可以防止安裝程序在安裝期間打開對話框,從而停止錯誤。
雖然這聽起來似乎是一個好主意,但它可能有副作用。該DEBIAN_FRONTEND
環(huán)境變量將被所有從圖像構(gòu)建的圖像和容器繼承,并有效地改變它們的行為。交互式安裝軟件時,使用這些映像的用戶會遇到問題,因為安裝程序不會顯示任何對話框。
正因為如此,而且由于設(shè)置DEBIAN_FRONTEND
來noninteractive
主要是“美容”的變化,我們不鼓勵改變它。
如果您確實需要更改其設(shè)置,請務(wù)必在之后將其更改回默認(rèn)值。
Connection reset by peer
在請求運行在容器中的服務(wù)時會得到什么?通常,如果服務(wù)已經(jīng)綁定到本地主機,則返回此消息。結(jié)果,從外部進(jìn)入容器的請求被丟棄。要更正此問題,請更改本地主機上的服務(wù)配置,以便該服務(wù)接受來自所有 IP 的請求。如果您不確定如何執(zhí)行此操作,請查看您的操作系統(tǒng)的文檔。
Cannot connect to the Docker daemon. Is the docker daemon running on this host?
在使用碼頭機時會遇到問題?該錯誤指出 docker 客戶端無法連接到虛擬機。這意味著下面的虛擬機docker-machine
沒有運行,或者客戶機沒有正確指向虛擬機。
要驗證碼頭機正在運行,可以使用該docker-machine ls
命令并docker-machine start
在需要時啟動它。
$ docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORSdefault - virtualbox Stopped Unknown $ docker-machine start default
你必須告訴 Docker 與那臺機器交談。你可以用docker-machine env
命令來做到這一點。例如,
$ eval "$(docker-machine env default)"$ docker ps
你可以找到更多的答案:
Docker用戶郵件列表
Docker開發(fā)人員郵件列表
IRC, docker on freenode
GitHub
在Stackoverflow上提問
在Twitter上加入對話