YashanDB Docker镜像制作

本文作者:YashanDB中级服务工程师鲍健昕

为什么需要Docker部署数据库

常规使用 yasboot 部署数据库的方法,操作流程复杂,需要配置许多配置文件以及环境变量,不同用户使用的环境不同,那么环境配置也会存在差异,每当更换机器或者有新系统开发时都要就要重复不熟⼀次。

使用 Docker 后,只需要⼀次配置好环境,换到别的机器上就可以一键部署好,能够大大简化操作。Docker 容器与虚拟机不同,不需要捆绑⼀整套操作系统,只需要软件工作所需的库资源和设置。系统因此而变得高效轻量并保证部署在任何环境中的软件都能始终如一地运行。

什么是数据库镜像与容器

数据库镜像(image)是一种轻量级、可执行的独立软件包,它包含运行数据库所需的所有内容,把操作系统、数据库打包好形成⼀个可交付的运行环境,这个打包好的运行环境就是image镜像文件。只有通过这个镜像文件才能生成 Docker 容器实例,类似 Java 中 new 出来一个对象。数据库镜像是分层的,以 MySQL 镜像为例,在下载镜像的过程中是一层层下载的:

Docker File是什么

Dockerfile 是⼀个用来构建镜像的文本文件,文本内容包含了⼀条条构建镜像所需的指令和说明。
• FROM:定制的镜像都是基于 FROM 的镜像,FROM centos:8.1.1911 表示后续的操作都是基于
centos:8.1.1911。
• COPY:从上宿主机中复制文件或者目录到镜像中。
• RUN:构建镜像的过程中,在基础镜像命令行中执行的命令。
• CMD:创建容器时的默认命令,与RUN的区别在于,CMD是创建容器时执行,而RUN是在构建镜像时执行,程序运行结束,容器也就结束。
• ENV:在容器内设置环境变量,设置环境变量,可以在后续的指令中使用这个环境变量。

怎么用Docker File构建YashanDB镜像

点击查看代码
FROM centos:8.1.1911

