Docker入門實踐(四) 打造自己的開發環境映象
許多Docker映象都是開箱即用的,但有時候卻並不一定滿足我們的需求,比如,你直接從Docker Hub拉取的tomcat 使用的Java VM是Open JDK,但通常我們需要使用Oracle JDK。由於版權問題,Docker Hub無法提供基於Oracle的JDK,這時我們就需要深度定製符合我們需求的映象了。
映象屬於 docker build的元件,主要使用Dockerfile來完成映象的上下文定義。
目標:製作基於Oracle JDK 的Java 應用執行環境.
提示:在製作映象時,應該遵守複用原則,不要將所有東西都一次性打包到一個映象,應該根據需要,將不同功能模組製作成單獨的映象,本文將環境分為三層:base os層,jre層,tomcat層。其中每一層都可繼續用於其他映象的製作。
一 基礎映象選擇
每個映象都有一個基礎映象,做為基礎,類似於繼承,大多數映象最終都來源於scratch
映象,該映象是一個空的映象,主要用於製作其他映象,大多數時候你並不需要從該映象開始,除非你要製作一個系統映象。我們這裡並不使用該映象,因為我們關注的是應用層,所以起點選擇在作業系統之上,這裡我選擇的是Ubuntu發行版最新穩定版16.04:
$ docker pull ubuntu:16.04
等待拉取完畢,大小約130M。
二 編寫第一個Dockerfile
1 新建一個資料夾,並命名為baseos
$ mkdir baseos
該目錄作為我們構建映象的上下文,構建該映象的所有內容都會放到該目錄下。
2 進入該資料夾
$ cd baseos
3 建立Dockerfile檔案
$ touch Dockerfile
該命令會建立一個空白文字文件。
4 用你喜歡的編輯器開啟該檔案:
$ vi Dockerfile
5 貼入以下內容:
# Base os image
FROM ubuntu:16.04
MAINTAINER your_name <your_email_address>
LABEL Description="This image is the base os images." Version="1.0"
# reconfig timezone
RUN echo "Asia/Shanghai" > /etc/timezone \
&& dpkg-reconfigure -f noninteractive tzdata
說明:
- 以
#
開頭的行為註釋; - 第二行
FROM
關鍵字告訴docker我們的新映象基於哪個基礎映象; - 第三行
MAINTAINER
關鍵字是維護者資訊,可以修改為你的名字和郵箱地址; - 第四行
LABEL Description
是對映象的一個簡單說明,Version
指明該映象的版本號,方便維護; - 第六行
RUN
關鍵字用於執行一條命令。這裡主要是修改系統的時區從標準UTC改為亞洲/上海。
6 儲存退出。
三 構建第一個基礎映象
現在,我們已經準備好構建映象了,執行docker build -t example.com/baseos:1.0 .
命令構建,注意不要忘了最後的那個點.
:
$ docker build -t example.com/baseos:1.0 .
Sending build context to Docker daemon 2.048 kB
Step 1 : FROM ubuntu:16.04
---> f8d79ba03c00
Step 2 : MAINTAINER your_name <your_email_address>
---> Using cache
---> fd4f32d5433d
Step 3 : LABEL Description "This image is the base os images." Version "1.0"
---> Using cache
---> 71b121420b3b
Step 4 : RUN echo "Asia/Shanghai" > /etc/timezone && dpkg-reconfigure -f noninteractive tzdata
---> Using cache
---> eca2b07b46e8
Successfully built eca2b07b46e8
檢視我們的新映象:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
example.com/baseos 1.0 eca2b07b46e8 2 weeks ago 127.6 MB
四 構建JRE基礎映象
1 下載Oracle JRE
根據你的環境需要,下載不同版本的JRE,注意一定是Linux x64版本。本文選擇JRE 7u80
注:Oracle Java 目前的版本為 Java 8,可直接下載。要下載以前的版本需註冊Oracle帳戶登入方可下載。另外,如果你已有安裝過的JDK(Linux),也可直接將$JAVA_HOME/jre目錄打包待用。
下載好後,解壓到一個目錄,將目錄中的jre子目錄打包:
# 重新命名資料夾
$ mv jre jre1.7.0_80
# 打包
$ tar -zcvf jre-7u80-linux-x64.tar.gz jre1.7.0_80
生成:
jre-7u80-linux-x64.tar.gz
2 新建一個資料夾,並命名為jre-7u80
$ mkdir jre-7u80
3 將jre複製到該目錄:
$ cp jre-7u80-linux-x64.tar.gz jre-7u80
4 建立Dockerfile檔案
$ cd jre-7u80
$ touch Dockerfile
該命令會建立一個空白文字文件。
5 用你喜歡的編輯器開啟該檔案:
$ vi Dockerfile
6 貼入以下內容:
# Base jre image
FROM example.com/baseos:1.0
MAINTAINER your_name <your_email_address>
LABEL Description="This image is used to serve Oracle jre 7u80" Version="1.0"
# Install and config Oracle jre
ADD jre-7u80-linux-x64.tar.gz /usr/lib/jvm/
RUN update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/jre1.7.0_80/bin/java" 1 \
&& update-alternatives --set java /usr/lib/jvm/jre1.7.0_80/bin/java
ENV JAVA_HOME /usr/lib/jvm/jre1.7.0_80
說明:
ADD
關鍵字會複製新的檔案目錄或遠端檔案連結到docker的檔案系統。注意:有複製功能的還有另一個關鍵字COPY
,簡單來說,ADD
除了普通的複製功能外,還具有一些微妙的特殊功能,比如,在複製一個tar.gz包時,它會預設解壓到目標檔案系統。ENV
關鍵字用於設定環境變數,以<key> <value>
的形式,該環境變數會作用於所有後續Dockerfile命令。
7 儲存退出。
8 構建
$ docker build -t example.com/jre:7u80 .
9 檢查版本
$ docker run --rm example.com/jre:7u80 java -version
java version "1.7.0_80"
Java(TM) SE Runtime Environment (build 1.7.0_80-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.80-b11, mixed mode)
--rm
選項可以在容器執行完畢立即刪除容器。
五 構建Tomcat基礎映象
1 下載Tomcat
根據需要下載相應版本的tar.gz包,這裡下載的是Tomcat7。
2 新建一個資料夾,並命名為tomcat7-jre7
$ mkdir tomcat7-jre7
3 將下載的tomcat複製到該目錄:
$ cp apache-tomcat-7.0.70.tar.gz tomcat7-jre7
4 建立Dockerfile檔案
$ cd tomcat7-jre7
$ touch Dockerfile
5 用你喜歡的編輯器開啟該檔案:
$ vi Dockerfile
6 貼入以下內容:
# Base image
FROM example.com/jre:7u80
MAINTAINER your_name <your_email_address>
LABEL Description="This image is used to run tomcat7 with jre7." Version="1.0"
ENV CATALINA_HOME /var/lib/tomcat7
ENV PATH $CATALINA_HOME/bin:$PATH
WORKDIR $CATALINA_HOME
ADD apache-tomcat-7.0.70.tar.gz /var/lib/
RUN mv /var/lib/apache-tomcat-7.0.70 $CATALINA_HOME \
&& rm -rf /var/lib/tomcat7/bin/*.bat
EXPOSE 8080
CMD ["catalina.sh", "run"]
說明:
WORKDIR
關鍵字定義了環境的工作目錄,類似於Linux下的chroot。EXPOSE
關鍵字用於暴露容器中可用的埠,注意它並不能直接將埠對映到主機,你需要使用-p
選項來指定。CMD
關鍵字用來提供容器執行時預設執行的命令。一個Dockerfile
中只能有一個CMD
,如果存在多個,則只有最後一個會生效。- 映象工作空間:/var/lib/tomcat7
注意: 要讓一個容器保持執行狀態而不退出,容器預設執行的命令需要在前臺執行,而不是在後臺,這與我們通常在Linux環境下設定應用在後臺執行有所不同,如果你將容器中的應用設定為後臺執行的話,容器啟動完會立馬退出。
7 儲存退出。
8 構建
$ docker build -t example.com/tomcat:7-jre7 .
9 執行一個tomcat容器:
$ docker run -d --name mytomcat1 -p 8088:880 example.com/tomcat:7-jre7
c079ebcb690e60177b246879d28f483074e6e2454b812673f6336d17bdafb301
訪問192.168.1.132:8088,檢視結果:
到此,我們的環境就全部構建完畢,你可以將這幾個映象用於你的日常開發了。歡迎討論交流更多Docker的用法。
關於如何書寫更好的Dockerfile
檔案,推薦去閱讀一下官方的最佳實踐,和完整的Dockerfile參考,並在你的應用中謹遵這些最佳實踐。
(完)