自制GreatSQL Docker镜像

柔情只为你懂 2022-08-30 04:16 157阅读 0赞

本文首发于 GreatSQL社区 微信公众号。

原创内容未经授权不得随意使用,转载请联系小编并注明来源。

0、提纲

  • 0、提纲
  • 1、准备工作
  • 2、开始制作docker镜像
    • 2.1 准备安装包及配套
    • 2.2 编辑Dockerfile
    • 2.3 制作镜像
    • 2.4 保存镜像到本地
    • 2.5 发布docker镜像

近期打算制作一个GreatSQL的docker镜像,方便社区用户使用GreatSQL。

制作docker镜像的环境基于CentOS 7.9:

  1. [root@greatsql]# cat /etc/redhat-release
  2. CentOS Linux release 7.9.2009 (Core)
  3. [root@greatsql]# uname -a
  4. Linux GreatSQL 3.10.0-1160.11.1.el7.x86_64 #1 SMP Fri Dec 18 16:34:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

1、准备工作

要制作docker镜像,需要先安装docker,并启动服务。

  1. [root@greatsql]# yum install -y docker
  2. [root@greatsql]# systemctl start docker

准备好一个CentOS基础镜像,选用CentOS 7这个基础镜像。

  1. [root@greatsql]# docker pull centos:7
  2. [root@greatsql]# docker images
  3. REPOSITORY TAG IMAGE ID CREATED SIZE
  4. docker.io/centos 7 8652b9f0cb4c 7 months ago 204 MB

这个镜像的仓库是 docker.io/centos,标签是 7(表示是CentOS 7版本),标签ID是 8652b9f0cb4c,最后更新时间是7个月前,镜像大小是204MB。

这里如果选择CentOS 8的镜像也是可以的,不过一些系统命令略有区别,具体选哪个纯粹看个人喜好。

2、开始制作docker镜像

先创建工作目录 /data/docker-greatsql

  1. [root@greatsql]# mkdir -p /data/docker-greatsql && cd /data/docker-greatsql

2.1 准备安装包及配套

运行GreatSQL需要用到jemalloc,默认的yun源里通常没有,所以先自行下载到本地:

  1. [root@greatsql]# wget https://mirrors.cloud.tencent.com/percona/tools/yum/release/7Server/RPMS/x86_64/jemalloc-3.6.0-3.el7.x86_64.rpm

准备好 GreatSQL 二进制包,放在 /data/docker-greatsql 目录下,并提前把 greatsql.service, my.cnf, sysconfig/mysql 等文件也放入:

  1. [root@greatsql]# ls GreatSQL-8.0.23-14-Linux-glibc2.17-x86_64
  2. bin cmake docs include lib LICENSE LICENSE-test man README README-test run share support-files var
  3. [root@greatsql]# ls -aR GreatSQL-8.0.23-14-Linux-glibc2.17-x86_64/support-files/
  4. GreatSQL-8.0.23-14-Linux-glibc2.17-x86_64/support-files/:
  5. . .. greatsql.service my.cnf mysqld_multi.server mysql-log-rotate mysql.server sysconfig
  6. GreatSQL-8.0.23-14-Linux-glibc2.17-x86_64/support-files/sysconfig:
  7. . .. mysql

提醒:docker镜像中使用GreatSQL二进制文件已经执行过 strip 操作,删除二进制程序文件中的符号信息和调试信息,其优势是文件特别小,缺点是后期无法用于gdb跟踪调试。

接下来编辑Dockfile文档。

2.2 编辑Dockerfile

