第一個Docker化的Java應用


Docker自從誕生以來就一直備受追捧,學習Docker是一件很炫酷、很有意思的事情。我希望通過這篇文章能夠讓大家快速地入門Docker,並有一些學習成果來激發自己的學習興趣。我也只是一個在Docker這條巨鯨上玩耍的小孩,全文如有不明確、不正確的地方,還請斧正。

Docker簡介

思想

  • 集裝箱

  • 標准化

    1. 運輸方式
    2. 存儲方式
    3. API接口
  • 隔離

Docker鏡像

所謂鏡像就是程序運行的環境的只讀版本。其包含了所有程序的依賴軟件和配置。構建鏡像的過程有些類似於在常規部署當中裝系統、配環境的過程。注意,鏡像是只讀的,因此在構建鏡像過程中不應該放入需要頻繁修改的文件和配置。比如我們自行開發的應用程序可能需要不斷的升級,則不適合放入鏡像中。

  1. 鏡像的分層

鏡像是分層的。任何鏡像都是基於一個基本鏡像(如:linux某個版本的內核)逐步構建而成。鏡像是只讀的,在構建自定義鏡像的過程中,每一步安裝和配置都是在上一個鏡像的基礎上疊加一層形成新的鏡像的過程。

  1. 獲取基礎鏡像

可以從Docker Hub上下載自己需要的基礎鏡像,其中包含大量的官方鏡像。具體使用方法可參照Docker命令一節。

Docker容器

容器是鏡像本身和疊加於鏡像之上的一個讀寫層。應用程序僅能運行於容器之中。應用程序在容器中對系統所做的修改將僅體現在讀寫層,而並不會影響到其下面的鏡像層。值得注意的是,一個容器的存儲空間是受限的。所以並不適合將應用程序的持久化功能放入容器當中。可以通過掛載外部路徑的方式將持久化數據保存在容器以外。

Docker倉庫

Ubuntu上安裝Docker

  Docker的基礎是Linux容器技術,因此學習Docker最好是使用Linux。這里推薦64位Ubuntu系統。

  在Ubuntu中只需要運行一行命令即可實現Docker的安裝:

sudo apt-get install docker.io

  運行完后,可以在終端輸入docker看到下面的界面證明我們安裝成功了(注:提示權限問題就添加sudo,下文同):

img

  從上圖可以看到,Docker的命令並不多,只有三十幾個。例如我們可以輸入docker info來查看我們安裝的Docker信息:

img

運行容器

  安裝好之后,我們就可以來開始Docker之旅了,

  我們現在的Docker還是一個”裸”Docker,上面沒有容器,等一下,什么是容器?所謂容器就是Docker中用來運行應用的,Docker的容器很輕量級,但功能卻強悍的很。也沒有鏡像。鏡像?鏡像簡單理解就是容器的只讀版本,用來方便存儲與交流。此時,我們可以通過官方提供給我們的鏡像來進行學習。比如我們想在Docker中運行一個Ubuntu系統,很簡單,Docker中得pull命令是用來獲取鏡像的,執行下面的命令,就會從官方倉庫里獲取nginx版本的鏡像:

docker pull nginx:14.04

  images命令用來查看本機Docker中存在哪些鏡像,運行 docker images 就會看到我們剛才獲取的Ubuntu14.04系統:

img

  現在,我們把剛剛的鏡像運行起來,運行起來的鏡像就叫做容器了,容器是可讀寫的,這樣我們就可以在容器里做很多有意思的事情了。run 命令就是將鏡像運行起來的,運行:

docker run -it ubuntu:14.04

  仔細看,你會發現終端交互的用戶名變掉了,說明我們進入到了容器的內部,效果如下:

img

  現在我們所做的任何操作都是針對於目前容器而言的,不會影響到原來的系統,例如,我們在里面安裝下nginx服務器,運行如下命令:

sudo apt-get install -y nginx

  完成后執行nginx -v就會發現我們已經將nginx安裝成功:

img

將容器轉化為鏡像

  在上一小節中,我們已經在容器里安裝好了nginx,接下來我們希望將這個容器內容保存下來,這樣我們下次就無需再次安裝了。這就是Docker中將容器轉換為鏡像的技術。

  如果您還在剛剛的安裝了nginx的終端里,執行exit退出此終端,回到系統本身的終端:

img

  ps命令可以查看我們當前都運行了哪些容器,加上-a參數后就表示運行過哪些容器,因為我們剛剛已經退出了安裝nginx的容器,因此我現在想查看它的話,需要使用-a參數,執行如下命令:

docker ps -a

  此時,就會顯示出我們剛剛運行的容器,並且Docker會很貼心的隨機給每個容器都起個Names方便標示。效果如下:

img

  commit命令用來將容器轉化為鏡像,運行下面的命令,我們可以講剛剛的容器轉換為鏡像:

