【云原生】使用Docker commit的方式制作openGauss镜像

本文介绍了如何通过Dockercommit制作包含openGauss数据库修改的镜像,并解决了数据丢失的问题。方法包括:1) 通过SQL文件在新容器中执行;2) 使用数据卷实现数据持久化;3) 备份数据目录后再commit。每种方法都有其适用场景和优缺点,可以根据需求选择合适的方式。

前面一期介绍了使用Dockerfile制作openGauss镜像,这种方式是根据打包脚本全新生成一个镜像,属于无中生有。本篇介绍使用docker commit的方式制作openGauss镜像,这种方法是根据已有的镜像加上自己的定制,生成新的专属镜像,使得数据作为镜像的一部分保存下来。

操作步骤

使用docker commit的方式制作openGauss镜像,整个过程主要分为三步:
1.运行容器
2.修改容器
3.将容器保存为新的镜像

比如前期已经build的opengauss 3.0.0 镜像。先使用该镜像创建启动了新的容器,然后进行容器修改,创建表test和插入了数据。

create table test(id int,name varchar (20));
insert into test values (123,'mutouren');

现在容器/opt 创建一个空文件dockertest
在这里插入图片描述

最后利用已有的容器就可以制作一个新的镜像,预期新镜像会包含已有的表test和创建的文件dockertest。

docker container commit -m “add new file and table” -a “xxx”
dc910aeaac18 opengauss:test

参数说明:

  • -m: 提交的描述信息
  • -a: 指定镜像作者
  • dc910aeaac18:容器 ID , 注意不是镜像的ID
  • opengauss:test : 指定要创建的目标镜像名
    在这里插入图片描述

下面来看下使用新镜像是否把修改点都同步了。

在这里插入图片描述

上图可以看到 新建的文件dockertest存在,但是之前新建的表test does not exist? 为什么数据不在呢?
因为openGauss的data目录在 /var/lib/opengauss下,commit命令打包时没有包含数据变化,所以不在了。那问题应该怎么解决呢?目前想到有3个办法,要是有其他大佬知道其他更简单试用的方法请留言或者私我~

解决办法

  1. 如果确实有好多SQL需要执行,那就保存个SQL文件,启动新容器时,从宿主机拷贝到容器里执行。这样 即使更换宿主机也无所畏惧。
[root@pekphisprb70593 etc]# touch a.sql 
[root@pekphisprb70593 etc]# vi a.sql 

–把要执行的sql拷贝进去

create table test2(id int,name varchar (20)); 
insert into test2 values (123,'mutouren'); 

:wq保存
在宿主机上执行命令,将宿主机/etc/a.sql 拷贝到opengausstest容器的/opt目录下。注意这里即使容器有启动也可以正常拷贝。

docker cp /etc/a.sql opengausstest:/opt 

–进入容器执行sql文件

docker exec -it opengausstest /bin/bash 
gsql -d postgres -p 5432 -f /opt/a.sql 

–验证下

su - omm 
gsql -d postgres -p 5432

在这里插入图片描述

缺点么,操作麻烦了一丢丢,但是万一SQL执行时间较长的话就比较恼火。

2.使用前面讲的容器数据卷的方法。使用旧镜像启动容器的时候,就将容器的数据库data目录挂载到linux宿主机目录上。这样,制作出的新镜像在原来的宿主机上启动时,依旧指定原来的宿主机挂载的data 目录,也能实现宿主机上的数据持久化和容器间的数据共享。例如 下面的 -v /enmotech/opengauss:/var/lib/opengauss ,将容器的/var/lib/opengauss 挂载到宿主机的/enmotech/opengauss目录下。

docker run --name opengauss --privileged=true -d -e
GS_PASSWORD=Enmo@123 -v /enmotech/opengauss:/var/lib/opengauss -p
15432:5432 enmotech/opengauss:3.0.0

