笔者之前用的windows 系统,新买的M1前几天刚到货,在用docker desktop 运行 nacos 容器的时候碰到了一些问题,故此做下记录,也希望我的经历能够帮到更多人。
首先docker hub官网上的nacos镜像是不支持arm架构的,需要自行打包nacos镜像才能运行。
自行打包
首先下载nacos提供的打包工程
https://github.com/nacos-group/nacos-docker.git
这个工程是nacos 提供的一种快捷打包nacos docker 镜像的工程,提供了docker-compose编排例子,docker镜像制作源码。这里我们就需要根据镜像制作源码制作我们的docker 镜像。
修改dockerfile
进入到build文件夹,打开Dockerfile 文件
FROM centos:7.5.1804
MAINTAINER pader "huangmnlove@163.com"
# set environment
ENV MODE="cluster" \
PREFER_HOST_MODE="ip"\
BASE_DIR="/home/nacos" \
CLASSPATH=".:/home/nacos/conf:$CLASSPATH" \
CLUSTER_CONF="/home/nacos/conf/cluster.conf" \
FUNCTION_MODE="all" \
JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk" \
NACOS_USER="nacos" \
JAVA="/usr/lib/jvm/java-1.8.0-openjdk/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=2.0.3
ARG HOT_FIX_FLAG=""
WORKDIR $BASE_DIR
RUN set -x \
&& yum update -y \
&& yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget iputils nc vim libcurl
RUN wget https://github.com/alibaba/nacos/releases/download/${NACOS_VERSION}${HOT_FIX_FLAG}/nacos-server-${NACOS_VERSION}.tar.gz -P /home
RUN tar -xzvf /home/nacos-server-${NACOS_VERSION}.tar.gz -C /home \
&& rm -rf /home/nacos-server-${NACOS_VERSION}.tar.gz /home/nacos/bin/* /home/nacos/conf/*.properties /home/nacos/conf/*.example /home/nacos/conf/nacos-mysql.sql
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
# set startup log dir
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
EXPOSE 8848
ENTRYPOINT ["bin/docker-startup.sh"]
这里就是nacos 镜像打包的源码了,我们需要改动一部分进行Mac M1 的适配
- 修改镜像系统
官方使用到的centos:7.5.1804 系统是不支持 arm 架构的,所以这里我们需要使用支持arm架构的centos 8系统,修改文件第一行FROM centos:7.5.1804
为FROM centos:8.3.2011
还有一个地方需要改动的就是
RUN set -x \
&& yum update -y \
&& yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget iputi ls nc vim libcurl
直接打包docker 镜像会报错,有依赖冲突,所以我们在这里加上一句--allowerasing
,修改后的内容图下
RUN set -x \
&& yum update -y \
&& yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget iputi ls nc vim libcurl --allowerasing
完整版的改动内容如下:
FROM centos:8.3.2011
MAINTAINER pader "huangmnlove@163.com"
# set environment
ENV MODE="cluster" \
PREFER_HOST_MODE="ip"\
BASE_DIR="/home/nacos" \
CLASSPATH=".:/home/nacos/conf:$CLASSPATH" \
CLUSTER_CONF="/home/nacos/conf/cluster.conf" \
FUNCTION_MODE="all" \
JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk" \
NACOS_USER="nacos" \
JAVA="/usr/lib/jvm/java-1.8.0-openjdk/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=2.0.3
ARG HOT_FIX_FLAG=""
WORKDIR $BASE_DIR
RUN set -x \
&& yum update -y \
&& yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget iputils nc vim libcurl --allowerasing
RUN wget https://github.com/alibaba/nacos/releases/download/${NACOS_VERSION}${HOT_FIX_FLAG}/nacos-server-${NACOS_VERSION}.tar.gz -P /home
RUN tar -xzvf /home/nacos-server-${NACOS_VERSION}.tar.gz -C /home \
&& rm -rf /home/nacos-server-${NACOS_VERSION}.tar.gz /home/nacos/bin/* /home/nacos/conf/*.properties /home/nacos/conf/*.example /home/nacos/conf/nacos-mysql.sql
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
# set startup log dir
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
EXPOSE 8848
ENTRYPOINT ["bin/docker-startup.sh"]
改动完成后我们就可以使用 docker build 命令进行打包了,运行命令(不要忘记那个 . )
docker build -t nacos:2.0.3 .
等待打包完成后输入docker images
你就可以看到打包好的docker images 了,接下来我们来介绍以编排的方式运行nacos镜像,并一同启动mysql8镜像。
进入example文件夹,修改配置文件standalone-mysql-8.yaml
修改nacos 镜像
version: "2"
services:
nacos:
image: nacos/nacos-server:${NACOS_VERSION}
原版中使用 nacos/nasoc-server:2.0.3 在这里我们修改为 我们刚才打包好的镜像
version: "2"
services:
nacos:
image: nacos:2.0.3
修改mysql 镜像
原版使用的镜像为 nacos/nacos-mysql:8.0.16这里我们修改镜像源为mysql:8.0.28-oracle,并为其制定我们的平台版本为linux/arm64/v8
mysql:
container_name: mysql
image: mysql:8.0.28-oracle
platform: linux/arm64/v8
返回上层,修改env
文件夹中nacos-standlone-mysql.env
文件,在MYSQL_SERVICE_DB_PARAM
这一项属性的最后添加&allowPublicKeyRetrieval=true
, 加这一步是因为如果用户使用了 sha256_password 认证,密码在传输过程中必须使用 TLS 协议保护,但是如果 RSA 公钥不可用,可以使用服务器提供的公钥;可以在连接中通过 ServerRSAPublicKeyFile 指定服务器的 RSA 公钥,或者AllowPublicKeyRetrieval=True参数以允许客户端从服务器获取公钥;但是需要注意的是 AllowPublicKeyRetrieval=True可能会导致恶意的代理通过中间人攻击(MITM)获取到明文密码,所以默认是关闭的,必须显式开启。
ps: 需要注意的是standalone-mysql-8.yaml
文件中使用mysql目录挂在路径为 /mysql文件夹,MacOS10.15以上系统是不能在跟目录创建文件夹的,这里可以修改mysql挂在目录,可以平常在开发过程中,应用也会有在跟目录创建文件夹并使用的需求,笔者尝试了关闭SIP的方法,还是不好用,最后使用创建软连接的方法成功创建出目录。
返回上层目录
在目录中执行命令
docker-compose -f example/standalone-mysql-8.yaml up
如果数据库没有初始化,使用脚本初始化一下,nacos数据库初始化脚本 运行后控制台会输出nacos启动日志,浏览器访问 http://localhost:8848/nacos如果可以弹出登陆页面则这个名容器启动成功。nacos默认登陆账号密码均为 nacos
至此在Mac M1 电脑上运行nacos 成功。
在构建docker 镜像的时候可能会报这个错误:
原因
在2022年1月31日,CentOS团队终于从官方镜像中移除CentOS 8的所有包。
CentOS 8已于2021年12月31日寿终正非,但软件包仍在官方镜像上保留了一段时间。现在他们被转移到https://vault.centos.org
可以在 yum update 命令前加上这两行:
RUN sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
RUN sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*
修改后的Dockerfile文件如下:
FROM centos:8.3.2011
MAINTAINER pader "huangmnlove@163.com"
# set environment
ENV MODE="cluster" \
PREFER_HOST_MODE="ip"\
BASE_DIR="/home/nacos" \
CLASSPATH=".:/home/nacos/conf:$CLASSPATH" \
CLUSTER_CONF="/home/nacos/conf/cluster.conf" \
FUNCTION_MODE="all" \
JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk" \
NACOS_USER="nacos" \
JAVA="/usr/lib/jvm/java-1.8.0-openjdk/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=2.0.3
ARG HOT_FIX_FLAG=""
WORKDIR $BASE_DIR
RUN sed -i -e "s|mirrorlist=|#mirrorlist=|g" /etc/yum.repos.d/CentOS-*
RUN sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*
RUN set -x \
&& yum update -y \
&& yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel wget iputils nc vim libcurl --allowerasing
RUN wget https://github.com/alibaba/nacos/releases/download/${NACOS_VERSION}${HOT_FIX_FLAG}/nacos-server-${NACOS_VERSION}.tar.gz -P /home
RUN tar -xzvf /home/nacos-server-${NACOS_VERSION}.tar.gz -C /home \
&& rm -rf /home/nacos-server-${NACOS_VERSION}.tar.gz /home/nacos/bin/* /home/nacos/conf/*.properties /home/nacos/conf/*.example /home/nacos/conf/nacos-mysql.sql
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
# set startup log dir
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
EXPOSE 8848
ENTRYPOINT ["bin/docker-startup.sh"]