[docker]Centos7环境JAVA基础docker镜像构建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/frozenm/article/details/79253474

写在前面

对于初入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镜像用于打包。下篇会详细记录。

阅读更多

没有更多推荐了,返回首页