客户需在国产化银河麒麟系统中部署软件应用,使用mysql8.0数据库。机器放置了两三年,里面命令工具和依赖都不太全。而且客户环境不联网,只能采用离线部署的方式。部署过程中踩了很多坑,也用到很多资源,记录一下。
过程概述
最开始从mysql官网下载了arm版本的安装包,但是服务器缺少的依赖太多了。我们连续装了两个依赖之后发现这是个无底洞……遂更换为docker拉包的方式部署。
资源准备
1、docker安装包,准备docker-20.10.9.tgz文件包,适用于arm架构的相近版本都可以。可以从本文顶部链接下载,也可以自行准备。
2、mysql镜像包,从网上下载一个同样适用于arm架构的mysql8.tar包。
安装步骤
部署docker
1、解压安装包:
tar -xvf docker-20.10.9.tgz #(改成自己的版本)
2、将解压出来的docker文件内容移动到 /usr/bin/ 目录下
mv docker/* /usr/bin/
3、将docker注册为service服务
vi /etc/systemd/system/docker.service
编辑docker.service文件的内容:
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service
Wants=network-online.target
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process
# restart the docker process if it exits prematurely
Restart=on-failure
StartLimitBurst=3
StartLimitInterval=60s
[Install]
WantedBy=multi-user.target
4、启动docker
chmod +x /etc/systemd/system/docker.service #设置权限
systemctl daemon-reload
systemctl start docker #启动Docker
如果需要设置自启或查看docker状态或日志,可参考以下命令:
systemctl enable docker.service #设置开机自启
systemctl status docker #查看Docker状态
docker -v #查看Docker版本
journalctl -u docker.service #查看详细日志
上传mysql镜像
1、将mysql8.tar上传到服务器,并拉取镜像
docker load -i 路径/mysql8.tar #改成存放路径
2、修改my.cnf文件
vi /etc/my.cnf
内容按需配置
[mysqld]
datadir=数据目录/data
port=3306
innodb_buffer_pool_size=2047M
character-set-server=utf8
max_length_for_sort_data = 8388608
join_buffer_size=1048576
sort_buffer_size =3145728
read_rnd_buffer_size = 838860800
#default-storage-engine=MyISAM
default-storage-engine=Innodb
max_allowed_packet=1073741824
wait_timeout=2147483
interactive_timeout=2880000
innodb_file_per_table=1
innodb_file_format=Barracuda
innodb_strict_mode = 0
[client]
port=3306
3、配置参数并启动容器,主要修改配置文件路径映射、端口映射,主机的路径、端口在冒号前,容器的路径、端口在冒号后。
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=123456 -v /path/to/my.cnf:/etc/mysql/my.cnf -v /path/to/data:/var/lib/mysql -p 3306:3306 -d 镜像id #自行修改
4、查看mysql是否启动成功:
进入容器,使用mysql -uroot -p密码,看看是否输出连接成功信息。
5、初始化数据库,使应用可以连接数据库而非本地连接,请参考此文章后半部分初始化数据库部分:在同一台主机上运行MySQL和MariaDB
配置宿主机上应用的JDBC
jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8&allowPublicKeyRetrieval=true
这里的ip就是localhost,因为容器和宿主机是一个网,不用修改。
启动应用,连接成功。
中途遇到的问题
1、权限不够
我使用非root用户登录的,su -root登录不成功。最后使用
sudo su
输入当前用户密码后切换到了root用户。
2、运行权限不够
./startup.sh(程序)
运行应用程序过程中总是报permission denied,最后使用
sudo bash startup(程序名)
成功运行。
3、使用rpm提示功能不存在
银河麒麟系统和ubuntu比较接近,可使用
dpkg -l | grep mysql
查询系统中是否之前安装过mysql