[docker]Centos7環境JAVA基礎docker鏡像構建

寫在前面

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

環境要求:

構建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鏡像用於打包。下篇會詳細記錄。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章