Dockerfile文档内容如下:

  1. FROM centos:7
  2. MAINTAINER greatsql@greatdb.com
  3. RUN localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
  4. ENV LANG en_US.utf8
  5. ENV MYSQL_DATA_DIR=/data/GreatSQL
  6. ENV MYSQL_USER=mysql
  7. ENV MYSQL_UID_GID=3306
  8. ENV MYSQL_EXTRACT_DIR=/usr/local
  9. ENV TMP_DIR=/tmp
  10. ENV MYSQL_PORT=3306
  11. ENV GREATSQL="GreatSQL-8.0.25-15-Linux-glibc2.17-x86_64"
  12. ENV MYSQL_BASEDIR=${MYSQL_EXTRACT_DIR}/${GREATSQL}
  13. ENV JEMALLOC_RPM="jemalloc-3.6.0-1.el7.x86_64.rpm"
  14. ENV DEP_LIBS="numactl-libs libaio readline-devel ncurses-devel"
  15. ENV GREATSQL_INIT="greatsql-init.sh"
  16. #Creating user mysql
  17. RUN groupadd -g ${MYSQL_UID_GID} ${MYSQL_USER}; \
  18. useradd -u ${MYSQL_UID_GID} -r -g ${MYSQL_UID_GID} -s /sbin/nologin \
  19. -c "MySQL User" ${MYSQL_USER}
  20. #Copying files
  21. COPY ${GREATSQL} ${MYSQL_EXTRACT_DIR}/${GREATSQL}
  22. COPY ${JEMALLOC_RPM} ${TMP_DIR}
  23. #Installing jemalloc & depend libs
  24. RUN yum install -y ${TMP_DIR}/${JEMALLOC_RPM} ; yum install -y ${DEP_LIBS}
  25. RUN cd ${MYSQL_BASEDIR}/support-files && \
  26. cp -f my.cnf /etc/my.cnf ; \
  27. echo "LD_PRELOAD=/usr/lib64/libjemalloc.so.1" >> /etc/sysconfig/mysql ; \
  28. echo "THP_SETTING=never" >> /etc/sysconfig/mysql ; \
  29. echo "export PATH=\$PATH:${MYSQL_BASEDIR}/bin" >> /etc/profile.d/mysql.sh ; \
  30. source /etc/profile.d/mysql.sh
  31. RUN PATH="\$PATH:${MYSQL_BASEDIR}/bin"
  32. RUN export PATH
  33. #Creating datadir
  34. RUN mkdir -p ${MYSQL_DATA_DIR} && chown -R ${MYSQL_USER}:${MYSQL_USER} ${MYSQL_BASEDIR} ; \
  35. chmod -R ug+rwX ${MYSQL_BASEDIR} ; \
  36. chmod -R ug+rwX /etc/my.cnf
  37. RUN rm -f ${TMP_DIR}/${JEMALLOC_RPM}
  38. COPY ${GREATSQL_INIT} /docker-entrypoint.sh
  39. ENTRYPOINT ["/docker-entrypoint.sh"]
  40. EXPOSE ${MYSQL_PORT} ${MYSQL_PORT}0 ${MYSQL_PORT}1
  41. CMD ["mysqld"]

内容还是比较容易看懂的,就不多做详细解释了。

2.3 制作镜像

运行 docker build 创建一个新的镜像:

  1. [root@greatsql]# cd /data/docker-greatsql
  2. #用法:docker build -t [镜像名]:[镜像tag] [Dockerfile文件所在路径]
  3. [root@greatsql]# docker build -t greatsql:8.0.23 ./

参数 -t greatsql:8.0.23 的作用是打tag,也就是镜像名。

构建的整个过程大概如下(部分输出内容省略了):

  1. Sending build context to Docker daemon 1.041 GB
  2. Step 1/26 : FROM centos:7
  3. ---> 8652b9f0cb4c
  4. Step 2/26 : MAINTAINER greatsql@greatdb.com
  5. ---> Running in 2241e5964885
  6. ---> b88695fed8ba
  7. ...
  8. Removing intermediate container 25d994ce8e90
  9. Successfully built d1963ef0c403

看到最后的 Successfully 就表示打包成功了,如果有报错,需要根据错误信息逐个解决。

2.4 保存镜像到本地

把镜像文件保存到本地,方便拷贝到其他无外网的服务器上使用。运行 docker save 即可:

  1. #用法 docker save -o [导出文件.tar] [镜像名]:[镜像标签]
  2. [root@greatsql]# docker save -o Docker-GreatSQL-8.0.23-centos7.tar greatsql:8.0.23

保存成功,即可看到本地镜像文件包名 Docker-GreatSQL-8.0.23-centos7.tar

运行命令 docker load 即可加载本地镜像:

  1. #用法:docker load -i [本地tar包文件]
  2. [root@greatsql]# docker load -i Docker-GreatSQL-8.0.23-centos7.tar
  3. Loaded image: greatsql:8.0.23
  4. [root@greatsql]# docker images
  5. REPOSITORY TAG IMAGE ID CREATED SIZE
  6. greatsql latest 6540b4fa4887 3 days ago 502 MB
  7. greatsql 8.0.23-centos7 d1963ef0c403 3 days ago 582 MB
  8. greatsql 8.0.23 d1963ef0c403 3 days ago 582 MB

2.5 发布docker镜像

