天天看點

使用Docker搭建Java Web運作環境

docker 是一個基于linux容器(lxc-linux container)的進階容器引擎,基于go語言開發,

源代碼托管在 github 上, 遵從apache2.0協定開源。docker的目标是實作輕量級的作業系統虛拟化解決方案。

學習docker首先要了解幾個概念:

鏡像—docker的鏡像和常見的系統iso鏡像類似,包含了應用程式的資訊;

容器—容器相當于一個可以運作起來的虛拟機,應用程式運作在容器中,docker運作在“docker”上;

倉庫—倉庫是存放鏡像的地方,有類似git的版本控制,同樣分為公開倉庫(public)和私有倉庫(private)兩種形式;

docker支援大部分的linux發行版,通過使用docker容器,就可以在不同的作業系統,不同的機器上運作自己的應用,不用關心硬體、運作環境之類的配置,應用程式的遷移變得非常簡單。

相比傳統虛拟機技術,docker資源占用少,啟動更快,很大的友善了項目的部署和運維。

docker是在作業系統層面上實作虛拟化,複用本地主機的作業系統,傳統方式是在硬體的基礎上,虛拟出多個作業系統,然後在系統上部署相關的應用。

這張圖檔很形象的說明了docker和vm之類的傳統虛拟化技術的差別:

使用Docker搭建Java Web運作環境

 vs

使用Docker搭建Java Web運作環境

我使用的是ubuntu 14.04,在這上面安裝docker服務。

14.04版本的ubuntu倉庫中已經支援docker的安裝,可以使用快速安裝的方式,

sudo apt-get update

sudo apt-get install docker.io

service docker.io status

service docker.io start

這種方式安裝通常不是docker的最新版本,

如果想要安裝最新版本,可以去docker官網下載下傳安裝。

建構docker鏡像的一般過程是首先建立一個容器,

并在容器裡修改鏡像,配置相關環境等,最後将修改送出為一個新鏡像。

下載下傳用于制作鏡像的系統,

sudo docker pull index.alauda.cn/alauda/ubuntu

使用Docker搭建Java Web運作環境

這裡我從靈雀雲的鏡像中心拉取。

或者也可以直接從docker的鏡像中心拉取,不過貌似非常慢:

sudo docker pull ubuntu

下載下傳成功後,使用images指令檢視本地的鏡像清單:

docker images

使用Docker搭建Java Web運作環境

這裡需要注意,使用docker的時候請添加sudo。

預設安裝完 docker 後,每次執行 docker 都需要運作 sudo 指令,如果不跟 sudo,直接執行 docker 指令會報一些權限錯誤。

鏡像下載下傳到本地以後,就可以使用docker運作,

通過下面的指令參數啟動容器,

docker run <相關參數> <鏡像 id> <初始指令>

-i:表示以“互動模式”運作容器

-t:表示容器啟動後會進入其指令行

-v:表示需要将本地哪個目錄挂載到容器中,

格式:-v <主控端目錄>:<容器目錄>

我的相關程式都在目前機器的/data/software/目錄下,并且想把它挂載到容器的相同目錄下:

sudo docker run -i -t -v /data/software/:/data/software/ ae983d5e88ce /bin/bash

“鏡像 id”,也可以使用“倉庫名:标簽名”,例如:index.alauda.cn/alauda/ubuntu :latest。

上面的指令,可以使用指定的鏡像運作一個shell,如果想退出該終端,可以使用exit指令,

或者依次按下ctrl -p+ctrl -q,即可切換到主控端器。不過這種方式,容器依然在後天運作。

啟動終端後,進入/data/software/目錄,可以發現目前機器目錄下的檔案已經同步過來:

使用Docker搭建Java Web運作環境

安裝相關的jdk等程式,這裡全部安裝到/data/目錄:

tar -zxvf jdk-7u25-linux-x64.tar.gz -c /data/

mv jdk1.7.0_25 jdk

unzip apache-tomcat-7.0.54.zip -d /data/

