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.1911RUN 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/sudoersCOPY 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}/libRUN 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" >> ~/.bashrcCMD ["./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 yashandbwhile 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/bashcd /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 yashandbwhile pgrep -x "yasdb" >/dev/null; do  echo "check pgrep success, goto sleep!"sleep 360000    
done  DIRECTORY="/home/yashan/sql"if [ ! -d "$DIRECTORY" ]; thenecho "Error: SQL directory '$DIRECTORY' does not exist."exit 1
fiif [ -f "${DIRECTORY}/ignoresql.pid" ] ; thenecho "Ignore executing sql files"
elsefor sql_file in $(ls -v "$DIRECTORY"/*.sql); doif [ -f "$sql_file" ] ; thenecho "Processing ${sql_file}..."${YASDB_HOME}/bin/yasql sys/yasdb_123 -f $sql_fileif [ $? -ne 0 ]; thenecho "Error executing yasql on $sql_file"exit 1fifidoneecho "ignore" > "${DIRECTORY}/ignoresql.pid"echo "All sql files processed."
fiwhile 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.shif [ -f "$YASDB_DATA"/config/yasdb.ini ]; thenyashan_exists=1
elseyashan_exists=0
fiFILE_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" ]; thenecho -e "Software installation \"./install.sh\" is not performed."exit 1
fiif [ $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"
elserm -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.pwdREDOFILE="("
for ((i = 0; i < "$REDO_FILE_NUM"; i++)); doif [ $i == $((REDO_FILE_NUM - 1)) ]; thenREDOFILE=${REDOFILE}"'redo${i}'"" size $REDO_FILE_SIZE)"elseREDOFILE=${REDOFILE}"'redo${i}'"" size $REDO_FILE_SIZE,"fi
donefi##创建数据库
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))
dosleep 2# shellcheck disable=SC2002 disable=SC2126alive=$(cat "$START_LOG_FILE" | grep "Instance started" | wc -l)if [ "$alive" -ne 0 ]; thenecho "process started!"breakfii=$((i+1))
doneif [ "$i" -eq "5" ];thenecho "start process failed. read $START_LOG_FILE"cat "$START_LOG_FILE"exit 1
fiif [ $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
fiif [ $yashan_exists -eq 1 ]; then$YASQL_BIN sys/$YASDB_PASSWORD -c "alter database open"
fii=0
while ((i < 60))
dosleep 1alive=$($YASQL_BIN sys/$YASDB_PASSWORD -c "select open_mode from v\$database" | grep -c READ_WRITE)if [ "$alive" -eq 1 ]; thenecho "Database open succeed !"breakfii=$((i+1))
doneif [ "$i" -eq "60" ];thenecho "Failed ! please check logfile $START_LOG_FILE ."exit 1
fiif [ $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.xdnf.cn/news/1551455.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

聊一下数据脱敏

背景 随着信息社会高速发展&#xff0c;大家对隐私数据的安全越来越重视&#xff0c;现在市面上各种搜集个人信息的网站&#xff0c;app层出不穷&#xff0c;你也不知道你的信息提交上去后&#xff0c;提供服务的那边&#xff0c;是不是会妥善保管好你的个人数据&#xff0c;包…

Web和UE5像素流送、通信教程

一、web端配置 首先打开Github地址&#xff1a;https://github.com/EpicGamesExt/PixelStreamingInfrastructure 找到自己虚幻引擎对应版本的项目并下载下来&#xff0c;我这里用的是5.3。 打开项目找到PixelStreamingInfrastructure-master > Frontend > implementat…

【pytorch】pytorch入门5:最大池化层(Pooling layers )

文章目录 前言一、定义概念 缩写二、参数三、最大池化操作四、使用步骤总结参考文献 前言 使用 B站小土堆课程 一、定义概念 缩写 池化&#xff08;Pooling&#xff09;是深度学习中常用的一种操作&#xff0c;用于降低卷积神经网络&#xff08;CNN&#xff09;或循环神经网…

GWAS分析中显著位点如何注释基因:excel???

大家好&#xff0c;我是邓飞。 今天星球的小伙伴问了一个问题&#xff1a; 我现在在做GWAS分析&#xff0c;现在已经找到性状关联的SNP位点&#xff0c;下一步我如何根据position 找到基因呢&#xff1f; 关于基因注释&#xff0c;之前写过一些博客&#xff0c;可以用到的软件…

windows全局配置pip镜像源

在Windows系统中&#xff0c;可以在用户目录下创建一个名为pip的文件夹&#xff0c;然后创建一个名为pip.ini的配置文件&#xff0c;其中输入镜像源信息。 [global] index-url http://mirrors.aliyun.com/pypi/simple/ [install] trusted-hostmirrors.aliyun.com

什么是reactor以及其三种版本

写在前面 本文来看下什么是reactor以及其三种版本。 1&#xff1a;什么是reactor以及其三种版本 为了更好的理解什么是reactor&#xff0c;我们结合现实生活中的例子来看下。 翠花是个貌美如花的姑娘&#xff0c;人称赛东施&#xff0c;她的梦想是嫁给王子&#xff0c;可是天…

AI产品经理如何做好职业规划❓

AI如何做好职业规划❓ 一、认识AI产品经理的角色 AI产品经理是连接技术与市场的桥梁&#xff0c;需要具备以下核心能力: 1)技术理解力 深入理解AI技术&#xff0c;包括机器学习、深度学习、自然语言处理等。 2)市场洞察力 敏锐捕捉市场动态&#xff0c;理解用户需求和行业趋…

中概股浪潮中暴涨20%的知乎,被低估了吗?

“在未来&#xff0c;要么被AI统治&#xff0c;要么成为AI的创造者”——埃隆马斯克 9月27日以来&#xff0c;受政策以及AI应用前景的利好&#xff0c;中概股开启了一轮强力的反弹。其中&#xff0c;知乎涨超10%&#xff0c;领涨一众中概股&#xff0c;花旗、福瑞集团均给出了…

企业内训|AI助力智能办公与职场效能提升-青岛某国资平台

9月25日&#xff0c;TsingtaoAI派驻讲师进驻现场&#xff0c;为青岛市某国资平台公司员工交付“AI助力智能办公与职场效能提升”企业内训&#xff0c;整个培训通过AIGC的实际应用案例&#xff0c;帮助学员掌握智能办公的常用工具&#xff0c;提升工作流程优化和决策效率。课程涵…

拯救华为秘盒M310

这个盒子当年宣传得比较厉害&#xff0c; 当时确实也没有什么可选的&#xff0c;当年是高价入的,这个盒子有二切一的hdmi切换功能&#xff0c; 这点从今天来看&#xff0c; 都是一个亮点 华为秘盒M310是一款小巧但功能强大的网络机顶盒。它搭载了基于安卓系统的操作平台&#x…

golang 获取证书的生效及过期时间

测试样例 func TestGetCertVaildTime(t *testing.T) {certPEM, err : ioutil.ReadFile("aa.bbb.com.crt")if err ! nil {fmt.Println("读取证书文件出错:", err)return}// 解码PEM格式的证书block, _ : pem.Decode(certPEM)if block nil {fmt.Println(&q…

智源研究院推出全球首个中文大模型辩论平台FlagEval Debate

近日&#xff0c;智源研究院推出全球首个中文大模型辩论平台FlagEval Debate&#xff0c;旨在通过引入模型辩论这一竞争机制对大语言模型能力评估提供新的度量标尺。该平台是智源模型对战评测服务FlagEval大模型角斗场的延展&#xff0c;将有助于甄别大语言模型的能力差异。 F…

vector中push_back和emplace_back的区别

push_back 在引入右值引用&#xff0c;转移构造函数&#xff0c;转移复制运算符之前&#xff0c;通常使用push_back()向容器中加入一个右值元素&#xff08;临时对象&#xff09;的时候&#xff0c;首先会调用构造函数构造这个临时对象&#xff0c;然后需要调用拷贝构造函数将…

Redis入门第一步:认识Redis与快速安装配置

认识Redis与快速安装配置&#x1f343; Redis是什么&#x1f432; 1.Redis的背景&#x1f38d; Redis&#xff08;Remote Dictionary Server&#xff09;译为"远程字典服务"&#xff0c;它是一款基于内存实现的键值型 NoSQL 数据库&#xff0c; 通常也被称为数据结…

pytorch线性/非线性回归拟合

一、线性回归 1. 导入依赖库 import numpy as np import matplotlib.pyplot as plt import torch from torch import nn, optim from torch.autograd import Variable numpy&#xff1a;用来构建数据matplotlib.pyplot&#xff1a; 将构建好的数据可视化torch.nn&#xff1a…

2024还在拼多多赚钱的,无不满足这几个条件

拼多多只是我棋盘上的一小步&#xff0c;整个棋局几人看懂了&#xff1f; 如果我说我做拼多多&#xff0c;其实是另有目的&#xff0c;拼多多只是我棋局里的一小步&#xff0c;你们信吗&#xff1f;认真看文章&#xff0c;后面会为大家揭秘&#xff01; 先来客观公正的回答下…

Queued Synchronous Peripheral Interface (QSPI)

文章目录 1. 介绍2. Feature List3. 概述3.1 QSPI框图3.2 操作模式3.3 三线模式3.4 时钟极性和时钟相位 4. Master模式4.1 状态机4.2 采样点4.3 波特率4.4 通信模式4.4.1 短数据模式4.4.2 长数据模式4.4.3 短连续模式4.4.4 长连续模式4.4.5 单配置多帧模式4.4.6 XXL模式4.4.7 M…

选择国企eHR人事管理系统的时候,应该注意什么?

近年来&#xff0c;中国正步入高速发展的黄金时期&#xff0c;国有企业&#xff08;国企&#xff09;在追求效率和管理水平提升方面迈出了重要步伐。为了进一步实现数字化、流程化和科学化管理&#xff0c;越来越多的国企选择引进eHR&#xff08;电子人力资源管理&#xff09;系…

【Diffusion分割】MedSegDiff-v2:Diffusion模型进行医学图像分割

MedSegDiff-V2: Diffusion-Based Medical Image Segmentation with Transformer 摘要&#xff1a; 最近的研究揭示了 DPM 在医学图像分析领域的实用性&#xff0c;医学图像分割模型在各种任务中表现出的出色性能就证明了这一点。尽管这些模型最初是以 UNet 架构为基础的&…

opencv实战项目(三十):使用傅里叶变换进行图像边缘检测

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一&#xff0c;什么是傅立叶变换&#xff1f;二&#xff0c;图像处理中的傅立叶变换&#xff1a;三&#xff0c;傅里叶变换进行边缘检测&#xff1a; 一&#xff0c…