安装Docker
提前安装好 docker(本文基于 ubuntu 20.04),具体安装方法自行搜索
制作、构建JDK8基础镜像
(1)考虑到下面制作镜像需要提前准备好jdk1.8的压缩包,所以提前下载好放在一个指定目录。我这里以/home/lw目录为例。官网链接: www.oracle.com/java/techno…
(2)在/home/lw目录下构建一个Dockerfile文件,如下:
#1、基于ubuntu:20.04基础镜像构建
FROM ubuntu:20.04
#2、指明该镜像的作者和电子邮箱
MAINTAINER shadow
#3、在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/docker
#4、一个复制命令,把jdk安装文件复制到镜像中,语法 ADD SRC DEST ,ADD命令具有自动解压功能
ADD jdk-8u361-linux-x64.tar.gz /usr/local/docker
#5、配置环境变量,此处目录为tar.gz包解压后的名称,需提前解压知晓:
ENV JAVA_HOME=/usr/local/docker/jdk1.8.0_361
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
#6、设置启动命令,如果需要进入容器内部建议使用 CMD ["/bin/bash"]
CMD ["java","-version"]
注意避坑
- 第1步选择指定的操作系统基础镜像拉取后,建议创建操作系统容器进入内部查看操作系统架构、版本信息,因为第4步要根据操作系统版本选择相应的jdk包下载。
如下我创建ubuntu容器,进入容器内部查看版本信息,为 x64 - 下载jdk压缩包,官网有很多个版本,怎么选择?
因为我的操作系统基础镜像为ubuntu x64的,所以选x64的jdk版本,如果操作系统镜像为aarch的,则应该选相对应的版本下载,不然后面构建完jdk镜像启动容器会报错!!! 参考:blog.csdn.net/m0_46360532…
- 第6步中“设置启动命令”要注意!顾名思义是容器启动时候会执行的命令。如果考虑后期要进入容器内部,一般在制作镜像时会将改命令设置为CMD ["/bin/bash"]或者在docker run 后面添加/bin/bash参数。否则可能会出现创建完容器用docker start 容器 启动不起来。如图:
但是使用 docker run ... /bin/bash 可以创建容器并直接进入容器内部,这是因为docker run命令添加/bin/bash参数会在容器启动时执行,覆盖了Dockerfile文件中的CMD命令。如图:
但本文因为是创建jdk镜像似乎也不需要进入容器内部,所以可以使用CMD ["java","-version"]命令判断jdk是否安装成功。
- 打包镜像、运行镜像、进入容器内部都可以成功。但是进入容器内部使用java -version,提示:java: command not found
参考:blog.csdn.net/yizefeng724…
(3)构建镜像
#注意不要忘了后面有个.
docker build -t jdk:1.8 .
验证
如上图所示可见jdk8镜像搭建成功!
最后
-
docker启动失败怎么查日志?
我们可以通过如下命令来获取容器的日志地址
docker inspect --format '{{.LogPath}}' 97069f94437b
然后通过cat命令查看上述命令找到的日志cat /var/lib/docker/containers/97069f94437b86b50341f8253d85f426884315c3d027f7b7fa975751c7d8e18e/97069f94437b86b50341f8253d85f426884315c3d027f7b7fa975751c7d8e18e-json.log
当然还有一个最简单的命令
docker logs 97069f94437b -
常见Dockerfile命令解析
基础镜像 -> 启动用户 -> 挂载的目录 -> 启动后运行的命令 -> 暴露的端口
(1)使用 FROM 指令指定一个基础镜像,后续指令将在此镜像的基础上运行。
指定一个用户,后续的 RUN,CMD 以及 ENTRYPOINT 指令都会使用该用户去执行,但是该用户必须提前存在。
(2)使用 WORKDIR 指定工作目录,对于 RUN,CMD,COPY,ADD 指令将会在指定的工作目录中去执行。也可以理解为命令执行时的当前目录。
(3)RUN ,使用 shell 去执行指定的命令 command,一般默认的 shell 为 /bin/sh -c。/ RUN [“executable”, “param1”, “param2”, …],使用可执行的文件或程序 executable,给予相应的参数 param。
(4)COPY 和 ADD 都用于将文件,目录等复制到镜像中。COPY 和 ADD 的不同之处在于,ADD 可以添加远程路径的文件,并且 为可识别的压缩格式,如 gzip 或 tar 归档文件等,ADD 会自动将其解压缩为目录。
(5)ENV 指令用于设置环境变量。
(6)VOLUME 指令将会创建指定的挂载目录,在容器运行时,将创建相应的匿名卷。
(7)EXPOSE 指定在容器运行时监听指定的网络端口,它与 docker run 命令的 -p 参数不一样,并不实际映射端口,只是将该端口暴露出来,允许外部或其它的容器进行访问。
要将容器端口暴露出来,需要在 dcoker run 命令中使用 -p 或者 --publish 参数。如果采用 -P 随机映射端口的方式,Docker 会将在 DockerFile 中声明的所有 EXPOSE 的端口随机映射。
参考:blog.csdn.net/hezuijiudex…