Mycat1.6.7.4容器化部署文档

1.Mycat介绍

2013年阿里的Cobar在社区使用过程中发现存在一些比较严重的问题,及其使用限制,经过Mycat发起人第一次改良,第一代改良版——Mycat诞生。 Mycat开源以后,一些Cobar的用户参与了Mycat的开发,最终Mycat发展成为一个由众多软件公司的实力派架构师和资深开发人员维护的社区型开源软件。

2014年Mycat首次在上海的《中华架构师》大会上对外宣讲,更多的人参与进来,随后越来越多的项目采用了Mycat。

2015年5月,由核心参与者们一起编写的第一本官方权威指南《Mycat权威指南》电子版发布,累计超过500本,成为开源项目中的首创。

2015年10月为止,Mycat项目总共有16个Committer。

截至2015年11月,超过300个项目采用Mycat,涵盖银行、电信、电子商务、物流、移动应用、O2O的众多领域和公司。

截至2015年12月,超过4000名用户加群或研究讨论或测试或使用Mycat。

Mycat是基于开源cobar演变而来,我们对cobar的代码进行了彻底的重构,使用NIO重构了网络模块,并且优化了Buffer内核,增强了聚合,Join等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。1.4 版本以后 完全的脱离基本cobar内核,结合Mycat集群管理、自动扩容、智能优化,成为高性能的中间件。我们致力于开发高性能数据库中间而努力。永不收费,永不闭源,持续推动开源社区的发展。

Mycat吸引和聚集了一大批业内大数据和云计算方面的资深工程师,Mycat的发展壮大基于开源社区志愿者的持续努力,感谢社区志愿者的努力让Mycat更加强大,同时我们也欢迎社区更多的志愿者,特别是公司能够参与进来,参与Mycat的开发,一起推动社区的发展,为社区提供更好的开源中间件。

Mycat还不够强大,Mycat还有很多不足,欢迎社区志愿者的持续优化改进。

2.本文工作

基于先前搭建完成的mysql有状态容器集群安装mycat中间件。

3.安装工作

3.1 安装环境介绍

软件名称

版本号

alpine

3.10

Docker

18.06

CentOS

7.8

Mycat

1.6.7.4

Java

1.8.261

3.2 下载链接

1.6.7.4版本

Java与alpine官网均有下载,此处不再提供

安装过程将mycat解压至/usr/local/目录下

3.3 文件列表及相关配置