sudo docker commit -m "Added nginx from ubuntu14.04" -a "saymagic" 79c761f627f3 saymagic/ubuntu-nginx:v1

  其中,-m參數用來來指定提交的說明信息;-a可以指定用戶信息的;79c761f627f3代表的是容器的id;saymagic/ubuntu-nginx:v1指定目標鏡像的用戶名、倉庫名和tag 信息。創建成功后會返回這個鏡像的ID信息。注意的是,你一定要將saymagic改為你自己的用戶名。因為下文還會用到此用戶名。

img

  這是我們再次使用docker images命令就會發現此時多出了一個我們剛剛創建的鏡像:

img

  此時,如果運行 docker run -it saymagic/ubuntu-nginx:v1 就會是一個已經安裝了nginx的容器:

img

存儲鏡像

  我們剛剛已經創建了自己的第一個鏡像,盡管它很簡單,但這已經非常棒了,現在,我們希望它能夠被更多的人使用到,此時,我們就需要將這個鏡像上傳到鏡像倉庫,Docker的官方Docker Hub應該是目前最大的Docker鏡像中心,所以,我們就將我們的鏡像上傳到Docker Hub。

  首先,我們需要成為Docker Hub的用戶,前往 https://hub.docker.com/ 進行注冊。需要注意的是,為了方便下面的操作,你需要將你的用戶名設為和我剛剛在上文提到的自定義用戶名相同,例如我的剛剛將鏡像的名字命名為是saymagic/ubuntu-nginx:v2,所以我的用戶名為saymagic、注冊完成后記住用戶名、密碼、郵箱。

  login默認是用來登陸Docker Hub的,因此,輸入如下命令來嘗試登陸Docker Hub:

docker login

  此時,就會輸出交互,讓我們輸入Username、Password、Email,成功輸入我們剛才注冊的信息后就會返回Login Success提示:

img

  運行命令:

docker push saymagic/ubuntu-nginx:v1

  這就是我們為什么將剛剛的鏡像命名為saymagic/ubuntu-nginx:v1的原因,如果你上面步驟都操作正確的正確的話,是會得到下面的內容:

img

  此時,不出意外的話,我們的鏡像已經被上傳到Docker Hub上面了,去Docker Hub上面看看:

img

  果然,我們在Docker Hub上有了我們的第一個鏡像,此時,其它的用戶就可以通過命令docker pull saymagic/ubuntu-nginx來直接獲取一個安裝了nginx的ubuntu系統了。不信?那就自己實踐一下吧!

Dockerfile使用

  通過上面的學習,我們掌握了如何創建鏡像、獲取鏡像、上傳鏡像、運行容器等等內容。有了上面的知識,我們來次實戰。

  我們剛剛使用了commit命令創建了一個安裝nginx的鏡像,但其實Docker創建鏡像的命令還有build,``build命令可以通過指定一個Dockerfile文件來實現將鏡像創建過程自動化。Dockerfile文件有着特定的編寫規則,但語法都還比較容易理解。這次我們不僅使用Dockerfile文件來創建一個像上文一樣安裝nginx的ubuntu鏡像,DockFile可以很輕松的完成這個問題。首先將新建一個名字為www的文件夾,文件夾下面可以放一些HTML網頁,

www的同級目錄下新建一個名為Dockerfile的文件,將DockerFile文件改寫如下:

from hub.c.163.com/library/tomcat

MAINTAINER lijiaqi sev7e0@163.com

COPY jpress.war /usr/local/tomcat/webapps 

  我來整體的解釋下這個Dockerfile文件,第一行是用來聲明我們的鏡像是基於什么構建的,這里我們指定為tomcat,第二行的作用在於告訴別人你的大名。第三行和第四行的RUN命令用來在容器內部的shell里執行命令。不理解沒關系,因為這都是固定的語法,感興趣可以多看相關內容。此時我們通過build命令來構建鏡像,運行:

docker build -t="jpress:latest" .

  注意,最后的.表示Dockerfile在當前目錄,也可指定其它目錄。此時,再次運行docker images就會看到剛剛生成的鏡像:

  現在我們就可以運行剛剛的鏡像了,和前面運行稍有不同,此時我們需要對外指定80端口,該行為通過-p參數指定,運行:

docker run -d -p 8888:8080 jpress

  此時,終端會卡住,這是正常的,因為Docker的思想是每個容器最好只開一個線程做一件事,此時我們打開了服務器,所以終端卡住也沒關系(當然是有辦法來解決這個問題,但這里不做介紹)。現在我們可以通過瀏覽器訪問localhost查看效果,如果是虛擬主機則需輸入主機ip地址,然后就能看到了如下的頁面:


接下來拉取MySQL鏡像

dcoker pull hub.c.163.com/library/mysql:latest

接下來運行MySQL鏡像

重啟Dcoker服務


到此為止 我的第一個Dcoker化的Java應用 已經完成

寫在最后

  Docker能做的事情遠不止這些,更多有意思的事情還請讀者慢慢用心去發現。
引用:http://kb.cnblogs.com/page/536115/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM