1.Docker 是什麼?
Docker 是一個開源的應用容器引擎,讓開發者能夠打包他們的應用以及依賴包到一個可移植的鏡像中,而後發佈到任何流行的 Linux 或 Windows 機器上( 摘自百度 )。java
2.Docker 能幹什麼?
在講 Docker 能幹什麼以前,咱們不妨先看看沒有 Docker 和有Docker分別是個什麼樣子的?docker
先來個需求
某公司須要開發一個管理系統,因爲業務數據量龐大,須要對每一個模塊進行獨立化。shell
好比:將訂單管理抽出爲一個單獨的系統,支付管理抽出爲一個單獨的系統,會員管理也抽爲一個單獨的系統,以此類推等等。編程
那麼,要實現用戶下單支付這個邏輯,那麼首先須要調用會員管理的相關接口進行登陸,調用訂單管理的相關藉口進行下單,調用支付管理進行支付。這幾個模塊共同工做才構成了咱們一個下單支付的功能。這就是咱們常說的分佈式微服務系統。bash
他和傳統的單一模式的區別就是:將整個項目進行了模塊劃分,之前老一輩項目都是將會員,訂單,支付等系統都集合在一個項目中,這樣十分不利於後期項目的擴展。服務器
有Docker組 VS 無Dokcer組
爲了方便敘述,咱們將有無使用Docker分爲 有Docker組和無Docker組,讓他們開始PK。app
第 1 回合:比服務器資源佔用量( 資源就是金錢,沒啥好說的 )
無 Docker 組:購買了3臺服務器,將開發好的三套系統分別往一臺服務器上進行部署。
有 Docker 組:購買了1臺服務器,將開發好的三套系統分別進行 Docker 封裝,都部署到這臺服務器上。
磚家點評:無Docker組多買了2臺服務器,形成了金錢浪費,有Docker組勝出。dom
第 2 回合:比項目啓動速度( 時間就是金錢,也沒啥好說的 )
無 Docker 組:啓動1個服務前先後後花了10秒,則3個啓動完畢則花了30秒。
有 Docker 組:啓動1個服務只靠一個命令,花費1秒,那麼3個就只須要3秒。
磚家點評:無Docker組花了30秒,有Docker 組只花了3秒,有Docker組再次勝出。分佈式
第3個回合:比項目遷移( 服務器升級啊,機房變動啊,反正就是須要換服務器了 )
無Docker組:嗒嗒嗒,又從新在新服務器上安裝了一大波軟件,而後測試,總算遷移成功了,耗時大半天。
無Docker組:把每一個服務的Docker鏡像拷貝過去,不用安裝任何軟件,又一個命令在新服務器上啓動成功,耗時2分鐘。
磚家點評:這麼顯而易見的結果,還要我來點評?我太難了!微服務
通過上面幾個回合的較量,Docker 的優勢相信你或多或少已經知道一些了,我也就不總結了,固然Docker的優勢遠遠不止這些,等大家往後學會了,本身去看相關文檔摸索,本文只帶萌新入門Docker。
Docker 入門
下面以實際的例子,把我我的網站(http://www.sunnyzyq.cn)改造爲 Docker 項目。下面全部操做都是在 Linux 上操做的,請各位同窗注意,要是沒有Linux, 要麼本身花錢買個服務器,要麼本身安個虛擬機,
我的建議搞咱們這行的,仍是有必要買個服務器,1年也就幾百塊,買來想怎麼玩兒就怎麼玩兒,主要是能學到技術,多好。
(1)Docker 安裝
yum -y install docker
輸入語句執行後,就能夠看到 Docker 它正在下載了,下面 19% 是下載進度。
當你看到下圖的這個Complete,就表示 Docker 已經下載安裝好了。
(2) 查看Docker版本
是否真的已經安裝好了呢?咱們能夠經過如下命令查看Docker的版本。
docker version
此時,咱們能夠看到 Docker 的版本號爲 1.13.1,表示真的已經安裝上了。
(3) 啓動Docker
service docker start
(4) 打包項目到服務器
如今 Docker 已經啓動成功了,咱們來實戰一下,咱們先將Eclipse中的項目打成jar包放到Linux上。
(5) 建立Dockerfile
在咱們剛剛的項目jar包下同級目錄下,建立Dockerfile文件,這個文件是玩轉Docker的核心文件哦。
touch Dockerfile
如今這個Dockerfile仍是一紙空文,咱們須要將咱們的項目 jar 包寫進去。
編輯Dockerfile文件,內容以下(注意滴3行第一個是你的jar包名):
FROM java:8
VOLUME /tmp
ADD com.sunnyzyq-0.1.jar app.jar
RUN bash -c ‘touch /app.jar’
EXPOSE 80
ENTRYPOINT [「java」,"-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
不想在Linux上打字的能夠把文件拿出來編輯,而後放回去。
內容解釋:
這裏他有個鏡像名詞,不懂不要緊,看完後面就懂了,先記住這個名詞就是。
FROM :表示用哪一個基礎鏡像去構建新的鏡像,上面的java:8, 也就是jdk1.8。
ADD :表示疊加什麼鏡像到上面的基礎鏡像中。咱們如今就疊加當前目錄下的 com.sunnyzyq-0.1.jar 到基礎鏡像中。
EXPOSE:表示對外暴露的端口,我使用的是80。
RUN bash -c ‘touch /app.jar’ :使用 shell編程,執行一個 touch 命令,更新文件的訪問和修改時間 -c 若是文件不存在,則不要進行建立。具體參考liunx 的 touch 命令和shell編程。
ENTRYPOINT :入口點, 表示容器運行後默認執行的命令。
(6) 拉取基礎鏡像 java8
docker pull java:8
上面Dockerfile說得很清楚,咱們的程序須要一個基礎鏡像Java8,我這裏因爲昨天已經下載好了,因此他會提示更新,大家若是沒有下載 java8 的鏡像,請靜等下載。
(7) 構建程序鏡像
如今 java8 的基礎鏡像有了,就能夠建立咱們的程序鏡像了,就是執行剛剛那個Dockerfile文件。
docker build -t xxx .
注意:xxx 爲新鏡像名字,隨便取,別忘了最後有個點。
能夠咱們程序的鏡像已經構建成功了,並生成了一個930858c62738的鏡像ID。
(8) 查看鏡像
docker images
能夠看到剛剛的建立的鏡像,以及咱們以前下載的jave8鏡像(這裏還能夠看到,因爲我剛剛建立的鏡像和昨天建立的鏡像雖然名字不同,但其餘數據都同樣,這說明兩個鏡像底層都是指的同一個)。
(9) 中止網站項目
爲了給你們有個明顯的感覺,我用本身的網站作實驗,這一步大家看下就好,不用作什麼。
下面這個是我項目的網址界面,如今還在運行。
如今我要中止他,準備並改成 docker 的方式啓動。
能夠看到,個人網址已經成功的被停掉了,OK,咱們繼續下一步,繼續走完咱們未完成的路。
(10) 建立容器並運行
鏡像咱們已經有了,但最後能讓項目運行起來的是容器。如何理解容器與鏡像的關係呢?
鏡像能夠理解爲一個Java類,而容器能夠理解爲Java類的實例。
類只有一個,但能夠new出千千萬萬個實例對象。
因此,鏡像只是一個能夠生成容器的東西,而容器才能讓程序運行起來。
那麼,如今咱們就讓咱們用剛建立的鏡像建立一個容器,並讓他運行起來。
docker run --name 容器名 -d -p 內部端口:外部端口 鏡像名
如: docker run --name sunnyzyq -d -p 80:80 sunnzyq-docker-test
命令解釋:
容器名:我這裏取的名字爲 sunnyzyq
-d: 後臺運行容器,而且返回容器完整ID
-p: 是用於指定端口的。
內部端口:項目程序的端口
外部端口:網站域名的端口
(11) 查看運行的容器
docker ps
這樣能夠看到咱們剛運行容器的詳細信息。
docker ps -a
這樣能夠看到全部的docker下的相關容器,其餘幾個是我昨天建立的容器。
(12) 再次訪問網站
再次訪問網站,能夠看到網站又能夠訪問了,此次是docker方式啓動的。
(13)Docker 倉庫咱們的 Docker鏡像,還能夠上傳到Docker倉庫 Docker Hub 裏,只要註冊一個帳號密碼,就能上傳上去。到時,若是你想要在其餘服務器上運行你的項目,只須要從Docker hub裏下載下來,從新生成容器,不用安裝任何軟件就能夠運行了,由於須要的相關環境,你都整合到Docker鏡像裏了。