3.3.1 文件列表
mycat
├── bin #mycat启动停止目录
│   ├── init_zk_data.sh
│   ├── mycat
│   ├── rehash.sh
│   ├── startup_nowrap.sh
│   ├── wrapper-linux-ppc-64
│   ├── wrapper-linux-x86-32
│   ├── wrapper-linux-x86-64
│   └── xml_to_yaml.sh
├── catlet #扩展功能目录
├── conf  #配置目录
│   ├── autopartition-long.txt
│   ├── cacheservice.properties
│   ├── dnindex.properties
│   ├── ehcache.xml
│   ├── index_to_charset.properties
│   ├── log4j.xml #日志存放在logs/log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要可以调整输出级别为debug                           debug级别下,会输出更多的信息,方便排查问题。
│   ├── myid.properties
│   ├── partition-hash-int.txt
│   ├── partition-range-mod.txt
│   ├── router.xml
│   ├── rule.xml  #分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改需要重启MyCAT
│   ├── schema.xml ##需配置# 逻辑库定义和表以及分片定义的配置文件
│   ├── sequence_conf.properties
│   ├── sequence_db_conf.properties
│   ├── sequence_time_conf.properties
│   ├── server.xml ## 需配置 #Mycat服务器参数调整和用户授权的配置文件
│   ├── wrapper.conf
│   └── zk-create.yaml
├── lib #mycat引入的jar目录
│   ├── curator-client-2.9.0.jar
│   ├── curator-framework-2.9.0.jar
│   ├── dom4j-1.6.1.jar
│   ├── druid-1.0.14.jar
│   ├── ehcache-core-2.6.11.jar
│   ├── fastjson-1.2.7.jar
│   ├── guava-18.0.jar
│   ├── jline-0.9.94.jar
│   ├── json-20151123.jar
│   ├── leveldb-0.7.jar
│   ├── leveldb-api-0.7.jar
│   ├── libwrapper-linux-ppc-64.so
│   ├── libwrapper-linux-x86-32.so
│   ├── libwrapper-linux-x86-64.so
│   ├── log4j-1.2.17.jar
│   ├── mapdb-1.0.7.jar
│   ├── mongo-java-driver-2.11.4.jar
│   ├── Mycat-server-1.5.1-RELEASE.jar
│   ├── netty-3.7.0.Final.jar
│   ├── sequoiadb-java-driver-1.0-SNAPSHOT.jar
│   ├── slf4j-api-1.7.12.jar
│   ├── slf4j-log4j12-1.7.12.jar
│   ├── snakeyaml-1.16.jar
│   ├── univocity-parsers-1.5.4.jar
│   ├── wrapper.jar
│   ├── xml-apis-1.0.b2.jar
│   └── zookeeper-3.4.6.jar
├── logs #日志文件目录 MyCAT日志的存放目录。日志存放在logs/log中,每天一个文件
│   ├── mycat.log
│   ├── mycat.log.1
│   ├── mycat.log.10
│   ├── mycat.log.2
│   ├── mycat.log.3
│   ├── mycat.log.4
│   ├── mycat.log.5
│   ├── mycat.log.6
│   ├── mycat.log.7
│   ├── mycat.log.8
│   ├── mycat.log.9
│   └── wrapper.log
└── version.txt #mycat版本信息

5 directories, 66 files
3.3.2 文件配置
原schamal.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

	<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
		<!-- auto sharding by id (long) -->
		<!--splitTableNames 启用<table name 属性使用逗号分割配置多个表,即多个表使用这个配置-->
		<table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/>
		<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
			/> -->
	</schema>
	<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
		/> -->
	<dataNode name="dn1" dataHost="localhost1" database="db1" />
	<dataNode name="dn2" dataHost="localhost1" database="db2" />
	<dataNode name="dn3" dataHost="localhost1" database="db3" />
	<!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
	 <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
	<dataNode	name="jdbc_dn2" dataHost="jdbchost" database="db2" />
	<dataNode name="jdbc_dn3" 	dataHost="jdbchost" database="db3" /> -->
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="hostM1" url="localhost:3306" user="root"
				   password="123456">
		</writeHost>
		<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
	</dataHost>
	<!--
		<dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc">
		<heartbeat> 		</heartbeat>
		 <writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng" 	password="jifeng"></writeHost>
		 </dataHost>

	  <dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0" 	dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
		<connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
		<writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base" 	password="123456" > </writeHost> </dataHost>

		<dataHost name="jdbchost" maxCon="1000" 	minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc">
		<heartbeat>select 	user()</heartbeat>
		<writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>

		<dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc">
		<heartbeat> </heartbeat>
		 <writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng" 	password="jifeng"></writeHost> </dataHost> -->

	<!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql"
		dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"
		url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost>
		</dataHost> -->
