Nacos Arm版本docker镜像手动编译

1,988 阅读4分钟

最近遇到需要在arm架构下进行部署服务,同时将原有的服务都切换成docker部署。在部署nacos时,一开始准备找一下官方镜像时,发现没有arm版本的,都是amd即是x86架构下的nacos镜像。无奈之下只能自己手动进行docker镜像的编译打包上送。

镜像基础配置准备

bin启动脚本
conf配置文件
Dockerfile制作镜像的文件
init.d配置文件
nacos-server启动的文件,版本是1.1.3

Dockerfile文件制作

FROM centos:centos7
MAINTAINER pader "zooooooooy"

# set environment
ENV MODE="standalone" \
    PREFER_HOST_MODE="ip"\
    BASE_DIR="/home/nacos" \
    CLASSPATH=".:/home/nacos/conf:$CLASSPATH" \
    FUNCTION_MODE="all" \
    JAVA_HOME="/usr/lib/jvm/java" \
    NACOS_USER="nacos" \
    JAVA="/usr/lib/jvm/java/bin/java" \
    JVM_XMS="1g" \
    JVM_XMX="1g" \
    JVM_XMN="512m" \
    JVM_MS="128m" \
    JVM_MMS="320m" \
    NACOS_DEBUG="n" \
    TOMCAT_ACCESSLOG_ENABLED="false" \
    TIME_ZONE="Asia/Shanghai"

ARG NACOS_VERSION=1.1.3
ARG HOT_FIX_FLAG=""

WORKDIR $BASE_DIR

RUN set -x \
    && yum update -y \
    && yum install -y iputils nc  vim libcurl
ADD nacos-server/nacos /home/nacos/
RUN yum autoremove -y wget \
    && ln -snf /usr/share/zoneinfo/$TIME_ZONE /etc/localtime && echo $TIME_ZONE > /etc/timezone \
    && yum clean all

ADD bin/docker-startup.sh bin/docker-startup.sh
ADD conf/application.properties conf/application.properties

RUN mkdir -p logs \
        && cd logs \
        && touch start.out \
        && ln -sf /dev/stdout start.out \
        && ln -sf /dev/stderr start.out
RUN chmod +x bin/docker-startup.sh

有一些注意点需要处理

  1. FROM需要选择有arm版本的镜像
  2. 配置ENV时,不太想在镜像中安装jdk,因此后续需要把JDK的路径映射到容器中去,启动的时候需要做相应的配置,否则会找不到jdk。
  3. 通过ADD命令将1.1.3nacos的服务端代码加载到容器中
  4. time_zone其实可以通过映射的方式处理,这里也可以不操作

创建镜像

命令:

docker buildx build --platform linux/arm64/v8 -t zooy/nacos:1.1.3 .

buildx来指定编译arm64版本。指定对应的本地tag,非常轻松就完成了一个本地的镜像构建。

可以看到我们构建了一个zooy/nacos:1.1.3版本的nacos镜像包

Nacos中Mysql指定

nacos也同步提供了连接自定义的mysql连接,持久化我们的配置文件。做了一下配置文件映射

手动指定mysql的连接方式,application.properties中的配置如下:

# spring
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_SERVER_PORT:8848}
spring.datasource.platform=mysql
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=1
db.url.0=jdbc:mysql://172.16.1.144:3306/nacos_config?characterEncoding=utf8&serverTimezone=UTC&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.url.1=jdbc:mysql://${MYSQL_SLAVE_SERVICE_HOST}:${MYSQL_SLAVE_SERVICE_PORT:3306}/${MYSQL_MASTER_SERVICE_DB_NAME}?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_config
db.password=nacos_config
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D
# default current work dir
server.tomcat.basedir=
## spring security config
### turn off security

nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/**
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false

nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true

有一个点要注意,spring.datasource.platform这个配置需要指定为mysql,否则不会生效。db.num我这边是单机配置,因此配置为1就可以了。看上去没什么问题,结果由于我采用的mysql8.0,1.1.3版本的nacos采用的是5.7导致整个不兼容,无法启动。

Mysql8.0适配

url上需要添加serverTimezone=UTC,否则会出现时区不正确的问题。还有一个最大的问题,mysql8和mysql5.7采用的是不同版本的登录加密方式,因此会登录不上。这个地方就需要进行jar包修改。将nacos-server中的5.7的包替换成8.0。更坑的是不能直接通过7z的方式进行修改,需要解压缩,再压缩的方式。

  • 解压jar包

    • jar -xvf nacos-server.jar
  • 复制8.0的包到lib目录下

    • cp /tmp/mysql-connector-java-8.0.22.jar .
    • 同步删除5.7的包
  • 重新压缩nacos-server包

    • jar -cfM0 nacos-server.jar BOOT-INF/ META-INF/ org/

经过调整后的nacos-server包就可以直接登录上mysql8了。调整的过程还出现了连接错误太多,防止连接的问题。这个时候需要进入到mysql服务器,登录mysql,执行 flush hosts;即可。

Nacos镜像发布到Dockerhub

现在镜像已经可以在本地使用了,数据也已经落库到mysql中了,这个时候我们就需要把整个镜像发布dockerhub上,方便其他的服务器后续使用。

要想发布到dockerhub上,首先需要注册一个dockerhub账户。注册好了后,我们可以创建一个仓库来存储我们nacos的镜像。如果我们平常用git多的话,会发现他们的命令有很多共通的地方,也是本地commit,然后再push到远程服务器。

docker tag zooy/nacos:1.1.3 zooooooooy/nacos:1.1.3
docker push zooooooooy/nacos:1.1.3

非常简单的发布到dockerhub上了。

各位jym,即可以通过hub.docker.com/r/zoooooooo… 这个链接访问,并pull下来直接使用。

使用注意事项

  1. 没有指定java,因此需要手动指定。

  1. 指定启动模式

通过环境变量指定。剩下的就是自定义的一些配置,按照项目的需要进行修改。