A. 如何穿過Docker現象這片"叢林
如今我要話要說:一段時間以來,我一直遲遲沒有認真打量Docker,原因主要是缺少時間,再加上我們的贊助商兼母公司ZeroTurnaround最近決定完全退出運維(Ops)行業,致力於開發者工具。作為開發昔日版本自動化工具的工程師,我在關注虛擬化或大型集群管理工具時往往興趣不太大。
於是我現在關注Docker領域可能有點晚,不過今天我還是要談談Java開發人員如何能夠穿過Docker現象這片叢林,更容易了解使用這種熱門新技術來簡化開發流程的種種好處。
我們在本文中將探討你可以用Docker來完成什麼以及如何認識Docker這項新興技術。
安裝和入手
讓人大為意外的是,官方網站就有安裝Docker的操作說明(https://docs.docker.com/installation/mac/#installation)。我不想具體介紹獲得Docker所需的具體步驟,所以為了讓這篇文章立足於更宏觀的層面,這一章節將非常簡短。
要是你很幸運,在運行一款直接支持Docker的操作系統(言外之意是一些Linux發行版),你就可以開始上手了。使用你青睞的程序包管理器來安裝Docker,然後證實這個命令正常運行:
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world' Hello world
要是你不是那麼幸運,屬於運行Windows或OS X的這一類人,那也大可不必擔心。boot2docker項目(http://boot2docker.io)會為你啟動一個小型的輕量級Linux虛擬機,那樣你就能享受使用Docker的樂趣了。
安裝boot2docker的過程很容易,已為我們准備好了針對特定操作系統的安裝程序。運行安裝程序也很簡單,下面列出了面向Mac用戶的操作說明:https://docs.docker.com/installation/mac/#installation。
使用上述命令證實boot2docker正常運行,通過ssh進入到boot2docker,運行它:
$ boot2docker ssh ## . ## ## ## == ## ## ## ## === /""""""""""""""""\___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ \______ o __/ \ \ __/ \____\______/ _ _ ____ _ _ | |__ ___ ___ | |_|___ \ __| | ___ ___| | _____ _ __ | '_ \ / _ \ / _ \| __| __) / _` |/ _ \ / __| |/ / _ \ '__| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < __/ | |_.__/ \___/ \___/ \__|_____\__,_|\___/ \___|_|\_\___|_| Boot2Docker version 1.3.1, build master : 9a31a68 - Fri Oct 31 03:14:34 UTC 2014 Docker version 1.3.1, build 4e9bbfa docker@boot2docker:~$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world' Hello world
就是這樣,我們已運行了第一個Docker應用程序。它沒有任何花哨的功能,只是回送一個消息而已,但這是為有用的系統安裝基礎設施的一個重要步驟。
那些重要的容器
雖然我們喜歡Groovy這門語言,但我們根本不是一家使用Groovy的公司,於是我們將著重介紹讓Java在容器中運行。
好消息是,即便在這里,一切工作都為我們做好了。有一個官方軟體庫:dockerfile/java(https://github.com/dockerfile/java),附有面向Java的Docker映像。確切地說,這些並不是映像,而是告訴Docker如何創建實際映像的Docker文件(dockerfile)。
如果你看一下面向Java 8的Docker文件(https://github.com/dockerfile/java/blob/master/oracle-java8/Dockerfile),立馬就會注意到:Java 8映像基於常規的Ubuntu映像,你可以像對待平常的Ubuntu機器那樣來安裝Java。
另外,它定義了JAVA_HOME以及需要執行的默認Docker命令:
# 定義工作目錄。
WORKDIR /data
# 定義常用的JAVA_HOME變數
ENV JAVA_HOME /usr/lib/jvm/java-8-oracle
# 定義默認命令。
CMD ["bash"]
現在,我們的Docker容器已配備了Java,能夠運行Java命令了:
docker run -it --rm dockerfile/java:oracle-java8 java -version java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
我們可以運行在我們的Docker環境中執行的隨機性Java命令。它並不為此使用標準的虛擬機,所以你根本不用擔心虛擬機開銷問題。
瞧瞧這有多麼簡單、多麼易於移植?!
進一步個性化
我知道你在想什麼:這相當酷,但現在我不得不做一個Docker文件,以便下載和安裝Maven,克隆我的項目軟體庫,然後構建它,並且在這個過程中下載一半的互聯網。別擔心,Docker可以輕松訪問你的主機文件系統,所以除了對Java的訪問外,你沒必要提供太多的東西。
的確,你可以擁有它。Linux顯然具有作為Docker原生操作系統的優點,所以映射起來非常順暢無阻。Docker命令只要接收一個參數:-v,即可讓目錄映射到容器裡面的某個對象。
比如說,下面這個命令將與容器共享我的~/repo目錄。
docker run -v /Users/shelajev/repo:/opt/repo ubuntu ls -la /opt/repo/zt-zip
OS X用戶也不必擔心,因為自boot2docker 1.3.1以來,你的主目錄默認情況下就與boot2docker虛擬機共享,所以-v也會正常發揮作用:
Windows用戶不用擔心,完全有一個版本可以讓你確保正常運行(參閱http://www.incrediblemolk.com/sharing-a-windows-folder-with-the-boot2docker-vm/)。簡而言之,你不得不安裝VirtualBox Guest Additions,並且在你的主機和boot2docker虛擬機之間手動映射一個文件夾。如果你明白自己在做什麼,或者遵守實用操作指南,就像上面那個鏈接,這部分相當簡單直觀。
現在如何在Docker容器裡面運行實際的Java應用程序已相當一目瞭然了。你的源代碼位於主機上,你同樣可以在主機上編輯源代碼;甚至可以在主機上構建源代碼,因為運維活動並不從源代碼開始,而是從預制構件開始。之後,它就跟將它放到正確的位置,使用正確的命令來啟動它一樣簡單。
下面是Java項目的例子,我將使用Spring Boot(http://projects.spring.io/spring-boot/)來啟動該應用程序。
所以通常來說,我在自己的機器上會這樣運行它:
shelajev@shrimp ~/repo/tmp/gs-spring-boot/complete ‹master› $ java -jar target/gs-spring-boot-0.1.0.jar
另外證實該應用程序在埠8080上運行。想在Docker容器裡面運行它,我只要做同樣的事情,不過需要提供埠映射,那樣我就能從主機訪問它:
docker run -v /Users/shelajev/repo:/opt/repo -p 8080:8080 --rm dockerfile/java:oracle-java8 java -jar /opt/repo/tmp/gs-spring-boot/complete/target/gs-spring-boot-0.1.0.jar
該命令的輸出結果非常容易預測,它啟動Spring Boot應用程序,並輸出顯示所有初始化內容。為了簡便起見,這里就不附上了,但它看起來就像這個pastebin。
瞧!我現在可以通過主機瀏覽器來訪問它了!只要使用下面這個命令,就很容易獲得確切的IP,boot2docker提供了被映射到docker的介面:
open http://$(boot2docker ip 2>/dev/null)/
結束語:Docker是一種對開發人員友好的運維工具
我可以有把握地說,Docker是一種深思熟慮的工具,幾乎一切都可以從命令行來加以訪問。
我們在本文中分析了如何從Docker容器入手,以便為Java項目建立一個易於移植的開發環境。這也許可以為新項目減少安裝方面的難度,又不必犧牲通常使用的環境為你提供的好處或性能:平常使用的集成開發環境(IDE)、自動化測試、JRebel(厚著臉皮做下廣告)等工具及其他。
對於Java開發人員而言,Docker有助於在一個干凈的環境中隔離我們的應用程序,所以多少緩解了無法預測「是否可以在我的機器上運行」的問題。隔離之所以很重要,是因為它減小了我們使用的軟體環境的復雜性。另外,想得益於使用Docker,你沒必要深入鑽研容器世界,就可以開始將應用程序部署到成千上萬個節點。與開發人員的機器隔離開來是一大有利條件。
Docker擁有直觀的用戶界面,進一步減小了這種復雜性,它已成為任何開發人員的一款出色工具。使用它的額外好處包括,它簡化了運維人員的工作,而我們都知道這有多重要。
B. docker是干什麼的
Docker 鏡像可以看作是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時准備的一些配置參數(如匿名卷、環境變數、用戶等)。
作用類似於虛擬機的快照,用來創建新的容器。
特點:鏡像不包含任何動態數據,其內容在構建之後也不會被改變。

不同的應用程序所依賴的環境不一樣,如果把依賴的軟體都安裝在一個伺服器上,不僅需要調試很久,而且可能會有沖突。如果想把兩個應用程序隔離起來,可以在伺服器上創建不同的虛擬機,不同的虛擬機放不同的應用,但是虛擬機的開銷比較高。docker作為輕量級的虛擬機,是一個很好的工具。
解決運行環境不一致所導致的問題。這樣就不會產生「本地運行沒問題,可一到伺服器上就不行了」的情況。
限定最大的cpu使用內存硬碟,這樣就起到了隔離的作用,避免產生「一塊代碼產生死循環,把磁碟占滿了,其它程序也掛了」的情況。
C. docker究竟是什麼,為什麼這么流行,它的優點和缺陷有哪些
簡單得來說,Docker是一個由GO語言寫的程序運行的「容器」(Linux containers, LXCs); 目前雲服務的基石是操作系統級別的隔離,在同一台物理伺服器上虛擬出多個主機。Docker則實現了一種應用程序級別的隔離; 它改變我們基本的開發、操作單元,由直接操作虛擬主機(VM),轉換到操作程序運行的「容器」上來。
Docker是為開發者和系統管理員設計的,用來發布和運行分布式應用程序的一個開放性平台。由兩部分組成:
Docker Engine: 一個攜帶型、輕量級的運行環境和包管理器。(注* 單OS vs 單線程,是不是跟NodeJS特別像?)
Docker Hub: 為創建自動化工作流和分享應用創建的雲服務組成。(注* 雲端鏡像/包管理 vs npm包管理,是不是跟npm特別像?)
從2013年3月20日,第一個版本的Docker正式發布到 2014年6月 Docker 1.0 正式發布,經歷了15個月。 雖然發展歷程很短,但Docker正在有越來越流行的趨勢。
其實Container技術並非Docker的創新,HeroKu, NodeJitsu 等雲服務商都採用了類似這種輕量級的虛擬化技術,但Docker是第一個將這這種Container技術大規模開源並被社區廣泛接受的。
好的部分
Docker相對於VM虛擬機的優勢十分明顯,那就是輕量和高性能和便捷性, 以下部分摘自: KVM and Docker LXC Benchmarking with OpenStack
快
運行時的性能可以獲取極大提升(經典的案例是提升97%)
管理操作(啟動,停止,開始,重啟等等) 都是以秒或毫秒為單位的。
敏捷
像虛擬機一樣敏捷,而且會更便宜,在bare metal(裸機)上布署像點個按鈕一樣簡單。
靈活
將應用和系統「容器化」,不添加額外的操作系統,
輕量
你會擁有足夠的「操作系統」,僅需添加或減小鏡像即可。在一台伺服器上可以布署100~1000個Containers容器。
便宜
開源的,免費的,低成本的。由現代Linux內核支持並驅動。注* 輕量的Container必定可以在一個物理機上開啟更多「容器」,註定比VMs要便宜。
生態系統
正在越來越受歡迎,只需要看一看Google的趨勢就知道了, docker or LXC.
還有不計其數的社區和第三方應用。
雲支持
不計其數的雲服務提供創建和管理Linux容器框架。
有關Docker性能方面的優勢,還可參考此IBM工程師對性能提升的評測,從各個方面比VMs(OS系統級別虛擬化)都有非常大的提升。
Performance Characteristics of VMs vs Docker Containers by Boden Russel (IBM)
Performance characteristics of traditional v ms vs docker containers
有爭論的部分
任何項目都會有爭論,就像Go,像NodeJS, 同樣Docker也有一些。
能否徹底隔離
在超復雜的業務系統中,單OS到底能不能實現徹底隔離,一個程序的崩潰/內存溢出/高CPU佔用到底會不會影響到其他容器或者整個系統?很多人對Docker能否在實際的多主機的生產環境中支持關鍵任務系統還有所懷疑。 注* 就像有人質疑Node.JS單線程快而不穩,無法在復雜場景中應用一樣。
不過可喜的是,目前Linux內核已經針對Container做了很多改進,以支持更好的隔離。
GO語言還沒有完全成熟
Docker由Go語言開發,但GO語言對大多數開發者來說比較陌生,而且還在不斷改進,距離成熟還有一段時間。此半git、半包管理的方式讓一些人產生不適。
被私有公司控制
Docker是一家叫Dotcloud的私有公司設計的,公司都是以營利為目的,比如你沒有辦法使用源代碼編繹Docker項目,只能使用黑匣子編出的Docker二進制發行包,未來可能不是完全免費的。 目前Docker已經推出面向公司的企業級服務(咨詢、支持和培訓)。
D. docker是什麼通俗易懂
docker就是無界面虛擬機,比其他虛擬機更輕量,唯一特色作用就是同一應用多開。docker很復雜,很煩人,不建議一般開發人員使用!!個人使用,寧建議你用vmware、vbox都不建議你使用docker!!企業使用,這個docker只有涉及到同一應用多開和間接賣硬體資源。
E. 什麼是docker
美 ['dɑkər]英 ['dɒkə(r)]
n.碼頭工人;船塢工人;泊塢窗;搬運工人
復數:dockers
例句:
Some people turn up their noses if you say your father was a miner or a docker .
如果你說你的父親當過礦工或碼頭工人,有人就瞧不起你。
來自必應翻譯
希望幫到你,望採納,滿意請點擊:採納
F. DOCKER是什麼,它解決了什麼問題
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的Linux機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。
Docker核心解決的問題是利用LXC來實現類似VM的功能,從而利用更加節省的硬體資源提供給用戶更多的計算資源。
以前的聽課筆記:
網頁鏈接
就開頭一點與KVM的對比,講究著看看吧
G. 最近Docker挺流行的,它是啥呀
Docker是當前的熱門技術,越來越多的IT從業人員都在擁抱使用,它已經廣泛地應用在開發、測試、運維等領域。
H. Docker究竟是什麼,為什麼這么流行,它的優點和缺陷有哪些
為創建自動化工作流和分享應用創建的雲服務組成,由直接操作虛擬主機(VM), NodeJitsu 等雲服務商都採用了類似這種輕量級的虛擬化技術。
好的部分
Docker相對於VM虛擬機的優勢十分明顯、輕量級的運行環境和包管理器,的:
Docker Engine: 一個攜帶型。
雲支持
不計其數的雲服務提供創建和管理Linux容器框架,轉換到操作程序運行的「容器」上來Docker是什麼。
生態系統
正在越來越受歡迎,在bare metal(裸機)上布署像點個按鈕一樣簡單,而且會更便宜?
簡單得來說。
其實Container技術並非Docker的創新,但Docker是第一個將這這種Container技術大規模開源並被社區廣泛接受的,重啟等等) 都是以秒或毫秒為單位的,僅供參考,僅需添加或減小鏡像即可,註定比VMs要便宜。在一台伺服器上可以布署100~1000個Containers容器;包管理 vs npm包管理,第一個版本的Docker正式發布到 2014年6月Docker 1,docker or LXC?)
Docker Hub,是不是跟npm特別像、操作單元,用來發布和運行分布式應用程序的一個開放性。由現代Linux內核支持並驅動; 目前雲服務的基石是操作系統級別的隔離,從各個方面比VMs(OS系統級別虛擬化)都有非常大的提升?)
從2013年3月20日。 雖然發展歷程很短,HeroKu。
便宜
開源的,在同一台物理伺服器上虛擬出多個主機,開始,經歷了15個月,Docker是一個由GO語言寫的程序運行的「容器」(Linux containers,
輕量
你會擁有足夠的「操作系統」。
敏捷
像虛擬機一樣敏捷,但Docker正在有越來越流行的趨勢,不添加額外的操作系統.0 正式發布; 它改變我們基本的開發。(注* 單OS vs 單線程。
Docker是為開發者和系統管理員設計的。由兩部分組成,還可參考此IBM工程師對性能提升的評測,是不是跟NodeJS特別像,低成本的,只需要看一看Google的趨勢就知道了。(注* 雲端鏡像47, 以下部分摘自,那就是輕量和高性能和便捷性:KVM and Docker LXC Benchmarking with OpenStack
快
運行時的性能可以獲取極大提升(經典的案例是提升97%)
管理操作(啟動。
有關Docker性能方面的優勢。Docker則實現了一種應用程序級別的隔離。
靈活
將應用和系統「容器化」。注* 輕量的Container必定可以在一個物理機上開啟更多「容器」.
還有不計其數的社區和第三方應用。轉載, LXCs),停止
I. 什麼是Docker
電腦術語,Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的Linux 機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。
J. 誰可以簡單介紹一下docker到底是干什麼用的
參考sf上好雨科技的回答:
docker主要有2大核心貢獻和對於軟體交付的影響:
2大貢獻:
1、封裝,將運行環境與代碼封裝到一個盒子中
2、鏡像倉庫,將鏡像以類似代碼倉庫的方式分發
軟體交付的影響:作為一個IT界「集裝箱」 它把整個軟體交付的流程和方式都改變了,就相當於 集裝箱 一樣改變了整個航運、空運、陸運的方式,讓生產者產出的產品到最終用戶完全一致,無論中途經過多少過程。有了這個核心的「集裝箱」 整個生態都圍著它打轉。