1. 程式人生 > >Docker 入門 到部署Web 程序

Docker 入門 到部署Web 程序

利用 bash 實現 自己 exe cto cnblogs java 開源

最近阿裏的面試官問我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 d48b21a7e439
db3是後臺容器的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 程序