mv apache-tomcat-7.0.54 tomcat

配置環境變量

vi /etc/profile

添加下面的配置:

#set java environment    

export java_home=/data/jdk   

export jre_home=${java_home}/jre   

export classpath=.:javahome/lib:javahome/lib:{jre_home}/lib   

export path=javahome/bin:javahome/bin:path  

export catalina_home=/data/tomcat  

export catalina_base=/data/tomcat  

儲存并退出,設定立即生效:

source /etc/profile

啟動tomcat時必須通過tomcathome/bin/catalina.sh實作,不能使用tomcathome/bin/catalina.sh實作,不能使用tomcat_home/bin/startup.sh啟動,否則腳本執行後容器會馬上退出。

vi /data/start.sh

添加以下内容:

#!/bin/bash

# export environment variable

# start tomcat

bash /data/tomcat/bin/catalina.sh run

添加可執行權限:

chmod u+x /data/start.sh

使用docker建構鏡像的兩種方法:

使用docker commit 指令,更直覺一些;

使用docker build指令和dockerfile檔案,可以模闆化鏡像建構過程;

這裡使用docker commit的方式建立鏡像。

檢視容器清單:

sudo docker ps -a

1

2

<code>container id image command created status ports names</code>

<code>39b2cf60a4c1 ae983d5e88ce:latest </code><code>"/bin/bash"</code> <code>5 hours ago exited (0) 9 seconds ago dreamy_euclid</code>

送出一個新的鏡像:

sudo docker commit 39b2cf60a4c1 bingyue/docdemo

如果有docker賬号,可以将鏡像推送到docker hub或資金的私有registry中。

現在檢視本地的docker鏡像,

sudo docker images

使用Docker搭建Java Web運作環境

可以看到本地倉庫已經有剛剛建立的docker鏡像。

3

<code>repository tag image id created virtual size</code>

<code>bingyue/docdemo latest bfc7ed316d42 about a minute ago 528.2 mb</code>

<code>index.alauda.cn/alauda/ubuntu latest ae983d5e88ce 10 months ago 255.1 mb</code>

docker inspect可以檢視新建立的鏡像的詳細資訊:

sudo docker inspect bingyue/docdemo

使用Docker搭建Java Web運作環境

docker run -d -p 18080:8080 --name docdemo bingyue/docdemo /data/start.sh

-p:表示主控端與容器的端口映射,此時将容器内部的 8080 端口映射為主控端的 18080 端口,

這樣就向外界暴露了 18080 端口,可通過 docker 網橋來通路容器内部的 8080 端口了。

檢視背景是否啟動成功:

docker ps 

測試通路:

使用Docker搭建Java Web運作環境

如果有docker倉庫的賬戶,可以将本地建立的鏡像送出至倉庫。

到這一步,差不多完成了docker的初體驗,一步一步部署下來,docker相比傳統的虛拟機技術要簡單了很多,真正複雜的應該是背後的虛拟化技術,還需要繼續深入學習。

# 下載下傳一個ubuntu鏡像 

# 使用ubuntu運作一個互動性的shell

sudo docker run -i -t ubuntu /bin/bash

#docker ps指令

sudo docker ps #列出目前所有正在運作的container

sudo docker ps -l #列出最近一次啟動的,且正在運作的container

sudo docker ps -a #列出所有的container

#port指令

docker run -p 80:8080 &lt;image&gt; &lt;cmd&gt; #映射容器的8080端口到主控端的80端口

#删除容器指令

sudo docker rm `sudo docker ps -a -q`#删除所有容器

sudo docker rm $container_id#删除容器id為container_id的容器

#其他指令快速參考:

sudo docker images #檢視本地鏡像

sudo docker attach $container_id #啟動一個已存在的docker執行個體

sudo docker stop $container_id #停止docker執行個體

sudo docker logs $container_id #檢視docker執行個體運作日志,確定正常運作

sudo docker inspect $container_id #檢視container的執行個體屬性,比如ip等等