RUN rm -rf /etc/yum.repos.d/*

COPY CentOS-Base.repo /etc/yum.repos.d/

RUN yum -y install glibc-locale-source glibc-langpack-en net-tools \
    && yum clean all \
    && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && localedef -c -f UTF-8 -i en_US en_US.UTF-8 \
    && echo 'export LANG=zh_CN.utf8' > /etc/locale.conf \
    && echo 'export LANG=zh_CN.utf8' >> /etc/profile \
    && echo 'Asia/Shanghai' > /etc/timezone \
    && source /etc/profile \
    && echo "root:123456" | chpasswd \
    && groupadd -g 1000 YASDBA \
    && useradd yashan -G YASDBA \
    && echo "yashan:yasdb_123" | chpasswd \
    && echo 'yashan ALL=(ALL:ALL) NOPASSWD:ALL' >> /etc/sudoers

COPY yashandb-23.2.1.100-linux-x86_64.tar.gz /home/yashan
COPY initYashanDB.sh /home/yashan/
RUN chown yashan:yashan /home/yashan/*

USER yashan
WORKDIR /home/yashan/

ENV YASDB_HOME /home/yashan/
ENV YASDB_DATA /home/yashan/yashandb/yasdb_data/db-1-1
ENV PATH $PATH:${YASDB_HOME}/bin
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:${YASDB_HOME}/lib

RUN cd ~ \
    && tar -zxf yashandb-*.tar.gz \
    && rm -rf yashandb-* \
    && echo "YASDB_HOME=${YASDB_HOME}" >> ~/.bashrc \
    && echo "YASDB_DATA=${YASDB_DATA}" >> ~/.bashrc \
    && echo "PATH=\$PATH:\${YASDB_HOME}/bin" >> ~/.bashrc \
    && echo "LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:\${YASDB_HOME}/lib" >> ~/.bashrc


CMD ["./initYashanDB.sh"]
点击查看代码
#!/bin/bash
cd /home/yashan/bin
yasboot package se gen --cluster yashandb -L --data-path $YASDB_DATA --begin-port 1688 --node 1
yasboot package install -t hosts.toml -i /home/yashan/yashandb-23.2.1.100-linux-x86_64.tar.gz
yasboot cluster deploy -t yashandb.toml
yasboot cluster password set -n yasdb_123 -c yashandb


while pgrep -x "yasdb" >/dev/null; do  
    echo "check pgrep success, goto sleep!"
    sleep 360000    
done  

注意点:

  • 容器挂载宿主机目录的时候,是覆盖操作,如果宿主机目录是空的,会清空容器内的目录,所以将initYashanDB放在了CMD中,而不是RUN中

  • CMD运行结束,容器也就会退出,所以在./initYashanDB.sh中最后添加了循环,避免CMD中的脚本执行完

点击查看代码
docker build -t registry.cn-shenzhen.aliyuncs.com/jesseatyashan/yashandb:X . --no-cache
docker run -itd  -p 1688:1688  -u 1000:1000 registry.cn-shenzhen.aliyuncs.com/jesseatyashan/yashandb:X
docker exec -it b bash

YashanDB Docker镜像的发布

在阿里云登录后,可以在阿里云容器镜像服务ACR中创建一个个人实例,然后将数据库镜像按照下面的操作发布到阿里云上:

执行下面的命令将本地构建的镜像发布推送至远程:

点击查看代码
[root@localhost YLab]# docker push registry.cn-shenzhen.aliyuncs.com/jesseatyashan/yashandb:X
The push refers to repository [registry.cn-shenzhen.aliyuncs.com/jesseatyashan/yashandb]
c781b4b05ce5: Pushing [=>                                                 ]  15.93MB/518MB
5f70bf18a086: Layer already exists 
2e8a116c1b21: Pushing [>                                                  ]  3.869MB/198.7MB
c499bfff3090: Pushed 
6326c26c34ad: Pushing [>                                                  ]  2.754MB/198.7MB
5f69ac739040: Pushing [===>                                               ]  4.385MB/64.98MB
825123261bfe: Waiting 
3e0aca5b6ad0: Waiting 
0683de282177: Waiting 

镜像发布成功后可以在镜像仓库中找到这个镜像:

YashanDB容器启动添加初始化脚本

在Docker中,可以使用绑定挂载来实现容器内部文件与宿主机文件系统中文件的映射。以数联网一体机项目的应用场景为例,客户希望容器在数据库启动之后,能够自动执行指定文件夹中的SQL文件初始化数据库环境,这个SQL文件可能会发生变更,如果没有文件系统映射的话,那么就需要为每套SQL文件单独构建一个镜像,有了文件系统映射之后,可以将SQL文件放在宿主机的指定文件夹中,将这个文件夹与容器内的文件夹映射。

点击查看代码
#!/bin/bash

cd /home/yashan/bin
yasboot package se gen --cluster yashandb -L --data-path $YASDB_DATA --begin-port 1688 --node 1
yasboot package install -t hosts.toml -i /home/yashan/yashandb-23.2.1.100-linux-x86_64.tar.gz
yasboot cluster deploy -t yashandb.toml
yasboot cluster password set -n yasdb_123 -c yashandb


while pgrep -x "yasdb" >/dev/null; do  
    echo "check pgrep success, goto sleep!"
    sleep 360000    
done  


DIRECTORY="/home/yashan/sql"

if [ ! -d "$DIRECTORY" ]; then
  echo "Error: SQL directory '$DIRECTORY' does not exist."
  exit 1
fi

if [ -f "${DIRECTORY}/ignoresql.pid" ] ; then
  echo "Ignore executing sql files"
else
  for sql_file in $(ls -v "$DIRECTORY"/*.sql); do
    if [ -f "$sql_file" ] ; then
      echo "Processing ${sql_file}..."
      ${YASDB_HOME}/bin/yasql sys/yasdb_123 -f $sql_file
      if [ $? -ne 0 ]; then
        echo "Error executing yasql on $sql_file"
        exit 1
      fi
    fi
  done
  echo "ignore" > "${DIRECTORY}/ignoresql.pid"
  echo "All sql files processed."
fi

while pgrep -x "yasdb" >/dev/null; do  
    echo "check pgrep success, goto sleep!"
    sleep 360000    
done  
容器启动的时候需要增加-v参数,这样可以在容器中访问宿主机中的文件或目录,将docker容器内的数据保存进宿主机的磁盘中,实现数据的共享和持久化。 点击查看代码
docker run -itd  -p 1688:1688  -v /home/yashan/sql:/home/yashan/sql:rw registry.cn-shenzhen.aliyuncs.com/jesseatyashan/yashandb:X

YashanDB容器数据库数据文件的复用

数联网一体机项目的应用场景中,客户希望在容器启动时复用以往容器的yasdb_data,此时不能再用yasboot的方式部署数据库,而应该使用以往的脚本部署方式:

点击查看代码
#!/bin/bash
cd ~/scripts
bash /home/yashan/scripts/install.sh 
bash /home/yashan/scripts/initDB.sh

.....

while pgrep -x "yasdb" >/dev/null; do  
    echo "check pgrep success, goto sleep!"
    sleep 360000    
done  
点击查看代码
#!/bin/bash
#initDB.sh

if [ -f "$YASDB_DATA"/config/yasdb.ini ]; then
    yashan_exists=1
else
    yashan_exists=0
fi

FILE_PATH=$(dirname "$(readlink -f "$0")")
YASDB_TEMP_FILE="${FILE_PATH}/.temp.ini"
INSTALL_INI_FILE="${FILE_PATH}/install.ini"
YASDB_PASSWORD="yasdb_123"

# shellcheck disable=SC1090
source "${YASDB_TEMP_FILE}"
YASDB_ENV_FILE="${YASDB_HOME}/conf/yasdb.bashrc"
YASDB_HOME_BIN_PATH="${YASDB_HOME}/bin"
YASDB_BIN="${YASDB_HOME_BIN_PATH}/yasdb"
YASQL_BIN="${YASDB_HOME_BIN_PATH}/yasql"
YASPWD_BIN="${YASDB_HOME_BIN_PATH}/yaspwd"

# shellcheck disable=SC1090
source "${YASDB_ENV_FILE}"

if [ ! -d "$YASDB_HOME" ] || [ ! -d "$YASDB_DATA" ]; then
    echo -e "Software installation \"./install.sh\" is not performed."
    exit 1
fi

if [ $yashan_exists -eq 0 ]; then
e_i=$(sed -n '$=' "$INSTALL_INI_FILE")
s_i=$(sed -n -e '/\<instance\>/=' "$INSTALL_INI_FILE")
n_i=$((s_i + 1))

sed -n "${n_i},${e_i} p" "$INSTALL_INI_FILE" >>"$YASDB_DATA"/config/yasdb.ini

##创建密码文件
if [ ! -f "$YASDB_HOME/admin/yasdb.pwd" ]; then
    "$YASPWD_BIN" file="$YASDB_HOME"/admin/yasdb.pwd password="$YASDB_PASSWORD"
else
    rm -f "$YASDB_HOME"/admin/yasdb.pwd
    "$YASPWD_BIN" file="$YASDB_HOME"/admin/yasdb.pwd password="$YASDB_PASSWORD"
fi
cp "$YASDB_HOME"/admin/yasdb.pwd "$YASDB_DATA"/instance/yasdb.pwd


REDOFILE="("
for ((i = 0; i < "$REDO_FILE_NUM"; i++)); do
    if [ $i == $((REDO_FILE_NUM - 1)) ]; then
        REDOFILE=${REDOFILE}"'redo${i}'"" size $REDO_FILE_SIZE)"
    else
        REDOFILE=${REDOFILE}"'redo${i}'"" size $REDO_FILE_SIZE,"
    fi
done

fi


##创建数据库
START_LOG_FILE="$YASDB_DATA/log/start.log"
rm -rf "${START_LOG_FILE}"
"${YASDB_BIN}" nomount -D "$YASDB_DATA" >"$START_LOG_FILE" 2>&1 &
i=0
while ((i < 5))
do
    sleep 2
    # shellcheck disable=SC2002 disable=SC2126
    alive=$(cat "$START_LOG_FILE" | grep "Instance started" | wc -l)
    if [ "$alive" -ne 0 ]; then
        echo "process started!"
        break
    fi
    i=$((i+1))
done

if [ "$i" -eq "5" ];then
    echo "start process failed. read $START_LOG_FILE"
    cat "$START_LOG_FILE"
    exit 1
fi

if [ $yashan_exists -eq 0 ]; then
"${YASQL_BIN}" sys/$YASDB_PASSWORD >>"$START_LOG_FILE" <<EOF
create database yasdb CHARACTER SET $NLS_CHARACTERSET logfile $REDOFILE;
exit;
EOF
fi


if [ $yashan_exists -eq 1 ]; then
    $YASQL_BIN sys/$YASDB_PASSWORD -c "alter database open"
fi


i=0
while ((i < 60))
do
    sleep 1
    alive=$($YASQL_BIN sys/$YASDB_PASSWORD -c "select open_mode from v\$database" | grep -c READ_WRITE)
    if [ "$alive" -eq 1 ]; then
        echo "Database open succeed !"
        break
    fi
    i=$((i+1))
done

if [ "$i" -eq "60" ];then
    echo "Failed ! please check logfile $START_LOG_FILE ."
    exit 1
fi

if [ $yashan_exists -eq 0 ]; then
##创建样例数据:sales
if [ "$INSTALL_SIMPLE_SCHEMA_SALES" == 'Y' ] || [ "$INSTALL_SIMPLE_SCHEMA_SALES" == 'y' ]; then
    "${YASQL_BIN}" sys/$YASDB_PASSWORD -f "$YASDB_HOME"/admin/simple_schema/sales.sql >>"$START_LOG_FILE"
fi
fi
exit 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/885522.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

抓取网页重定向之前的接口请求

使用谷歌浏览器&#xff0c;按下F12抓取接口的时候&#xff0c;会遇到无法抓取web页面重定向之前的地址的问题&#xff0c;这个时候可以使用以下两种方式进行抓取&#xff1a; 1.断网操作&#xff0c;选择开发者调试工具下面的&#xff0c;网络离线功能进行离线操作 2.使用保留…

数字货币交易所开发与智能合约交易系统

数字货币交易所作为加密经济的重要组成部分&#xff0c;为用户提供了一个安全、便捷的平台来买卖各种数字资产。随着区块链技术的发展&#xff0c;智能合约在交易所的应用日益普及&#xff0c;使得交易过程更加高效和透明。本文将探讨数字货币交易所的开发过程以及智能合约在交…

jmeter中token测试

案例&#xff1a; 网站&#xff1a;http://shop.duoceshi.com 讲解&#xff1a;用三个接口来讲解 第一个接口code&#xff1a;GET http://manage.duoceshi.com/auth/code 第二个登录接口&#xff1a;http://manage.duoceshi.com/auth/login 第三个接口&#xff1a;http://…

Threejs中使用A*算法寻路导航

<!DOCTYPE html> <html><head><title>Threejs中使用A*算法寻路导航&#xff0c;Threejs室内室外地图导航</title><script type"text/javascript" src"libs/three.js"></script><script type"text/javas…

SpringBoot 使用自定义注解和枚举类对接口入参校验

目录 1. jar包导入2. 自定义注解3. 校验类4. 定义枚举类5. 被校验的实体类6. 全局异常拦截7. controller8. 测试 1. jar包导入 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId&g…

拯救神经健康!多系统萎缩患者必知的维生素“黄金组合”✨

亲爱的朋友们&#xff0c;今天我们来聊聊一个可能不太为人熟知但极其重要的健康话题——多系统萎缩&#xff08;MSA&#xff09;。面对这一挑战&#xff0c;科学合理的营养补充显得尤为重要。你知道吗&#xff1f;有几种维生素堪称神经系统的“黄金守护者”&#xff0c;它们能在…

【IOS】申请开发者账号(公司)

目录 申请开发者账号前提 查询/申请D-U-N-S 编号 申请开发者 官网&#xff1a;Apple Developer (简体中文) 申请开发者账号前提 如果是第一次申请建议注册一个新的apple id作为组织的开发者账号。&#xff08;确保apple id的个人信息是真实的&#xff0c;不能是网名或者是…

c++第十二章续(队列结构类模拟)

队列类 设计类&#xff0c;需要开发公有接口和私有实现 Queue类接口 公有接口&#xff1a; 默认初始化&#xff0c;和可以用显式初始化覆盖默认值 Queue类的实现 如何表示队列数据&#xff1a; 一种方法是使用new动态分配一个数组&#xff0c;它包含所需的元素数。不过&…

Python从入门到高手3.5节-程序实战之最小值算法

目录 3.5.1 算法思路 3.5.2 构造随机数 3.5.3 条件控制语句 3.5.4 完整的代码实现 3.5.5 大神薯条老师 3.5.1 算法思路 算法原理很简单&#xff0c;先任取两个数进行比较&#xff0c;以计算两个数中的最小值&#xff1a; 假设得到的最小值为min_&#xff0c;再用这两个数…

天坑!Spark+Hive+Paimon+Dolphinscheduler

背景: 数据中台项目使用Spark+Hive+Paimon做湖仓底层,调度任务使用的是基于Dolphinscheduler进行二开。在做离线脚本任务开发时,在Paimon库下执行非查询类SQL报错。 INSERT报错 DELETE报错 现状: 原始逻辑为数据中台中选择的Paimon数据源,实际上在Dolphinscheduler中是…

卷积神经网络(CNN)的计算量和参数怎么准确估计?

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 1. 卷积层&#xff08;Convolutional Layer&#xff09; a) 计算量估计&#xff1a; 卷积层的 FLOPs 2 * H_out * W_out * C_in * C_out * K_h * K_w 详细解释&#xff1a; H_out, W_out&#xff…

(JAVA)浅尝关于 “栈” 数据结构

1. 栈的概述&#xff1a; 1.1 生活中的栈 存储货物或供旅客住宿的地方&#xff0c;可引申为仓库、中转站。例如酒店&#xff0c;在古时候叫客栈&#xff0c;是供旅客休息的地方&#xff0c;旅客可以进客栈休息&#xff0c;休息完毕后就离开客栈 1.2计算机中的栈 将生活中的…

WebGIS包括哪些技术栈?怎么学习?

WebGIS&#xff0c;其实是利用Web开发技术结合地理信息系统&#xff08;GIS&#xff09;的产物&#xff0c;它是一种通过Internet实现GIS交互操作和服务的最佳途径。 WebGIS通过图形化界面直观地呈现地理信息和特定数据&#xff0c;具有可扩展性和跨平台性。 它提供交互性&am…

springboot实战学习(10)(ThreadLoacl优化获取用户详细信息接口)(重写拦截器afterCompletion()方法)

接着学习。之前的博客的进度&#xff1a;完成用户模块的注册接口的开发以及注册时的参数合法性校验、也基本完成用户模块的登录接口的主逻辑的基础上、JWT令牌"的组成与使用、完成了"登录认证"&#xff08;生成与验证JWT令牌&#xff09;以及完成获取用户详细信…

使用Qt实现实时数据动态绘制的折线图示例

基于Qt的 QChartView 和定时器来动态绘制折线图。它通过动画的方式逐步将数据点添加到图表上&#xff0c;并动态更新坐标轴的范围&#xff0c;提供了一个可以实时更新数据的折线图应用。以下是对代码的详细介绍及其功能解析&#xff1a; 代码概述 该程序使用Qt的 QChartView…

Vxe UI vue 使用 vxe-form 表单实现简历模板

Vxe UI 使用 vxe-form 表单实现简历模板 查看 github <template><div><p>边框&#xff1a;<vxe-switch v-model"border"></vxe-switch>标题背景&#xff1a;<vxe-switch v-model"titleBackground"></vxe-switch&…

鸿蒙开发(NEXT/API 12)【请求用户授权】手机侧应用开发

为保护用户隐私&#xff0c;Wear Engine的API需要用户授权才可以正常访问。建议开发者在用户首次调用Wear Engine开放能力的时候执行本章节操作。 申请用户穿戴设备权限 应用拉起华为账号登录和授权界面&#xff0c;由用户授权相应的数据访问权限。用户可以自主选择授权的数据…

计算机毕业设计 二手图书交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

如何利用ChatGPT开发一个盈利的AI写作助手网站

3-1 整体介绍写作助手及原型展示说明 在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正逐步改变我们的生活方式&#xff0c;特别是在内容创作领域。本文将详细介绍如何利用ChatGPT技术&#xff0c;开发一个能够生成高质量内容的AI写作助手网站&#xff…

黑马头条day10 热点文章定时文章

day8-9是项目实战没有新东西 暂时跳过 进度到这里 但是后边的东西一直跑不通 调度一直失败 我也不知道哪里出了问题 整tm一天了也没搞出来 心态炸了 主要是xxl调度算是新内容 但是一直跑不出来就很烦 所谓的热点也就是计算权值然后存储到redis就行了 未解决&#xff1a; we…