</mycat:schema>
  • 由于是层层相关联,所以从最里层说起比较合适
  • ------------------------------------------------------------------------------------------------------------------------------------
  • readHost 标签:指定读实例
  • readHost 标签 -> host 属性:标识不同的实例
  • readHost 标签 -> url 属性:指定连接实例的 url 地址
  • readHost 标签 -> user 属性:指定连接实例的用户名
  • readHost 标签 -> password 属性:指定连接实例的密码
  • ------------------------------------------------------------------------------------------------------------------------------------
  • writeHost 标签:指定写实例
  • writeHost 标签 -> host 属性:标识不同的实例
  • writeHost 标签 -> url 属性:指定连接实例的 url 地址
  • writeHost 标签 -> user 属性:指定连接实例的用户名
  • writeHost 标签 -> password 属性:指定连接实例的密码
  • ------------------------------------------------------------------------------------------------------------------------------------
  • heartbeat 标签:心跳检查,select user() 通常用于 MySQL 数据库的心跳检查
  • ------------------------------------------------------------------------------------------------------------------------------------
  • dataHost 标签:定义数据库的实例,配置读写分离等
  • dataHost 标签 -> name 属性:唯一标识,供上层调用
  • dataHost 标签 -> maxCon 属性:连接池最大连接数量
  • dataHost 标签 -> minCon 属性:初始化连接池连接数量
  • dataHost 标签 -> balance 属性:负载均衡,配置 1 指所有读操作会随机发送到 readHost 实例上
  • dataHost 标签 -> writeType 属性:负载均衡,配置 0 指所有写操作会发送到可用的 writeHost 实例上
  • dataHost 标签 -> dbType 属性:指定物理数据库类型
  • dataHost 标签 -> dbDriver 属性:指定物理数据库使用的 Driver
  • dataHost 标签 -> slaveThreshold 属性:延迟时间,确保读到的数据是相对较新
  • ------------------------------------------------------------------------------------------------------------------------------------
  • dataNode 标签:数据节点,也是通常所说的数据分片
  • dataNode 标签 -> name 属性:数据节点名称,具有唯一性,供上层调用
  • dataNode 标签 -> dataHost 属性:指定该数据节点的数据库实例(dataHost 标签 -> name 属性)
  • dataNode 标签 -> database 属性:物理数据库名称
  • ------------------------------------------------------------------------------------------------------------------------------------
  • schema 标签:配置逻辑数据库
  • schema 标签 -> name 属性:与上面配置的 server.xml 中配置的逻辑数据库名称一致
  • schema 标签 -> checkSQLschema 属性:是否去掉 SQL 中 db.table 的 db. 前缀,这里设置默认 false
  • schema 标签 -> sqlMaxLimit 属性:如果 select 没有 limit,会默认添加 limit 关键字,避免查询全表
  • schema 标签 -> dataNode 属性:指定该逻辑数据库的数据节点(dataNode 标签 -> name 属性)
测试用schemal.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/" >

	<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
	</schema>
	<dataNode name="dn1" dataHost="node1" database="db1" />
	<dataHost name="node1" maxCon="1000" minCon="10" balance="1"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="master" url="10.42.180.41:3306" user="root"
				   password="123456">
				    <readHost host="mysql-slave1" url="10.42.180.41:3307" user="root" password="123456"></readHost>
		</writeHost>
	</dataHost>
