Dockerfile,你給我站住!

東坡並無有詩曰:java

日建鏡像三百個,不辭長用Dockerfile。linux

以爲鏡像構建枯燥乏味?困貨,快使用Dockerfile吧!git

做爲一枚構建鏡像的老司機,下面跟你們聊聊github

吊打Dockerfile的正確姿式web

Docker、Dockerfile、Docker鏡像、容器……這都是些啥東西?docker

雖是老生常談,再再再普及一下:apache

- Docker最先是dotcloud公司出品的一套容器管理工具,但後來Docker慢慢火起來了,連公司名字都從dotcloud改爲Docker。ubuntu

- Dockerfile是Docker鏡像的描述文件,能夠理解成導彈發射的A、B、C、D……的步驟。vim

- Docker鏡像是經過Dockerfile作出來的,包含操做系統基礎文件和軟件運行環境,它使用分層的存儲方式。tomcat

- 容器是運行起來的鏡像,Docker鏡像至關於程序,容器至關於進程。

講了這麼多,你們可能已經意識到了,攘外必先安內,想玩轉Docker必需要先搞定Docker鏡像,而鏡像又來自於Dockerfile,所以本文從Dockerfile編寫開始,與您分享Docker鏡像的製做過程。

 

如何經過Dockerfile快速構建鏡像?

接下來,咱們經過構建一個Tomcat鏡像,來演示Dockerfile的使用方法,固然前提是你的電腦安裝了Docker環境,Docker環境的安裝就不在此贅述了。

 

1.建立一個Dockerfile

Dockerfile命名必須爲「Dockerfile」,Docker鏡像構建時,會查找指定目錄中的Dockerfile文件。
 

2.編寫Dockerfile

 

2.1 環境配置

首先,咱們須要指定一個基礎鏡像,爲了方便,咱們從Ubuntu鏡像開始。

FROM ubuntu:14.04

 

經過FROM指令,Docker編譯程序可以知道經過哪一個基礎鏡像執行來進行編譯。全部的Dockerfile都必須以FROM指令開始。經過該指令,咱們至關於有了一個最基本的Ubuntu系統。

 

2.2 其餘環境配置

咱們能夠像這樣指定Dockerfile的做者

MAINTAINER example <example@goodrain.com>

另外咱們須要指定時區,不然咱們作出的鏡像可能會跟當前時間不符。

RUN echo "Asia/Shanghai" > /etc/timezone;dpkg-reconfigure -f noninteractive tzdata

咱們能夠像在電腦上安裝Tomcat同樣,把Tomcat安裝在Docker容器中。

 

2.3 Tomcat必要軟件安裝。

咱們此時使用的Ubuntu系統實際上是很簡陋的系統,上面不少系統都沒有。因此我先安裝一些必要的軟件。

