1. 程式人生 > >[docker]Centos7環境JAVA基礎docker映象構建

[docker]Centos7環境JAVA基礎docker映象構建

寫在前面

對於初入Docker的童鞋來說,構建基礎映象可能無從下手。此文以java例,對構架Docker基礎映象的過程做簡要的記錄。
建立映象也可以使用Dockerfile。本文主要介紹使用最基礎的自定義方式建立映象。

環境要求:

  • Centos7
  • 安裝Docker CE版。參見這裡

構建JAVA映象環境

  1. 以centos為基礎映象,啟動一個docker例項。attach到這個環境內部:

    sudo docker run -it -v <your-local-volumn-dir>:<docker-volumn-dir> centos /bin/bash

    其中相關引數包括:
    -i:表示以互動模式執行容器
    -t:表示容器啟動後會進入其命令列
    -v:表示需要將本地哪個目錄掛載到容器中,格式-v<宿主機目錄>:<容器目錄>
    假設我們的所有安裝程式(例如java安裝包、maven安裝包等)都放在了宿主機的/root/software/目錄下,現在需要將其掛載到容器的/mnt/software/目錄下,就可以將上述命令中的-v部分寫成:
    -v /root/software/:/mnt/software/
    現在,就可以為這個容器安裝軟體了。
    另:Docker 傳送檔案命令
    docker cp more.log <Docker ID>:/tmp/

  2. 安裝JAVA環境
    安裝jdk。
    2.1 從Oracle官網下載所需要的JDK壓縮包。進入Docker啟動時指定的存放軟體的目錄中,解壓JDK,然後重新命名資料夾mv jdk1.8.0_73/jdk/
    2.2 配置環境變數(重要)
    vim ~/.bashrc
    在檔案末尾新增如下配置:

    export  JAVA_HOME=/usr/local/jdk
    export  PATH=$PATH:$JAVA_HOME

    用文字編輯器開啟/etc/profile,在profile檔案末尾加入:

    export JAVA_HOME=/usr/local/jdk
    export JRE_HOME=$JAVA_HOME/jre
    export
    PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=$CLASSPATH:.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

    儲存檔案,退出。使用source命令,讓環境變數生效:

    $ source ~/.bashrc
    $ source /etc/profile
  3. 上傳docker映象
    退出你剛才配置好的docker例項:

    $ exit

    使用以下命令可以看到剛才退出的docker例項(這個命令類似與Linux的ps -a 可以檢視所有docker例項,包括正在執行的和停止執行的):

    $ docker ps -a

    可以看到,你剛才停止的docker例項的Docker ID,假設為89c153ff574e。使用以下命令,根據某Docker ID來建立一個新的image

    docker commit 89c153ff574e java-base:1.8

    該容器ID是89c153ff574e,所建立的映象名是java-base:1.8
    提交了新的映象你可以把這個映象儲存tar包:

    docker -o ~/java-base.tar  java-base

    docker save -o 儲存的目錄 映象名

  4. 檢視映象
    docker images看看當前所有的映象,可以看到剛才提交的映象。
    docker push <your-image-name:TAG>可以將映象提交到DockerHub。(需要先註冊)

在完成上述操作後,你就有一個centos為作業系統的java8環境了。可以以此為基礎構建專案、工程。

構建自己的專案

使用以上述java8 Docker映象構建專案,本質上是以上述映象為底層映象,將你的專案的jar包、啟動命令(假設是shell指令碼)打包構建成一個新的映象。打包方式可以使用Dockerfile.
可以考慮這種做法:
將專案jar包放在某個對映路徑下(例如上文中的/root/software/),在啟動指令碼中,將此jar包拷貝到工作路徑下,然後再啟動。這樣可以確保你的專案的base映象肯定可以執行(因為在最初建立base映象的時候,有個初始的jar包在工作路徑下),而後續更新,只需要更新宿主的對映路徑下的專案jar包即可。
示例Dockerfile:

FROM <your-repository>/java-base:1.8

WORKDIR /var/project

COPY  /home/docker1/certs /var/prog/certs
COPY  /home/docker1/project /mnt/software/project

EXPOSE 8080

CMD ["/bin/bash", "./start_api.sh"]

start_api.sh示例:

#!/bin/bash
cp /mnt/software/project/* .
/usr/local/jdk/bin/java -cp your-project.jar com.your.project.Application &

關於Dockerfile中的ADD, COPY的簡單區別,可以參見這裡

啟動專案

  1. 命令列啟動:

    docker run -d -p 10000:8080 -v /home/docker1/project:/var/project -v /home/docker1/certs:/var/project/certs <your-repository>/<your-image-name> /var/project/start_api.sh

    引數解釋:
    -d: 表示後臺執行。用於啟動一個服務,例如後端伺服器、web伺服器等等。
    -p <local-port>:<docker-inside-port>: 指定將宿主機的port對映到docker內部的port。這樣通過訪問宿主機的port,就可以訪問docker內部對應的服務。
    最後一個引數,是啟動時執行的指令。這裡假設是通過某個shell指令碼啟動的,就指定執行該指令碼。
    使用指令碼啟動時,需要注意:如果開頭這一行#!/bin/bash丟了,會報錯

  2. 使用docker-compose
    更為方便的啟動方式,是使用docker-compose命令。先建立一個空的docker-compose.yml檔案,例如:

    version: '2'
    services:
    <your-service-name>:
        image: "<your-repository>/<your-image-name>"
        ports:
            - "10000:8080"
        volumes:
            - /home/docker1/project:/var/project
            - /home/docker1/certs:/var/project/certs

    docker-compose.yml所在路徑,使用命令:

    $ docker-compose

    即可自動按照docker-compose.yml中的配置啟動docker例項。

  3. 如果專案需要在docker中增加自定義的hosts,即修改/etc/hosts檔案。
    命令列啟動方式:
    docker run命令中使用--add-host <your-host-name>:<your-host-ip>選項增加。如果有多個,就寫多個--add-host
    docker-compose方式:
    使用extra_hosts來指定。示例:

    version: '2'
    services:
    <your-service-name>:
        image: "<your-repository>/<your-image-name>"
        ...
        extra_hosts:
            - "host1:1.2.3.4"
            - "host2:1.2.3.5"
        ...

    由於專案需要,要基於java8映象構建maven映象用於打包。下篇會詳細記錄。