每日一句:如果你没有一颗打败困难的心,那就请不要随意触碰代码。

       闲话少说,上来就干。这次讲讲使用DockerFile 安装Oracle jdk1.8,由于花了几个晚上,走了不少弯路,所以必须记录一下,都怪自己蠢到........

一、准备

1、下载jdk

       进入Oracle 官网,找到需要的jdk,这里我使用jdk1.8版本(别问为啥,因为我喜欢啊!)。Oracle JDK下载 点击这里即可进入下载界面

请注意,千万别看到“JDK Download” 就立马兴奋的点进去下载,博主就是因为一时冲动导致花了很久都没有找到错误的原因,后面会介绍。这里点击我标记的链接进入,界面如下图所示:

下载好以后,使用xftp工具将需要的文件上传到linux服务器中,当前文件夹如下图所示:

2、编写DockerFile

         使用touch 命令,创建Dockerfile,并编写脚本,脚本如下:

#!/bin/bash
# 使用Ubuntu作为基础镜像
FROM ubuntu:latest

# 维护人信息
MAINTAINER kevin tang, www.tanghuosong.com

# 切换到usr/local 目录下
WORKDIR ./usr/local

# 创建jdk目录
RUN mkdir jdk

# 对jdk赋权
RUN chmod 777 /usr/local/jdk

# 将下载的jdk 的压缩包拷贝到镜像中,注意 ADD和COPY的区别,ADD 会解压,COPY不会解压
ADD server-jre-8u241-linux-x64.tar.gz /usr/local/jdk

# 设置JAVA_HOME 的环境变量
ENV JAVA_HOME /usr/local/jdk/jdk1.8.0_241

# 设置JAVA 环境
ENV CLASSPATH=$JAVA_HOME/bin:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

# 将java可执行文件设置到PATH中,这样就可以使用java命令了
ENV PATH=.:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH

# 向外暴露端口8088 ,这里只是演示,没有其他作用
EXPOSE 8088

# 执行java -version 命令
CMD ["java","-version"]

二、创建和运行 

1、创建docker镜像

       上面已经将Dockerfile 已经创建完毕,现在就可以使用命令创建docker镜像,执行命令 

docker build -f Dockerfile -t jdk1.8 . 

       注意命令最后有一个“.”,代表当前路径下。执行结果如下

   

   查看当前存在的镜像

   

2、运行docker镜像

      上面镜像已经创建完成,现在可以启动docker镜像了。

      执行命令:

docker run -dit -p 8088:8088 jdk1.8 /bin/bash

     命令解释:-d 代表后台运行,it 表示可以交互,-p 为端口映射(将容器端口映射到宿主主机) ,/bin/bash可以让容器不启动后立马就停止。

     执行结果:

      使用docker ps 命令,查看当前正在运行的docker 容器,如上图所示。

3、验证配置

      进入已经启动的docker容器中,验证是否正确配置jdk 环境,执行命令:

docker attach aad97bb0e7a4

     命令解释:aad97bb0e7a4 是容器的ID 

     执行结果如下:

     

    当前已经进入到相应的docker 容器里面。

     输入java -version 验证,结果如下:

    

     输出java版本,结果正确,代表配置完成。

三、问题及解决办法

1、docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"java\": executable file not found in $PATH": unknown.

  问题可能原因:

(1)java环境变量安装失败,如第一步所示,如果jdk版本下载错误,可能安装失败,按照博主所示版本可解决。

(2)java解压后路径对应不上,如上面所示,jdk的压缩包名为server-jre-8u241-linux-x64.tar.gz,解压后名称为:jdk1.8.0_241,因此为了不确定因素,应该先解压一下,查看解压后文件名称。

2、docker: Error response from daemon: driver failed programming external connectivity on endpoint cocky_cohen (8d5aa6703e0c745dc1b1d05f81699c5bf5b6fa29253a622240070e5ad291d60c): Bind for 0.0.0.0:8088 failed: port is already allocated.

 问题可能原因:

   端口映射冲突导致,修改-p后面的端口即可。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