Docker修煉第一招: 先從Dockerfile開始java
百度AI開發者大賽帶你邊學邊開發,贏100萬獎金,加羣:418589053 linux
0git
收藏(5)github
東坡有詩:日建鏡像三百個,不辭長用Dockerfile。
以爲鏡像構建枯燥乏味?困貨,快來根Dockerfile吧!
做爲一枚構建鏡像的老司機,下面跟你們展現一篇Dockerfile實戰。web
老生常談,再再再……普及一下:docker
Docker:最先是dotCloud公司出品的一套容器管理工具,但後來Docker慢慢火起來了,連公司名字都從dotCloud改爲Docker。apache
Dockerfile: 它是Docker鏡像的描述文件,能夠理解成火箭發射的A、B、C、D……的步驟。ubuntu
講了這麼多,你們可能已經意識到了,想玩轉Docker必須先要搞定Docker鏡像,鏡像又來自於 Dockerfile,所以本文從Dockerfile編寫開始,與您分享Docker鏡像的製做過程,裏面有 經驗,有 技巧,還有 彩蛋~!vim
接下來,咱們經過構建一個Tomcat鏡像,來演示Dockerfile的使用方法,固然前提是你的電腦安裝了Docker環境,如何安裝Docker環境就不在此贅述了。tomcat
Dockerfile命名必須爲「Dockerfile」,Docker鏡像構建時,會查找指定目錄中的Dockerfile。
FROM ubuntu:14.04
經過FROM指令,Docker編譯程序可以知道經過哪一個基礎鏡像執行來進行編譯。全部的Dockerfile都必須以FROM指令開始。經過該指令,咱們至關於有了一個最基本的Ubuntu系統。
MAINTAINER example <example@goodrain.com>
另外咱們須要指定時區,不然咱們作出的鏡像可能會跟當前時間不符。
RUN echo "Asia/Shanghai" > /etc/timezone;dpkg-reconfigure -f noninteractive tzdata
咱們能夠像在電腦上安裝Tomcat同樣,把Tomcat安裝在Docker容器中。
咱們此時使用的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目錄。
使用 WORKDIR /app 能夠將工做目錄定位到/app 目錄下
咱們使用 第 (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,因此會解壓到此目錄下)
截止到上一步,咱們已經將須要的準備工做都作好了,剩下的還有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 # 啓動 Tomcat exec $TOMCAT_HOME/bin/catalina.sh run
EXPOSE 8080
一般狀況下,Tomcat啓動後會監聽8080端口,在容器中也同樣。
EXPOSE指令用於標明,這個鏡像中的應用將會偵聽某個端口,而且但願能將這個端口映射到主機的網絡界面上
至此,咱們要作的準備工做就作完了。使用下面這條命令,運行咱們在第6步建立的腳本,一個簡單的Tomcat的Dockerfile就編寫完成了。
ENTRYPOINT [「/app/tomcat7.sh"]
ENTRYPOINT 用於標明一個鏡像做爲容器運行時,最後要執行的程序或命令。
進入Dockerfile所在目錄,運行命令 docker build -t mytomcat . (注意最後有個點用來表示當前目錄,初次構建速度會比較慢,須要多等一會。)
出現以下信息就構建成功了
docker run -i -t -p 5000:8080 mytom
其中,docker run 用於運行一個容器
docker images #查看鏡像
docker ps -a #查看全部的容器
在宿主機中咱們輸入localhost:5000訪問,出現以下界面,表示Tomcat成功運行。
至此,咱們就成功的建立了一個Tomcat鏡像了,固然這裏只是爲了簡單演示,因此鏡像作的比較簡單,官方的Tomcat鏡像比這複雜的多,在熟悉了Dockerfile後能夠去看看官方的作法。
在作鏡像的時候有那麼多步驟,根本不可能一次將全部的步驟完成,因此,這裏教給你們一個 小技巧。
在編寫完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構建的項目。能夠方便你們學習。地址:tomcat-demo