RUN apt-get update && apt-get install -y curl vim net-tools && \       rm -rf /var/lib/apt/lists/* && mkdir -p /app

RUN指令用來在Docker的編譯環境中運行指定命令。這裏我安裝了curl、vim、net-tools,其中curl用來獲取java和tomcat的安裝包,vim和net-tools用來調試,並建立了/app目錄。

 

2.4 指定工做目錄

使用 WORKDIR /app 能夠將工做目錄定位到/app 目錄

 

2.5 獲取安裝軟件

咱們使用第3)步安裝的curl工具來獲取安裝包。

RUN  curl -L 'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz' -H 'Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile' | tar -xz \    && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz

以上命令將會從指定地址下載安裝包,並解壓到當前目錄(上一步咱們指定了工做空間爲/app,因此會解壓到此目錄下)

 

2.6 指定運行腳本

截止到上一步,咱們已經將須要的準備工做都作好了,剩下的還有Java環境變量的設置,Tomcat環境變量設置(非必須)和Tomcat的啓動。

COPY tomcat7.sh /app/tomcat7.sh
RUN chmod +x /app/tomcat7.sh

上面的兩行命令會將與Dockerfile同級目錄的tomcat7.sh文件上傳到docker容器中的/app目錄下,而且給該文件賦予可執行的權限。

看一眼該腳本的內容便一目瞭然了。

# Java環境變量配置
export JAVA_HOME=/app/jdk1.7.0_65
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

# Tomcat環境變量配置
export TOMCAT_HOME=/app/apache-tomcat-7.0.8
export PATH=$TOMCAT_HOME/bin:$PATH
# 啓動 Tomcatexec $TOMCAT_HOME/bin/catalina.sh run

 

2.7指定端口

EXPOSE 8080

一般狀況下,Tomcat啓動後會監聽8080端口,在容器中也同樣。

EXPOSE指令用於標明,這個鏡像中的應用將會偵聽某個端口,而且但願能將這個端口映射到主機的網絡界面上

 

2.8 指定腳本的運行

至此,咱們要作的準備工做就作完了。使用下面這條命令,運行咱們在第6步建立的腳本,一個簡單的Tomcat的Dockerfile就編寫完成了。

ENTRYPOINT [「/app/tomcat7.sh"]

ENTRYPOINT  用於標明一個鏡像做爲容器運行時,最後要執行的程序或命令。


3.構建鏡像

進入Dockerfile所在目錄,運行命令 docker build -t mytomcat . (注意最後有個點用來表示當前目錄,初次構建速度會比較慢,須要多等一會。) 

出現以下信息就構建成功了


 

4.運行Docker容器

docker run -i -t -p 5000:8080 mytom

其中,docker run 用於運行一個容器

 -t 在容器指定一個僞終端或者終端;

-i 進行命令交互;

-p 匹配鏡像內的網絡端口號,即咱們能夠經過宿主機中訪問5000端口來達到訪問容器8080端口的目的。

 

5.查看構建好的鏡像和運行的容器

docker images  #查看鏡像

docker ps -a #查看全部的容器

 

6.查看服務是否運行

在宿主機中咱們輸入localhost:5000訪問,出現以下界面,表示Tomcat成功運行。


至此,咱們就成功的建立了一個Tomcat鏡像了,固然這裏只是爲了簡單演示,因此鏡像作的比較簡單,官方的Tomcat鏡像比這複雜的多,在熟悉了Dockerfile後能夠去看看官方的作法。

 

7.其餘

在作鏡像的時候有那麼多步驟,根本不可能一次將全部的步驟完成,這裏給你們分享一個小技巧。

在編寫完Dockerfile到第二步的時候,其實能夠先用一個腳本運行着,而後在容器內部進行操做。筆者在編寫Dockerfile時先使用以下命令:

COPY run.sh /app/run.sh      
RUN chmod +x /app/run.sh      
ENTRYPOINT [「/app/run.sh"]

run.sh腳本的內容以下:

#!/bin/bash      
sleep 15      
while true      
do      
     echo "true"     
    sleep 180      
done

其實就是一段死循環代碼代替原有的tomcat7.sh,接着就能夠build和run咱們的容器了。容器運行起來後使用docker exec -it container_id bash 進入docker容器。此時就和咱們平時裝軟件的方式同樣了,作完一個步驟,在Dockerfile中記錄一條,這樣Dockerfile也就作出來了。(ps:exit退出容器。)

特別注意的一點,若是作好鏡像之後,在鏡像中有須要保存的數據(持久化目錄)須要咱們在Dockerfile中指定持久化目錄。爲了可以保存(持久化)數據以及共享容器間的數據,Docker提出了Volume的概念。簡單來講,Volume就是目錄或者文件,它能夠繞過默認的聯合文件系統,而以正常的文件或者目錄的形式存在於宿主機上。而且咱們運行容器的時候須要使用使用 -v 來聲明Volume,如:

docker run -it -v /home/dock/logs:/usr/logs tomcat /bin/bash

冒號前爲宿主機目錄,必須爲絕對路徑,冒號後爲鏡像內掛載的路徑,這樣容器內更改的數據就被寫到宿主機上了。

擁有了Tomcat服務器後,就能夠跑寫好的java-web程序了,如何運行java-web程序就不在此詳述了,跟普通運行java-web程序同樣。

 

一樣的,若是你有一個web應用,將其放入Docker容器中,寫好Dockerfile,構建好應用運行須要的環境後,就能夠很快的使用應用了。

Dockerfile源碼已放到好雨的github公共倉庫了,上面有不少使用Dockerfile構建的項目。能夠方便你們學習。

地址:https://github.com/goodrain-apps/tomcat-demo

最後補充一點,好雨雲幫目前支持Java,PHP,Python等多種語言的應用,不用本身構建具體環境,能夠直接從源碼進行構建,十分方便。以上說的Dockerfile也是支持的。若是有寫好的程序想要跑起來能夠參照好雨官方文檔進行部署。

 

做者:超兒哥,好雨科技平臺研發部

相關文章
相關標籤/搜索