定制docker镜像前,用户需要了解docker相关知识和具备docker环境。请自行检查是否安装docker,本文默认用户已具备上述能力。

镜像仓库

镜像仓库是对docker镜像进行管理(新建、存储、版本管理等)的空间。需要将定制的基础镜像托管到指定仓库上以供使用者按需拉取,对具体业务应用服务进行打镜像部署。本文将以Docker Hub官方仓库作为镜像托管的空间。

注册账号并登录远程仓库

首先,在https://hub.docker.com注册一个hub的帐号;此帐号作为操作镜像与仓库的访问凭证。注册完成后,在安装docker环境的机器上通过执行docker login命令来完成Docker Hub登录。

[root@centos64-master ~]# docker login
 
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: XXX // 你的账号
Password: XXX // 你的密码
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@centos64-master ~]#

说明:hub.docker.com有时国内连的会比较慢,需要在/etc/docker/deamon.json配置国内镜像代理。

创建仓库Repositories

在https://hub.docker.com登录后,点击Repositories,进行Create Repository,例如:

Repository public与private区别见Docker Hub说明。为方便其他用户都能发现并拉取镜像,建议仓库类型选为public。

以上截图仅为示意使用。请按实际情况取名并创建,尽量取贴紧镜像有意义的名字和描述。
Create Repository创建完成,此时右侧可以看到推送命令:docker push XXX/zulu8-integration-hikvision:tagname,XXX为图中遮盖处,为登录用户名

登出远程仓库

[root@centos64-master ~]# docker logout
Removing login credentials for https://index.docker.io/v1/

push/download镜像完成后,尽量手动执行退出操作。

镜像构建

对于Java应用基础镜像主要是包括两个部分:操作系统和JDK。以下为traffic服务定制镜像,由于集成了海康威视云存储C++ SDK,因此需要将海康威视云存储的动态库文件作为依赖打入镜像并配置环境变量。

# 基础镜像
FROM debian:stable-slim
# 镜像维护者
MAINTAINER <维护者的名字或组织或邮箱等>
# 设置Locale
RUN apt-get update && apt-get install -y locales && rm -rf /var/lib/apt/lists/* \
	&& localedef -i zh_CN -c -f UTF-8 -A /usr/share/locale/locale.alias zh_CN.UTF-8
ENV LANG zh_CN.utf8
# 进入工作目录
WORKDIR /opt
# 创建JDK部署目录和海康云存储动态库存放目录
RUN mkdir /opt/java
RUN mkdir /opt/hikvision
# 将JDK/海康云存储动态库文件放到创建的文件夹中
ADD zulu8.62.0.19-ca-jdk8.0.332-linux_x64.tar /opt/java/
ADD lib.tar /opt/hikvision/
# 设置环境变量 JDK
ENV JAVA_HOME /opt/java/zulu8.62.0.19-ca-jdk8.0.332-linux_x64
ENV PATH $JAVA_HOME/bin:$PATH
# 设置环境变量 海康云存储动态库路径
ENV LD_LIBRARY_PATH /opt/hikvision/lib:$LD_LIBRARY_PATH

将Dockerfile中的zulu8.62.0.19-ca-jdk8.0.332-linux_x64.tar、lib.tar和Dockerfile拷贝到同级目录(这里必须是tar格式,ADD命令可以自行copy并解压到指定目录)
然后执行以下命令:

// 这里名字必须和仓库push命令对应,否则无法推送成功;或者在build后通过改tag方可推送,
XXX为登录用户名
[root@centos64-master jmeterDocker]# docker build -t XXX/zulu8-integration-hikvision:v1.0.0 .
...
Removing intermediate container 670509d604b6
 ---> 0f7b46e5322f
Successfully built 0f7b46e5322f
Successfully tagged XXX/zulu8-integration-hikvision:v1.0.0

待镜像构建完成后,执行推送操作,如下:

// XXX为登录用户名
[root@centos64-master jmeterDocker]# docker push 
XXX/zulu8-integration-hikvision:v1.0.0
The push refers to repository [docker.io/XXX/zulu8-integration-hikvision]
dc7d352b8cfb: Pushed 
850aeeb0b696: Pushed 
40ba041f31ee: Pushed 
58597665b839: Pushed 
68b7bf0a8f12: Pushed 
cd2401e787ba: Pushed 
a5d717d9514a: Pushed 
db64250b00fe: Pushed 
49e354abf869: Pushed 
dd0d548171f1: Pushed 
35c20f26d188: Mounted from library/java 
c3fe59dd9556: Mounted from library/java 
6ed1a81ba5b6: Mounted from library/java 
a3483ce177ce: Mounted from library/java 
ce6c8756685b: Mounted from library/java 
30339f20ced0: Mounted from library/java 
0eb22bfb707d: Mounted from library/java 
a2ae92ffcd29: Mounted from library/java 
v1.0.0: digest: sha256:e7727e818c0a67a030ad4a88707827de7c37e56c673b5a3f6ced5848639dadaf size: 4080

刷新仓库页面,如下图所示,镜像推送成功。

业务应用使用

以traffic模块为例,使用自制镜像。

# FROM后为自制镜像,业务应用打镜像时会主动从Docker Hub公有仓库中拉取,XXX为登录用户名
FROM XXX/zulu8-integration-hikvision:v1.0.0
RUN rm -f /etc/localtime && ln -sv /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
ADD ./v2xplatform-traffic-1.0.0-SNAPSHOT.jar traffic.jar
EXPOSE 9024
# Nacos是否启用
ENV nacos-enable true
# Nacos服务地址 RD-http://180.76.36.65:9005 QA-http://10.255.251.13:8849
ENV nacos-service-addr http://v2x-nacos:8849
# Nacos服务namespace
ENV nacos-service-namespace v2x-platform-stand-prod
# Eureka服务地址
ENV eureka-service-addr http://ns1-v2x-eureka:19000/eureka
# 激活配置
ENV profiles-active online
ENTRYPOINT ["java", "-server", "-XX:+UseG1GC", "-XX:+UnlockExperimentalVMOptions", "-XX:MaxRAMPercentage=90.0", "-XX:MinRAMPercentage=90.0", "-XX:MetaspaceSize=256M", "-XX:MaxMetaspaceSize=256M", "-XX:G1NewSizePercent=50", "-XX:G1MaxNewSizePercent=80", "-XX:MaxDirectMemorySize=256m", "-XX:-OmitStackTraceInFastThrow", "-jar", "traffic.jar"]

快去部署业务应用服务试试吧!
以下附件为上述定制镜像所需文件,自行解压修改即可。

完结。