Docker修煉第一招: 從Dockerfile開始

ty672769 8年前發布 | 23K 次閱讀 Docker Tomcat

東坡有詩:日建鏡像三百個,不辭長用Dockerfile。

覺得鏡像構建枯燥乏味?困貨,快來根Dockerfile吧!

作為一枚構建鏡像的老司機,下面跟大家展示一篇Dockerfile實戰。

Docker、Dockerfile、Docker鏡像、容器這些都是什么鳥?

老生常談,再再再……普及一下:

  • Docker: 最早是dotCloud公司出品的一套容器管理工具,但后來Docker慢慢火起來了,連公司名字都從dotCloud改成Docker。
  • Dockerfile: 它是Docker鏡像的描述文件,可以理解成火箭發射的A、B、C、D……的步驟。
  • Docker鏡像: 通過Dockerfile做出來的,包含操作系統基礎文件和軟件運行環境,它使用分層的存儲方式。
  • 容器: 是運行起來的鏡像,簡單理解,Docker鏡像相當于程序,容器相當于進程。

講了這么多,大家可能已經意識到了,想玩轉Docker必須先要搞定Docker鏡像,鏡像又來自于 Dockerfile ,因此本文從Dockerfile編寫開始,與您分享Docker鏡像的制作過程,里面有 經驗 ,有 技巧 ,還有 彩蛋 ~!

如何通過Dockerfile快速構建鏡像

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

1、創建一個Dockerfile

Dockerfile命名必須為“Dockerfile”,Docker鏡像構建時,會查找指定目錄中的Dockerfile。

2、編寫Dockerfile

(1)環境配置

首先,我們需要指定一個基礎鏡像,為了方便,我們從Ubuntu鏡像開始。

bash

FROM ubuntu:14.04

通過FROM指令,Docker編譯程序能夠知道通過哪個基礎鏡像執行來進行編譯。所有的Dockerfile都必須以FROM指令開始。通過該指令,我們相當于有了一個最基本的Ubuntu系統。

(2)其他環境配置

我們可以像這樣指定Dockerfile的作者。

bash

MAINTAINER example <example@goodrain.com>

另外我們需要指定時區,否則我們做出的鏡像可能會跟當前時間不符。

bash

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

我們可以像在電腦上安裝Tomcat一樣,把Tomcat安裝在Docker容器中。

(3)Tomcat必要軟件安裝。

我們此時使用的Ubuntu系統其實是很簡陋的系統,上面很多系統都沒有。所以我先安裝一些必要的軟件。

bash

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 目錄。

(4)指定工作目錄

使用 WORKDIR /app 可以將工作目錄定位到/app 目錄下

(5)獲取安裝軟件

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

bash

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,所以會解壓到此目錄下)

(6)指定運行腳本

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

bash

COPY tomcat7.sh /app/tomcat7.sh

RUN chmod +x /app/tomcat7.sh

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

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

```bash

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

(7)指定端口

bash

EXPOSE 8080

```

通常情況下,Tomcat啟動后會監聽8080端口,在容器中也一樣。

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

(8)指定腳本的運行

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

bash

ENTRYPOINT [“/app/tomcat7.sh"]

ENTRYPOINT 用于標明一個鏡像作為容器運行時,最后要執行的程序或命令。

3.構建鏡像

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

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

4.運行Docker容器

bash

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

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

  • -t 在容器指定一個偽終端或者終端;
  • -i 進行命令交互;
  • -p 匹配鏡像內的網絡端口號,即我們可以通過宿主機中訪問5000端口來達到訪問容器8080端口的目的。

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

bash

docker images  #查看鏡像

bash

docker ps -a #查看所有的容器

6.查看服務是否運行

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

至此,我們就成功的創建了一個Tomcat鏡像了,當然這里只是為了簡單演示,所以鏡像做的比較簡單,官方的Tomcat鏡像比這復雜的多,在熟悉了Dockerfile后可以去看看官方的做法。

6.其他

在做鏡像的時候有那么多步驟,根本不可能一次將所有的步驟完成,所以,這里教給大家一個 小技巧

在編寫完Dockerfile到第二步的時候,其實可以先使用一個腳本先運行著,然后進入容器內部進行操作。筆者在編寫Dockerfile時先使用如下命令

bash

COPY run.sh /app/run.sh

RUN chmod +x /app/run.sh

ENTRYPOINT [“/app/run.sh"]

run.sh腳本的內容如下

bash

!/bin/bash

sleep 15

while true

do

echo &quot;true&quot;

sleep 180

done

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

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

bash

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

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

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

同樣的,如果你有一個web應用,將其放入Docker容器中,寫好Dockerfile,構建好應用運行需要的環境后,就可以很快的使用應用了。

彩蛋環節

目前支持Java,PHP,Python等多種語言的應用,不用自己構建具體環境,可以直接從源碼進行構建,十分方便。以上說的Dockerfile也是支持的。如果有寫好的程序想要跑起來可以參照好雨進行部署。----------作者:,平臺研發部

 

來自:http://dockone.io/article/1866

 

 本文由用戶 ty672769 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!