Docker 入門 到部署Web 程序
最近阿裏的面試官問我Docker是做什麽用的,我記得之前360和美團,京東的都問過,但是一直沒時間看,最近有時間了,系統的學習了一下Docker,在此做一下記錄,方便各位看官學習交流
一、Docker概述:
Docker: 本意是碼頭工人,言外之意是集裝箱;
Java號稱“一次編譯,到處運行”,因為java虛擬機解決平臺的兼容性問題,所以有java虛擬機的地方就能跑java代碼;
Docker是:“一次封裝,到處運行”,因為docker決絕了應用環境的問題,安裝了docker的平臺就能跑“docker包”,這樣就決絕了“開發環境能跑,一上線就崩”的尷尬。
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。
一個完整的Docker有以下幾個部分組成:
DockerClient客戶端
Docker Daemon守護進程
Docker Image鏡像
DockerContainer容器 [2]
Docker 是一個基於Linux容器(LXC-linux container)的高級容器引擎,基於go語言開發,
源代碼托管在 Github 上, 遵從Apache2.0協議開源。Docker的目標是實現輕量級的操作系統虛擬化解決方案。
學習Docker首先要了解幾個概念:
鏡像—Docker的鏡像和常見的系統ISO鏡像類似,包含了應用程序的信息;
容器—容器相當於一個可以運行起來的虛擬機,應用程序運行在容器中,Docker運行在“Docker”上;
倉庫—倉庫是存放鏡像的地方,有類似git的版本控制,同樣分為公開倉庫(Public)和私有倉庫(Private)兩種形式;
Docker支持大部分的Linux發行版,通過使用Docker容器,就可以在不同的操作系統,
不同的機器上運行自己的應用,不用關心硬件、運行環境之類的配置,應用程序的遷移變得非常簡單。
二、Docker和傳統虛擬化技術的對比
相比傳統虛擬機技術,Docker資源占用少,啟動更快,很大的方便了項目的部署和運維。
Docker是在操作系統層面上實現虛擬化,復用本地主機的操作系統,傳統方式是在硬件的基礎上,虛擬出多個操作系統,然後在系統上部署相關的應用。
下面的這張圖片參考相關博文,很形象的說明了Docker和VM之類的傳統虛擬化技術的區別:
vs
就像一個集裝箱一樣,不管需要運送服裝還是化工產品,還是汽車,只需要放在集裝箱裏面,不管到那個船上,也不管到那個鐵路上,我直接機械化的搬運就行了。很簡單
三、真正的部署一下Dock的開發環境
首先要安裝VMware 虛擬機和 並下載Centos 操作系統,然後安裝上 Linux 環境,
此處如果不懂的話,可直接百度,
安裝完之後,我這邊不能上網,後來做了一下配置:
參考:VMware 虛擬機 不能上網 CentOS 6.5 Windows 7上面安裝了VMware,然後安裝了CentOS系統,安裝完了無法上網;
然後可以上網了,好了linux環境 準備好了,開始安裝了
(1)直接使用yum 安裝 docker:
首先肯定是要機器中安裝了docker,如果沒安裝就是用yum install -y docker 命令安裝一下
yum install -y docker
既然是部署web應用,那麽當然少不了Tomcat了,所以我們應該先拉取Tomcat鏡像。
命令如下,(開始的時候,我還跑到網上去下載tomcat,後來發現,根本不需要,直接用docker拉取就行了)
docker pull tomcat
這個鏡像有點大,所以可以事先拉取好,節省時間。
接下來我們就用Tomcat鏡像來啟動一個容器
docker run -it --name webdemo -p 80:8080 tomcat /bin/bash
這裏我們啟動一個交互式的容器,名字是webdemo,-p 80:8080表示將容器的8080端口映射到主機的80端口,這樣我們只要訪問主機的80端口就可以訪問到容器的服務了。
容器創建好了之後是會進入容器裏面的,這時我們剛好可以看看內部的文件結構。那裏有個webapps文件,我們只要把我們的web應用程序保存成war包的格式,然後再復制到這個文件中就可以了。因為Tomcat會自動幫我們解壓並且部署war包。
如何將文件從主機復制到容器中?
因為我之前的終端在容器裏面,這裏我開啟第二個終端進行操作。我的war包文件我放在/mnt/的目錄下
從主機復制到容器 sudo docker cp host_path containerID:container_path
從容器復制到主機 sudo docker cp containerID:container_path host_path
我們這裏用的命令是:
docker cp /mnt/webdemo.war a2f2091a661fa51e02c0be54f252fc46fc604932526b17038ccc267affcef12c:/usr/local/tomcat/webapps
其中那個長的字符串是容器的id,自己去查一下。 後面的路徑是容器的內部路徑,實在不懂可以復制過去,這裏要註意:冒號後面沒有空格,我之前有空格,一直復制不過去。
接下來就是啟動Tomcat了。
war包已經導入容器中了,這個時候我們可以去第一個終端查看一下
可以看到war包已經導入了。但是這個時候Tomcat服務其實是沒有啟動的,下面我們就啟動Tomcat服務,讓Tomcat幫我們完成war包的解壓和部署。
這裏我們進入bin目錄把目錄下的catalina.sh文件run起來,這樣Tomcat就跑起來了,而且Tomcat跑起來是在前端運行的,這也是我為什麽打開第二個終端的原因。
最後我們可以在瀏覽器中查看效果:
我照著網上的應用去做,上面的都沒問題,成功了,不過後來把原來創建的容器ssh關閉了,然後又打開,
如何進入已經打開的容器呢,兩種方法
a:使用docker attach命令
docker attach db3 或者 docker attach d48b21a7e439db3是後臺容器的NAMES,d48b21a7e439是容器的進程ID CONTAINER ID 然後就進去了這個容器的ssh界面。 但是它有一個缺點,只要這個連接終止,或者使用了exit命令,容器就會退出後臺運行 b:使用docker exec命令 這個命令使用exit命令後,不會退出後臺,一般使用這個命令,使用方法如下
docker exec -it db3 /bin/sh 或者 docker exec -it d48b21a7e439 /bin/sh
db3是後臺容器的NAMES,d48b21a7e439是容器的進程ID CONTAINER ID /bin/sh 是固定寫法 它也能進入這個容器
參考:如何通俗解釋Docker是什麽?
參考:Docker搭建Java Web運行環境
參考:在Docker中如何利用Tomcat快速部署web應用?
參考:docker進入後臺運行的容器
Docker 入門 到部署Web 程序