Docker官方维护镜像的公共仓库网站 Docker Hub 国内无法访问了,大部分镜像无法下载,准备逐步构建自己的镜像库。【转载aliyun官方-容器镜像服务 ACR】Docker常见问题
阿里云容器镜像服务ACR(Alibaba Cloud Container Registry)是面向容器镜像、Helm Chart等符合OCI标准的云原生制品安全托管及高效分发平台。ACR企业版支持全球同步加速、大规模和大镜像分发加速、多代码源构建加速等全链路加速能力,与容器服务ACK无缝集成,帮助企业降低交付复杂度,打造云原生应用一站式解决方案。
一、下载Linux下的JDK11包
1.1 下载 jdk-11.0.19_linux-x64_bin.tar.gz
Java SE Development Kit 11.0.19
需要Oracle账号登录后才能下载。
这里放一个其他博主公开的Oracle公共账号和密码
1.2 上传下载的JDK11包到CentOS中的新建文件夹mydockerfile中
建议:dockerfile文件和jdk包放在同一个文件夹下,这样不用build时用-f参数指定dockerfile的位置。
这里文件夹的名称写成了mydockfile,应该是mydockerfile,后续已经重命名改正:
二、编写dockerfile文件并执行docker build命令构建镜像
前提:安装配置好docker,可参考我这篇 基于CentOS7安装配置docker与docker-compose。
2.1 编写并上传dockerfile文件
我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 dockerfile 文件,通过 docker build 命令来构建一个镜像。
注意:dockerfile文件要写上Linux的系统版本,我这里使用的是CentOS的系统,查询linux系统版本可参考我这篇
查看CentOS版本及系统位数与设置CentOS 7.9 2009 防火墙配置放开端口的命令与过程
dockerfile文件内容:
# 建立一个新的镜像文件,配置模板:新建立的镜像是以centos为基础模板
# 因为jdk必须运行在操作系统之上
#每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
#第一条FROM,指定使用哪个镜像源
FROM centos:7.9.2009
#维护者 作者 邮箱
MAINTAINER djcking <djc**4*****@qq.com>
#RUN 指令告诉docker 在镜像内执行命令,安装了什么
#创建一个新目录来存储jdk文件
RUN mkdir "/usr/local/java"
#将jdk压缩文件复制到镜像中,它将自动解压缩tar文件
ADD jdk-11.0.19_linux-x64_bin.tar.gz /usr/local/java
# 设置时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 设置环境变量
ENV JAVA_HOME /usr/local/java/jdk-11.0.19
ENV PATH $JAVA_HOME/bin:$PATH
# VOLUME 指定了临时文件目录为/tmp
# 其效果是在主机 /var/lib/docker 目录下创建了一个临时文件,并链接到容器的/tmp
VOLUME /tmp
上传dockerfile文件:
建议:dockerfile文件和jdk包放在同一个文件夹下,这样不用build时用-f参数指定dockerfile的位置。
2.2 执行docker build命令构建镜像
dockerfile文件、镜像-IMAGE,容器-CONTAINER三者的关系(个人学习理解):
1、docker build命令使用dockerfile文件中的配置来构建镜像-IMAGE;
2、docker run命令运行构建好的镜像-IMAGE来启动容器-CONTAINER;
3、镜像-IMAGE是死的,因为它本质上就是为了生成容器而存在的,容器-CONTAINER是活的,因为最终运行服务时使用的是容器-CONTAINER。
构建镜像命令-docker build:
参数说明:
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径
//进入存放jdk包与dockerfile的目录mydockerfile
cd mydockerfile
//-t 给新构建的镜像取名为java, 并设定版本为11
//注意最后有个点,代表使用当前路径的 Dockerfile 进行构建
//成功执行下面的docker build命令后,docker images 命令中,TAG就是11(镜像标签或者版本),Repository就是java,为镜像仓库源名。
docker build -t java:11 .
通过上图使用docker images命令 查看创建的jdk镜像已经在列表中存在,IMAGE ID也成功生成了。
docker images 各参数说明:
REPOSITORY:表示镜像的仓库源名
TAG:镜像的标签或版本
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
同一镜像仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 jdk仓库源里,有 11、12、13....20 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义并区分不同的镜像,例如jdk:11,jdk:12,jdk:13,jdk:20等。
三、通过镜像创建启动容器并校验
3.1 通过镜像创建启动容器
//运行该镜像
//此命令使用镜像java:11,创建并启动容器,执行成功会根据算法返回一个字符串,是CONTAINER ID,即辨别容器的ID。
// --name djcjdk11 代表一个别名。
docker run -id --name djcjdk11 java:11
//docker run 参数说明:
-i:交互式操作
-d:后台运行
-t:终端。
docker ps命令查看正运行的容器(默认只显示CONTAINER ID的前12位,完整的容器ID有64位,但已经足以区分不同的容器):
3.2 校验
因为我们创建的 djcjdk11容器是的本源包是 jdk-11.0.19_linux-x64_bin.tar.gz,所以校验即检查JDK的版本。
//docker exec:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止。
//可以使用NAMES即djcjdk11或者CONTAINER ID的前四位或完整的CONTAINER ID
//以下6个命令任意一个皆可
docker exec -it NAMES bash
docker exec -it CONTAINER ID bash
docker exec -it CONTAINER ID前几位 bash
即
docker exec -it djcjdk11 bash
docker exec -it 4001866f057c bash
docker exec -it CONTAINER ID前几位 bash ,如 docker exec -it 4001 bash
或者
docker exec -it NAMES /bin/bash
docker exec -it CONTAINER ID /bin/bash
docker exec -it CONTAINER ID前几位 /bin/bash
即
docker exec -it djcjdk11 /bin/bash
docker exec -it 4001866f057c /bin/bash
docker exec -it CONTAINER ID前几位 /bin/bash,如 docker exec -it 4001 /bin/bash
//检测Java版本 java --version 或java -version
java --version 或java -version
四、命令截图一览
4.1 命令
//1-进入文件夹
cd /home/mydockerfile
//2-构建镜像命令
//-t 给新构建的镜像仓库源取名为java, 并设定版本或者标签为为11 即TAG
docker build -t java:11 .
//3-查看images
docker images
//4-启动运行镜像
//此命令使用镜像java:11,创建并启动容器,执行成功会根据算法返回一个字符串,是CONTAINER ID,即辨别容器的ID。
docker run -id --name djcjdk11 java:11
//5-查看正在运行的容器
docker ps
//6-进入容器
//docker exec:推荐大家使用 docker exec 命令,因为此命令会退出容器终端,但不会导致容器的停止。
docker exec -it djcjdk11 bash
或
docker exec -it 4001 /bin/bash
//7-检测Java版本 java --version 或java -version
java --version 或java -version
--------其他命令---------
//关闭容器
//这里使用CONTAINER ID的前四位
docker stop 4001
//docker logs CONTAINER ID或者NAMES 可以查看容器内部的标准输出。
//-f: 让 docker logs 像使用 tail -f 一样来输出容器内部的标准输出。
//补充:tail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件。
//tail -f filename 会把 filename 文件里的最尾部的内容显示在屏幕上,并且不断刷新,只要 filename 更新就可以看到最新的文件内容。
docker logs 4001或者 docker logs djcjdk11
docker logs -f 4001或者docker logs -f djcjdk11
镜像和容器更多操作可以参考我这两篇文章:
Docker基本操作之删除容器Container和删除镜像IMAGE
Docker容器基本操作之启动-停止-重启
4.2 截图
五、参考资料
Docker 镜像使用
Docker 容器使用
Docker Dockerfile
Docker Compose
Docker 仓库管理
Linux tail 命令
查看CentOS版本及系统位数与设置CentOS 7.9 2009 防火墙配置放开端口的命令与过程
实战:用dockerfile创建镜像实现springboot项目容器化
实战:用docker-compose容器化springboot项目
【Docker】手动构建 OracleJDK11 镜像
【SpringBoot + Docker】编写Dockerfile安装jdk11.0.3,并部署SpringBoot项目
Docker - 安装openjdk11并启动运行
Docker之dockerfile制作jdk镜像
docker 文件编写,和jdk11运行java的Dockerfile文件
Linux rm命令 删除文件夹