此教程以个人博客为例,提供些自己使用的技巧,并分享几个以前用过的示例

一般需要两个镜像

  • 基础镜像,里面安装好打包环境,并下载依赖包,可以写脚本定时更新基础镜像
  • 服务运行环境,比如我博客需要个 nginx 服务,golang 的话选好系统直接运行就行

1 基础镜像制作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM node:16.14.2-alpine3.15 # 获取npm环境镜像
RUN npm config set registry http://registry.npm.taobao.org/ && \ # 修改镜像源,要不下依赖包特别慢
npm i -g npm@8.8.0 && \ # 更新npm
npm i -g hexo@5.4.2 && \ # 安装hexp
mkdir /opt/blog && \ # 创建博客打包目录
cd /opt/blog && \ # 进入博客目录
hexo i && \ # hexo初始化
rm -rf source _config.landscape.yml _config.yml && \ # 删除默认的配置文件
npm uninstall hexo-theme-landscape && \ # 安装依赖包
npm cache clean --force # 清空缓存

COPY source_data/ /opt/blog/ # 把我自己的博客配置拷到容器里
WORKDIR /opt/blog/ # 指定运行目录
RUN npm i # 容器运行命令

1.1 基础镜像可以加上清空缓存命令来减少镜像体积

一些常见的包管理器删除缓存的方法:

yum yum clean all
dnf dnf clean all
npm npm cache clean –force
pip rm -rf ~/.cache/pip/*
apt-get apt-get clean

2 运行业务容器镜像制作

1
2
3
4
5
6
7
8
9
10
11
12
FROM ccr.ccs.tencentyun.com/ccops/hexo:5.4.2-1 AS build-env # 刚才制作的基础镜像
ADD . /opt/blog/source/_posts # 文章拷贝到指定目录
WORKDIR /opt/blog/source/_posts # 指定工作目录
RUN rm -rf /opt/blog/source/_posts/Dockerfile /opt/blog/source/_posts/deployment.yaml # 删除多余文件,要不然我这里打包会报错
RUN hexo g # 进行打包

FROM ccr.ccs.tencentyun.com/ccops/nginx:1.21.6-alpine # 运行服务容器,这里我只修改了下日志格式
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime # 指定时区
COPY --from=build-env /opt/blog/public/ /opt/blog # 将上个构建的产物复制到当前目录,名字一样(build-env)
EXPOSE 80 # 对外暴露端口
WORKDIR /opt/blog # 工作目录
CMD ["nginx","-g","daemon off;"]

2.1 多阶段构建

  • 能复用 Pipeline,不用每个语言都写个打包 task
  • 减少体积,业务运行容器只存在代码
  • 保证构建镜像的安全性,最终构建的镜像将不包含任何源代码信息

3 维护镜像

3.1 下载工具

dive · GitHub

3.2 安装

因为安装到了/usr/local/bin/dive 下,可能会出现直接执行不了的情况,指定路径或者挪到/usr/bin 下

rpm -ivh dive_0.10.0_linux_amd64.rpm

3.3 使用

dive 镜像名或镜像 id

可以看到比较重要的信息,我哪层用的空间哪个文件比较大

image-20220510143407087

3.4 快捷键

快捷键 描述
Ctrl + C 退出
Tab 在层和文件树视图之间切换
Ctrl + F 筛选
PageUp 向上滚动页面
PageDown 向下滚动页面
Ctrl + A 镜像视图:查看聚合图像修改
Ctrl + L 镜像视图:查看当前图层修改
Space 文件树视图:折叠/取消折叠目录
Ctrl + Space 文件树视图:折叠/展开所有目录
Ctrl + A 文件树视图:显示/隐藏添加的文件
Ctrl + R 文件树视图:显示/隐藏已删除的文件
Ctrl + M 文件树视图:显示/隐藏修改的文件
Ctrl + U 文件树视图:显示/隐藏未修改的文件
Ctrl + B 文件树视图:显示/隐藏文件属性
PageUp Filetree 视图:向上滚动页面
PageDown Filetree 视图:向下滚动页面

4 其他一些例子

4.1 Java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
FROM harbor.rx.cn:80/rongxin/maven:3.5.0-jdk-8-alpine AS build

# 拷贝源代码
ADD ./pom.xml pom.xml
ADD ./src src/

# 构建jar包,
mvn clean package -U -Dmaven.test.skip=true

FROM harbor.rx.cn:80/rongxin/basic:java8
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone
# 拷贝程序
COPY --from=builder target/*.jar /var/app/
# 配置jvm
ENV JVM_PARAMS="-Xmx4096m -Xms4096m -Xmn1536m -Xss256k -XX:+UseConcMarkSweepGC -XX:+UseCompressedClassPointers -XX:+PrintGCDetails -XX:+PrintGC -XX:+PrintGCTimeStamps -Xloggc:/var/app/logs/$APPLICATION_NAME/gc/gc.log -verbose:gc"
# 开放端口
EXPOSE 8080
EXPOSE 5000 # 远程调试接口
# 使用tini
ENTRYPOINT ["/sbin/tini","--"]
# 配置功能,不需要的删除就行
# JAVA_DEBUG_PROT,远程debug
# JAVA_AGENT,SkyWalking客户端
CMD java -jar -Dspring.profiles.active=$SPRING_PROFILES_ACTIVE $JVM_PARAMS $JAVA_START $JAVA_AGENT /var/app/*.jar

4.2 Golang

1
2
3
4
5
6
7
8
9
10
11
12
13
FROM ccr.ccs.tencentyun.com/ccops/golang:1.17.8 AS build-env
ENV GOPROXY https://goproxy.cn
ADD . /go/src/app
WORKDIR /go/src/app
RUN go mod tidy
RUN GOOS=linux GOARCH=386 go build -v -o /go/src/app/app-server
FROM ccr.ccs.tencentyun.com/ccops/alpine:3.15.3
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \
apk add -U tzdata
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
COPY --from=build-env /go/src/app/app-server /usr/local/bin/app-server
EXPOSE 8080
CMD [ "app-server" ]