</mycat:schema>
原server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
	- you may not use this file except in compliance with the License. - You 
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
	- - Unless required by applicable law or agreed to in writing, software - 
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
	License for the specific language governing permissions and - limitations 
	under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
	<system>
	<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
	<property name="ignoreUnknownCommand">0</property><!-- 0遇上没有实现的报文(Unknown command:),就会报错、1为忽略该报文,返回ok报文。
	在某些mysql客户端存在客户端已经登录的时候还会继续发送登录报文,mycat会报错,该设置可以绕过这个错误-->
	<property name="useHandshakeV10">1</property>
    <property name="removeGraveAccent">1</property>
	<property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->
		<property name="sqlExecuteTimeout">300</property>  <!-- SQL 执行超时 单位:秒-->
		<property name="sequnceHandlerType">1</property>
		<!--<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
		INSERT INTO `travelrecord` (`id`,user_id) VALUES ('next value for MYCATSEQ_GLOBAL',"xxx");
		-->
		<!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况-->
		<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
	<property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
	<property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property>
      <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
        <!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
	<!-- <property name="processorBufferChunk">40960</property> -->
	<!-- 
	<property name="processors">1</property> 
	<property name="processorExecutor">32</property> 
	 -->
        <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
		<property name="processorBufferPoolType">0</property>
		<!--默认是65535 64K 用于sql解析时最大文本长度 -->
		<!--<property name="maxStringLiteralLength">65535</property>-->
		<!--<property name="sequnceHandlerType">0</property>-->
		<!--<property name="backSocketNoDelay">1</property>-->
		<!--<property name="frontSocketNoDelay">1</property>-->
		<!--<property name="processorExecutor">16</property>-->
		<!--
			<property name="serverPort">8066</property> <property name="managerPort">9066</property> 
			<property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
			<property name="dataNodeIdleCheckPeriod">300000</property> 5 * 60 * 1000L; //连接空闲检查
			<property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
		<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
		<property name="handleDistributedTransactions">0</property>
		
			<!--
			off heap for merge/order/group/limit      1开启   0关闭
		-->
		<property name="useOffHeapForMerge">0</property>

		<!--
			单位为m
		-->
        <property name="memoryPageSize">64k</property>

		<!--
			单位为k
		-->
		<property name="spillsFileBufferSize">1k</property>

		<property name="useStreamOutput">0</property>

		<!--
			单位为m
		-->
		<property name="systemReserveMemorySize">384m</property>


		<!--是否采用zookeeper协调切换  -->
		<property name="useZKSwitch">false</property>

		<!-- XA Recovery Log日志路径 -->
		<!--<property name="XARecoveryLogBaseDir">./</property>-->

		<!-- XA Recovery Log日志名称 -->
		<!--<property name="XARecoveryLogBaseName">tmlog</property>-->
		<!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接-->
		<property name="strictTxIsolation">false</property>
		
		<property name="useZKSwitch">true</property>
		<!--如果为0的话,涉及多个DataNode的catlet任务不会跨线程执行-->
		<property name="parallExecute">0</property>
	</system>
	
	<!-- 全局SQL防火墙设置 -->
	<!--白名单可以使用通配符%或着*-->
	<!--例如<host host="127.0.0.*" user="root"/>-->
	<!--例如<host host="127.0.*" user="root"/>-->
	<!--例如<host host="127.*" user="root"/>-->
	<!--例如<host host="1*7.*" user="root"/>-->
	<!--这些配置情况下对于127.0.0.1都能以root账户登录-->
	<!--
	<firewall>
	   <whitehost>
	      <host host="1*7.0.0.*" user="root"/>
	   </whitehost>
       <blacklist check="false">
       </blacklist>
	</firewall>
	-->

	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</property>
		<property name="defaultSchema">TESTDB</property>
		<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
		
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>

	<user name="user">
		<property name="password">user</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">true</property>
		<property name="defaultSchema">TESTDB</property>
	</user>

</mycat:server>

主要的关注点如下:

  • user 标签:配置用户及权限
  • user 标签 -> name 属性:登录连接 MyCAT 的用户名
  • user 标签 -> property 子标签 -> name=“password”:登录连接 MyCAT 的密码
  • user 标签-> property 子标签 -> name=“schemas”:MyCAT 的逻辑数据库名称
  • user 标签 -> privileges 子标签:配置用户针对表的增删改查权限,默认为所有表的读写权限都有