以发布到官方仓库 https://hub.docker.com 为例。

需要先自行注册账号,再用该账号登入:

  1. [root@greatsql]# docker login -u greatsql
  2. Password: *********

首次发布前,要先对本地镜像打个标签,例如:

  1. #用法:docker tag 本地镜像名[:标签] 仓库名/发布镜像名[:标签]
  2. #先加一个centos7的标记
  3. [root@greatsql]# docker tag greatsql:8.0.23 greatsql/greatsql:8.0.23-centos7
  4. #再加一个默认的latest标签
  5. [root@greatsql]# docker tag greatsql:8.0.23 greatsql/greatsql:latest

打完标签,就可以发布镜像了:

  1. #用法:docker push 仓库名/发布镜像名[:标签]
  2. [root@greatsql]# docker push greatsql/greatsql:8.0.23-centos7
  3. The push refers to a repository [docker.io/greatsql/greatsql]
  4. 953e779e02c1: Pushed
  5. ...
  6. 8ce193c7940e: Pushed
  7. 174f56854903: Layer already exists
  8. 8.0.23-centos7: digest: sha256:d28b16236cc097cc6bab10d94afe47562b518ffe201c7fb86688cf4cb4916975 size: 3050
  9. #把latest标签的镜像也发布一次
  10. [root@greatsql]# docker push greatsql/greatsql:latest

查看镜像列表:

  1. [root@greatsql]# docker images
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. greatsql/greatsql latest 6540b4fa4887 3 days ago 582 MB <-- 官方仓库里的镜像
  4. greatsql/greatsql 8.0.23-centos7 d1963ef0c403 3 days ago 582 MB <-- 官方仓库里的镜像
  5. greatsql 8.0.23 d1963ef0c403 3 days ago 582 MB <-- 本地镜像

可以搜索镜像,感受下看到自己劳动成果的喜悦。

  1. [root@greatsql]# docker search greatsql
  2. INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
  3. docker.io docker.io/greatsql/greatsql 0

现在可以下载该镜像了:

  1. [root@greatsql]# docker pull greatsql/greatsql

不加任何标签名的话,则自动选择最新的,也就是等同于:

  1. [root@greatsql]# docker pull greatsql/greatsql:latest

可以自行修改标签名下载。

本次先介绍到这里,下一P再介绍如何利用GreatSQL Docker镜像构建一个MGR集群。

水平有限,也请各位读者大人帮忙看看哪些可以优化的地方,感谢。

Enjoy GreatSQL & Docker :)


文章推荐:

  • 技术分享 | MGR最佳实践(MGR Best Practice)
  • 技术分享 | 万里数据库MGR Bug修复之路
  • 技术分享 | 将GreatSQL添加到系统systemd服务
  • 金融应用场景下跨数据中心的MGR架构方案(2)
  • 技术分享 | InnoDB Cluster+GreatSQL快速部署MGR集群,并实现读写分离和故障自动转移(超详细)
  • 技术分享 | 利用GreatSQL部署MGR集群,并完成添加新节点 、滚动升级、切主(超详细)
  • 《叶问》33期,MGR最佳配置参考,PFS里的监测指标要全开吗,mysqld进程占用内存过高怎么排查

  • MySQL 复制延迟 Seconds_Behind_Master 究竟是如何计算的

  • GreatSQL MGR优化参考

  • GreatSQL,打造更好的MGR生态


扫码加入GreatSQL/MGR交流QQ群

54f5b67af52130cbc07af9702676a662.png

点击文末“阅读原文”直达老叶专栏

发表评论

表情:
评论列表 (有 0 条评论,157人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Docker镜像

    镜像是Docker的三大核心概念之一。 Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认镜像仓库下载,用户也可以通过配置,使用自定

    相关 Docker 镜像

    获取镜像 获取镜像使用docker pull命令: docker pull NAME\[:TAG\] 如果不显示的指定TAG,则默认会选择latest标签,即下载仓库中最

    相关 Docker 镜像

    获取镜像 获取镜像使用docker pull命令: docker pull NAME\[:TAG\] 如果不显示的指定TAG,则默认会选择latest标签,即下载仓库中最

    相关 自制镜像

    默认的centos是没有安装jdk的,所以我们就在centos的基础上,安装jdk设置环境变量,并提交为新镜像。本篇文章旨在记录docker基础操作的训练。注意:docker官

    相关 Docker 镜像

    简介 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。

    相关 Docker 镜像

    Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不...