目录
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中
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文件
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) 控制台 -> 容器镜像服务 -> 创建命名空间(建议组织,个人,公司的名字) -> 创建仓库(选择本地仓库)
注:
- 在创建仓库时那个“代码源”是个什么东东,作用是什么?
镜像容器服务提供源码仓库的镜像构建功能(如: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
成功后可以在“镜像版本”中看到上传的镜像
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