测试环境server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
	- you may not use this file except in compliance with the License. - You 
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
	- - Unless required by applicable law or agreed to in writing, software - 
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
	License for the specific language governing permissions and - limitations 
	under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/" >
	<system>
	<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
	<property name="ignoreUnknownCommand">0</property><!-- 0遇上没有实现的报文(Unknown command:),就会报错、1为忽略该报文,返回ok报文。
	在某些mysql客户端存在客户端已经登录的时候还会继续发送登录报文,mycat会报错,该设置可以绕过这个错误-->
	<property name="useHandshakeV10">1</property>
    <property name="removeGraveAccent">1</property>
	<property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->
		<property name="sqlExecuteTimeout">300</property>  <!-- SQL 执行超时 单位:秒-->
		<property name="sequnceHandlerType">1</property>
		<!--<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
		INSERT INTO `travelrecord` (`id`,user_id) VALUES ('next value for MYCATSEQ_GLOBAL',"xxx");
		-->
		<!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况-->
		<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
	<property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
	<property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</property>
		<property name="processorBufferPoolType">0</property>
		<property name="handleDistributedTransactions">0</property>
		<property name="useOffHeapForMerge">0</property>
        <property name="memoryPageSize">64k</property>
		<property name="spillsFileBufferSize">1k</property>
		<property name="useStreamOutput">0</property>
		<property name="systemReserveMemorySize">384m</property>
		<property name="useZKSwitch">false</property>
		<property name="strictTxIsolation">false</property>
		
		<property name="useZKSwitch">true</property>
		<property name="parallExecute">0</property>
	</system>
	<user name="root">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</property>
	</user>
</mycat:server>

3.4启动mycat

  1. 输入命令 cd /usr/local/mycat/mycat/bin/ -> 进入 MyCAT 启动目录
  2. 输入命令 ./mycat start -> 启动 MyCAT
  3. 输入命令 ./mycat console -> 查看 MyCAT控制台
  4. 输入命令 ./mycat stop -> 停止 MyCAT
  5. 输入命令 ./mycat restart -> 重启 MyCAT
  6. 输入命令 ./mycat status -> 查看 MyCAT 状态

4.mycat容器化

4.1 alpine安装glibc和java8

#1.指定基础镜像,并且必须是第一条指令
FROM alpine:3.10
 
#2.指明该镜像的作者和其电子邮件
#MAINTAINER XXXXX
 
#3.在构建镜像时,指定镜像的工作目录,之后的命令都是基于此工作目录,如果不存在,则会创建目录
WORKDIR /usr/local/jdk
#4.将一些安装包复制到镜像中,语法:ADD/COPY <src>... <dest>
## ADD与COPY的区别:ADD复制并解压,COPY仅复制
ADD jdk-8u261-linux-x64.tar.gz /usr/local/jdk
## glibc安装包如果从网络下载速度实在是太慢了,先提前下载复制到镜像中
COPY glibc-2.29-r0.apk /usr/local/jdk
COPY glibc-bin-2.29-r0.apk /usr/local/jdk
COPY glibc-i18n-2.29-r0.apk /usr/local/jdk
#****************************
## 此处的三个apk在下面的链接就可以下载到
# https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-2.29-r0.apk
#https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-bin-2.29-r0.apk
#https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-i18n-2.29-r0.apk
#****************************
#5.更新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
 
#6.运行指定的命令
## Alpine linux为了精简本身并没有安装太多的常用软件,apk类似于ubuntu的apt-get,
## 用来安装一些常用软V件,其语法如下:apk add bash wget curl git make vim docker
## 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.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk \
    && rm -rf /var/cache/apk/* glibc-2.29-r0.apk glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk
 
#7.配置环境变量
ENV JAVA_HOME=/usr/local/jdk/jdk1.8.0_261
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH
 
#容器启动时需要执行的命令
#CMD ["java","-version"]

完成后执行docker build -t name:label . 即可(注意最后的点),这一套能跑通,但是最终的mycat容器镜像因出现一系列问题导致未使用此镜像。

4.2制作mycat镜像

FROM java:8-jre

LABEL Description="MyCat MySQL server"
ENV mycat-version Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
USER root
COPY ./Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz  /
RUN tar -zxf /Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
RUN rm -rf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz
ENV MYCAT_HOME=/mycat
ENV PATH=$PATH:$MYCAT_HOME/bin
WORKDIR $MYCAT_HOME/bin
RUN chmod u+x ./mycat
EXPOSE 8066 9066
CMD ["./mycat","console"]

5.mycat使用测试

测试mycat与测试mysql完全一致,mysql怎么连接,mycat就怎么连接。

推荐先采用命令行测试:

mysql -uroot -proot -P8066 -h127.0.0.1