目录

1. alpine 简介

2. 基于alpine构建jdk8镜像

2.1 Dockerfile

2.2 将构建目录上传到linux中

2.3 执行构建

3. 镜像瘦身

4. 上传阿里云镜像仓库


1. alpine 简介


Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了musl libc 和 BusyBox以减少系统的体积和运行时的资源消耗。
Alpine Linux提供了自己的包管理工具:apk(注意:ubuntu中是apt-get,centos中式yum),我们可以通过https://pkgs.alpinelinux.org/packages 查询包信息。

Alpine Docker镜像继承了Alpine Linux发行版的这些优势,相比于其他Linux Docker镜像,它的体积非常小对比常用的、没有压缩过的基础镜像(查看当前的:latest标签)。
Alpine - 4.8MB
Ubuntu - 124.8 MB (现在ubuntu18.04镜像已经压缩到80几M了)
Debian - 125.1MB
Centos - 196MB

关于alpine最新的信息请参看官网

2. 基于alpine构建jdk8镜像


2.1 Dockerfile


1)在本地创建一个目录,并将构建所需要的软件包放入目录,如下图所示:

注:

  • glibc相关的东东是什么?为什么需要?
    glibc是GNU发布的libc库(即c语言库),是linux的的最底层api,是linux系统的基石。因为alpine默认是使用musl libc作为底层api(该api优点是小),该musl libc仅能支持openjdk,我们需要安装oracle jdk必须用glibc才行
  • 为什么需要将glibc相关包,及jdk8都先下载好放在目录里呢? 在构建镜像时不能下载吗?
    可以在构建时下载,但太慢了,预先将包放在构建目录下要快得多。
  • 上面参照图片中目录名是alpine,是必须叫这个名字吗?
    不是,名称随便你命名,但要有意思,这是个好习惯,就像代码要注意可读性一样。

2)Dockerfile内容

# 指定基础镜像,并且必须是第一条指令
FROM alpine:3.10

# 维护信息,指明作者和邮件
MAINTAINER lisen "lisen@163.com"

# 在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/java

# 将jdk复制到容器的/usr/local/java目录中,ADD会执行解压,如果是COPY则仅复制
ADD jdk-8u151-linux-x64.tar.gz /usr/local/java

# glibc安装包如果从网络下载速度实在是太慢了,先提前下载复制到镜像中
COPY glibc-i18n-2.30-r0.apk /usr/local/java
COPY glibc-bin-2.30-r0.apk /usr/local/java
COPY glibc-2.30-r0.apk /usr/local/java

# 更新Alpine的软件源为阿里云,因为从默认官源拉取实在太慢了
RUN echo http://mirrors.aliyun.com/alpine/v3.10/main/ > /etc/apk/repositories && \
echo http://mirrors.aliyun.com/alpine/v3.10/community/ >> /etc/apk/repositories
RUN apk update && apk upgrade