但是,这样的话如果更换宿主机或者宿主机重装系统或损坏就不能满足要求了。
3.将容器的数据目录先拷贝到其他目录,然后commit。新镜像启动时使用新的数据目录。
既然已经知道“openGauss的data目录在 /var/lib/opengauss下,commit命令打包时没有包含数据变化”导致,那我们就考虑换个数据目录存储。具体操作如下:
–先创建备份目录

mkdir /data2

–将容器的数据目录先拷贝到备份目录,注意属性不要变

 cp /var/lib/opengauss/data/* /data2/ -rfp

–保存新镜像为enmotech/opengauss:test

docker container commit -m "add new table test2" -a "xxx" 74784877f3c4  enmotech/opengauss:test

–使用新镜像启动时,指定PGDATA为新的数据存取路径

docker run --name opengauss_test --privileged=true -d -e GS_PASSWORD=Gauss@123 -e PGDATA=/data2 enmotech/opengauss:test

在这里插入图片描述

这种方法验证也是OK的。
【小结】本篇介绍了使用Docker commit的方式制作openGauss镜像以及如何解决数据丢失问题的方法。

openGauss: 一款高性能、高安全、高可靠的企业级开源关系型数据库。

🍒如果您觉得博主的文章还不错或者有帮助的话,请关注一下博主,如果三连点赞评论收藏就更好啦!谢谢各位大佬给予的支持!

### 构建云原生环境中的Docker容器系统 在构建云原生环境下的Docker容器化应用时,理解基础架构即服务(IaaS),平台即服务(PaaS)以及软件即服务(SaaS)模型对于设计高效的应用程序至关重要。然而,在此背景下,重点在于利用自动化部署工具和服务编排框架来简化应用程序生命周期管理。 #### 安装并配置Docker引擎 为了启动项目,需先确保目标操作系统支持Docker,并完成其安装过程。针对基于Debian的操作系统版本,如Debian 10, 可遵循官方指南执行安装命令[^1]: ```bash sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io ``` 这一步骤会下载并安装最新稳定版的Docker Engine及其依赖项。 #### 创建Supervisord配置文件 一旦Docker被成功安装,下一步就是建立进程控制机制以维持容器运行状态。通过编辑`/etc/supervisor/conf.d/docker.conf`, 添加如下内容实现对Docker守护进程的有效监控: ```ini [program:docker] command=/usr/bin/docker run --rm -p 80:80 my-web-app autostart=true autorestart=true stderr_logfile=/var/log/supervisor/docker.err.log stdout_logfile=/var/log/supervisor/docker.out.log ``` 上述配置使得每当宿主机重启后能够自动拉起指定镜像的服务实例,并记录日志以便后续排查问题。 #### 部署微服务架构 考虑到现代Web应用通常由多个相互协作的小型组件构成,因此推荐采用微服务体系结构模式开发业务逻辑。借助Kubernetes这样的集群管理系统可以帮助更好地管理和扩展这些独立运作却又紧密相连的工作负载单元。 - **定义服务**: 使用YAML描述各部分功能特性; - **网络通信**: 设计内部DNS解析方案促进跨节点间调用; - **持久存储卷**: 提供数据层抽象接口满足不同类型的IO需求; #### 实施CI/CD流水线 持续集成与交付(CI/CD)实践有助于加速产品迭代周期的同时减少人为错误的发生几率。GitLab CI、Jenkins等开源工具提供了丰富的插件生态系统用于定制化的管道建设工作流。 例如,编写`.gitlab-ci.yml` 文件触发每次提交后的自动化测试和打包流程: ```yaml stages: - build - test - deploy build_image: stage: build script: - echo "Building image..." - docker build -t myapp:$CI_COMMIT_REF_NAME . run_tests: stage: test script: - echo "Running tests..." - docker-compose up -d --scale app=2 deploy_to_prod: only: - master when: manual stage: deploy script: - echo "Deploying to production server..." - ssh user@prod 'docker pull myapp:master && docker stack deploy...' ``` 以上脚本展示了如何将源码变更转化为可执行制品并通过SSH远程推送至生产环境的过程。
评论 50
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Gauss松鼠会

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值