1. 程式人生 > >Docker入門實踐(四) 打造自己的開發環境映象

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,檢視結果:

apache tomcat index page

到此,我們的環境就全部構建完畢,你可以將這幾個映象用於你的日常開發了。歡迎討論交流更多Docker的用法。

關於如何書寫更好的Dockerfile檔案,推薦去閱讀一下官方的最佳實踐,和完整的Dockerfile參考,並在你的應用中謹遵這些最佳實踐。

(完)