# 运行指定的命令
## Alpine linux为了精简本身并没有安装太多的常用软件,apk类似于ubuntu的apt-get,
## 用来安装一些常用软V件,其语法如下:apk add bash wget curl git make vim docker
## wget是linux下的ftp/http传输工具,没安装会报错“/bin/sh:   wget: not found”
## ca-certificates证书服务,是安装glibc前置依赖
RUN apk --no-cache add ca-certificates wget &&\
    wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub &&\
    apk add glibc-2.30-r0.apk glibc-bin-2.30-r0.apk glibc-i18n-2.30-r0.apk &&\
    rm -rf /var/cache/apk/* glibc-2.30-r0.apk glibc-bin-2.30-r0.apk glibc-i18n-2.30-r0.apk

# 设置环境变量
ENV JAVA_HOME=/usr/local/java/jdk1.8.0_151
ENV PATH=$JAVA_HOME/bin:$PATH

2.2 将构建目录上传到linux中


alphine 镜像 邮件 alpine镜像是什么_运维

 

2.3 执行构建


1)登录linux系统
2)来到构建目录下
3)执行构建命令即可

root@ubuntu:/home/lisen/alpine# docker build -t lisen/tiny-jdk8:v1.0 .

注意:

  • 我怎么报错了:"docker build" requires exactly 1 argument.
    不要忘了最后的那个点“.” 表示当前目录,这个比较容易被忽略。
  • 我可以在这个目录外执行构建不?
    不行,这个目录是构建目录,是构建时的执行上下文

3. 镜像瘦身


瘦身的思路很简单,分为三个步骤:

  • 将jdk换为jre,因为我们在容器中只用运行时环境就可以了,jre体积比jdk小
  • 将jre中可以删除的内容删除,如文档资料等
  • 使用jre重新构建镜像

1)将jre-8u221-linux-x64.tar.gz上传到linux中
2)在linux中执行解压

root@ubuntu:/home/lisen# tar zxf jre-8u221-linux-x64.tar.gz
root@ubuntu:/home/lisen# ls
alpine                       jre1.8.0_221

3)进入jre1.8.0_221目录,进行jre瘦身

#jre瘦身
rm -rf COPYRIGHT LICENSE README release THIRDPARTYLICENSEREADME-JAVAFX.* THIRDPARTYLICENSEREADME.* Welcome.html 

rm -rf lib/plugin.jar \
lib/ext/jfxrt.jar \
bin/javaws \
lib/javaws.jar \
lib/desktop \
plugin   

    rm -rf lib/deploy* \
    lib/*javafx* \
    lib/*jfx* \
    lib/amd64/libdecora_sse.so \
    lib/amd64/libprism_*.so \
    lib/amd64/libfxplugins.so \
    lib/amd64/libglass.so \
    lib/amd64/libgstreamer-lite.so \
    lib/amd64/libjavafx*.so \
    lib/amd64/libjfx*.so

4)将瘦身之后的jre拷入alpine(构建目录)

root@ubuntu:/home/lisen# mv jre1.8.0_221/ alpine

5)进入alpine目录修改Dockerfile文件

alphine 镜像 邮件 alpine镜像是什么_alphine 镜像 邮件_02

 

6)重新通过Dockerfile重新构建镜像

root@ubuntu:/home/lisen/alpine# docker build -t lisen/tiny-jdk8:v2.0 .

7)通过镜像运行容器,主要为测试镜像

#构建镜像
root@ubuntu:/home/lisen/alpine# docker run -itd --name tinyjdk8-container lisen/tiny-jdk8:v2.0
ed346c332ef0c30459820b6deab14dad2a7655440bd79f6490ed9cade0511430

#进入容器
root@ubuntu:/home/lisen/alpine# docker exec -it ed346c /bin/sh
/usr/local/java # java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
/usr/local/java #

#停止所有容器
root@ubuntu:/home/lisen/alpine# docker stop $(docker ps -aq)

4. 上传阿里云镜像仓库


阿里云镜像仓库简介:
阿里云默认实例版(免费版):命名空间:5个, 单命名空间下私有仓库数200个,单命名空间下公开仓库总数1000个,镜像版本总数不限制,构建规则总数5个,构建任务并发3个,同步任务并发3个,不支持交付链。

1) 登录阿里云账户

2) 控制台 -> 容器镜像服务 -> 创建命名空间(建议组织,个人,公司的名字) -> 创建仓库(选择本地仓库)

alphine 镜像 邮件 alpine镜像是什么_debian_03

 

注:

  • 在创建仓库时那个“代码源”是个什么东东,作用是什么?
    镜像容器服务提供源码仓库的镜像构建功能(如:github,云code等),支持源码修改后自动进行镜像构建,本示例为配置简单选择了本地仓库。

3)在仓库创建成功后,按提示步骤进行操作,将镜像推送到阿里云
第一步:打标签
格式:
sudo docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/lisensir/tinyjdk8:[镜像版本号]
示例:

sudo docker tag 457b3f475453 registry.cn-hangzhou.aliyuncs.com/lisensir/tinyjdk8:v2.0
  • 457b3f475453 为需要上传的镜像ID, [镜像版本号]为需要上传的镜像的版本号

第二步:push
格式:
sudo docker push registry.cn-hangzhou.aliyuncs.com/lisensir/tinyjdk8:[镜像版本号]
示例:

sudo docker push registry.cn-hangzhou.aliyuncs.com/lisensir/tinyjdk8:v2.0

成功后可以在“镜像版本”中看到上传的镜像

alphine 镜像 邮件 alpine镜像是什么_bc_04

 

4)拉取镜像
格式:
sudo docker pull registry.cn-hangzhou.aliyuncs.com/lisensir/tinyjdk8:[镜像版本号]
示例:

sudo  docker pull registry.cn-hangzhou.aliyuncs.com/lisensir/tinyjdk8:v2.0

5)通过拉取的镜像运行容器(目的是为了测试)

root@ubuntu:/# docker images
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
lisen/tiny-jdk8                                       v2.0                457b3f475453        About an hour ago   173MB
registry.cn-hangzhou.aliyuncs.com/lisensir/tinyjdk8   v2.0                457b3f475453        About an hour ago   173MB

root@ubuntu:/# docker run -itd --name tinyjdk8 457b3f475453
a7566e8904d681825633e3fe1b7168031e83127d784f24b225367d512746a77d
root@ubuntu:/# docker exec -it a7566 /bin/sh
/usr/local/java # java -version
java version "1.8.0_221"
Java(TM) SE Runtime Environment (build 1.8.0_221-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.221-b11, mixed mode)
/usr/local/java #

成功, over