東坡並無有詩曰: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也是支持的。若是有寫好的程序想要跑起來能夠參照好雨官方文檔進行部署。
做者:超兒哥,好雨科技平臺研發部