Docker修煉第一招: 從Dockerfile開始
東坡有詩:日建鏡像三百個,不辭長用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 "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,如:
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