近期打算制作一个GreatSQL的docker镜像,方便社区用户使用GreatSQL。
制作docker镜像的环境基于CentOS 7.9:
[root@greatsql]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@greatsql]# uname -a 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
要制作docker镜像,需要先安装docker,并启动服务。
[root@greatsql]# yum install -y docker [root@greatsql]# systemctl start docker
准备好一个CentOS基础镜像,选用CentOS 7这个基础镜像。
[root@greatsql]# docker pull centos:7 [root@greatsql]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/centos 7 8652b9f0cb4c 7 months ago 204 MB
这个镜像的仓库是 docker.io/centos,标签是 7(表示是CentOS 7版本),标签ID是 8652b9f0cb4c,最后更新时间是7个月前,镜像大小是204MB。
这里如果选择CentOS 8的镜像也是可以的,不过一些系统命令略有区别,具体选哪个纯粹看个人喜好。
先创建工作目录 /data/docker-greatsql:
[root@greatsql]# mkdir -p /data/docker-greatsql && cd /data/docker-greatsql
运行GreatSQL需要用到jemalloc,默认的yum源里通常没有,所以先自行下载到本地:
[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 等文件也放入:
[root@greatsql]# ls GreatSQL-8.0.23-14-Linux-glibc2.17-x86_64 bin cmake docs include lib LICENSE LICENSE-test man README README-test run share support-files var [root@greatsql]# ls -aR GreatSQL-8.0.23-14-Linux-glibc2.17-x86_64/support-files/ GreatSQL-8.0.23-14-Linux-glibc2.17-x86_64/support-files/: . .. greatsql.service my.cnf mysqld_multi.server mysql-log-rotate mysql.server sysconfig GreatSQL-8.0.23-14-Linux-glibc2.17-x86_64/support-files/sysconfig: . .. mysql
提醒:docker镜像中使用GreatSQL二进制文件已经执行过 strip 操作,删除二进制程序文件中的符号信息和调试信息,其优势是文件特别小,缺点是后期无法用于gdb跟踪调试。
接下来编辑Dockfile文档。
Dockerfile文档内容如下:
FROM centos:7 MAINTAINER greatsql@greatdb.com RUN localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8 ENV LANG en_US.utf8 ENV MYSQL_DATA_DIR=/data/GreatSQL ENV MYSQL_USER=mysql ENV MYSQL_UID_GID=3306 ENV MYSQL_EXTRACT_DIR=/usr/local ENV TMP_DIR=/tmp ENV MYSQL_PORT=3306 ENV GREATSQL="GreatSQL-8.0.23-14-Linux-glibc2.17-x86_64" ENV MYSQL_BASEDIR=${MYSQL_EXTRACT_DIR}/${GREATSQL} ENV JEMALLOC_RPM="jemalloc-3.6.0-1.el7.x86_64.rpm" ENV DEP_LIBS="numactl-libs libaio readline-devel ncurses-devel" ENV GREATSQL_INIT="greatsql-init.sh" #Creating user mysql RUN groupadd -g ${MYSQL_UID_GID} ${MYSQL_USER}; \ useradd -u ${MYSQL_UID_GID} -r -g ${MYSQL_UID_GID} -s /sbin/nologin \ -c "MySQL User" ${MYSQL_USER} #Copying files COPY ${GREATSQL} ${MYSQL_EXTRACT_DIR}/${GREATSQL} COPY ${JEMALLOC_RPM} ${TMP_DIR} #Installing jemalloc & depend libs RUN yum install -y ${TMP_DIR}/${JEMALLOC_RPM} ; yum install -y ${DEP_LIBS} RUN cd ${MYSQL_BASEDIR}/support-files && \ cp -f my.cnf /etc/my.cnf ; \ echo "LD_PRELOAD=/usr/lib64/libjemalloc.so.1" >> /etc/sysconfig/mysql ; \ echo "THP_SETTING=never" >> /etc/sysconfig/mysql ; \ echo "export PATH=\$PATH:${MYSQL_BASEDIR}/bin" >> /etc/profile.d/mysql.sh ; \ source /etc/profile.d/mysql.sh RUN PATH="\$PATH:${MYSQL_BASEDIR}/bin" RUN export PATH #Creating datadir RUN mkdir -p ${MYSQL_DATA_DIR} && chown -R ${MYSQL_USER}:${MYSQL_USER} ${MYSQL_BASEDIR} ; \ chmod -R ug+rwX ${MYSQL_BASEDIR} ; \ chmod -R ug+rwX /etc/my.cnf RUN rm -f ${TMP_DIR}/${JEMALLOC_RPM} COPY ${GREATSQL_INIT} /docker-entrypoint.sh ENTRYPOINT ["/docker-entrypoint.sh"] EXPOSE ${MYSQL_PORT} ${MYSQL_PORT}0 ${MYSQL_PORT}1 CMD ["mysqld"]
内容还是比较容易看懂的,就不多做详细解释了。
运行 docker build 创建一个新的镜像:
[root@greatsql]# cd /data/docker-greatsql #用法:docker build -t [镜像名]:[镜像tag] [Dockerfile文件所在路径] [root@greatsql]# docker build -t greatsql:8.0.23 ./
参数 -t greatsql:8.0.23 的作用是打tag,也就是镜像名。
构建的整个过程大概如下(部分输出内容省略了):
Sending build context to Docker daemon 1.041 GB Step 1/26 : FROM centos:7 ---> 8652b9f0cb4c Step 2/26 : MAINTAINER greatsql@greatdb.com ---> Running in 2241e5964885 ---> b88695fed8ba ... Removing intermediate container 25d994ce8e90 Successfully built d1963ef0c403
看到最后的 Successfully 就表示打包成功了,如果有报错,需要根据错误信息逐个解决。
把镜像文件保存到本地,方便拷贝到其他无外网的服务器上使用。运行 docker save 即可:
#用法 docker save -o [导出文件.tar] [镜像名]:[镜像标签] [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 即可加载本地镜像:
#用法:docker load -i [本地tar包文件] [root@greatsql]# docker load -i Docker-GreatSQL-8.0.23-centos7.tar Loaded image: greatsql:8.0.23 [root@greatsql]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE greatsql latest 6540b4fa4887 3 days ago 502 MB greatsql 8.0.23-centos7 d1963ef0c403 3 days ago 582 MB greatsql 8.0.23 d1963ef0c403 3 days ago 582 MB
以发布到官方仓库 https://hub.docker.com 为例。
需要先自行注册账号,再用该账号登入:
[root@greatsql]# docker login -u greatsql Password: *********
首次发布前,要先对本地镜像打个标签,例如:
#用法:docker tag 本地镜像名[:标签] 仓库名/发布镜像名[:标签] #先加一个centos7的标记 [root@greatsql]# docker tag greatsql:8.0.23 greatsql/greatsql:8.0.23-centos7 #再加一个默认的latest标签 [root@greatsql]# docker tag greatsql:8.0.23 greatsql/greatsql:latest
打完标签,就可以发布镜像了:
#用法:docker push 仓库名/发布镜像名[:标签] [root@greatsql]# docker push greatsql/greatsql:8.0.23-centos7 The push refers to a repository [docker.io/greatsql/greatsql] 953e779e02c1: Pushed ... 8ce193c7940e: Pushed 174f56854903: Layer already exists 8.0.23-centos7: digest: sha256:d28b16236cc097cc6bab10d94afe47562b518ffe201c7fb86688cf4cb4916975 size: 3050 #把latest标签的镜像也发布一次 [root@greatsql]# docker push greatsql/greatsql:latest
查看镜像列表:
[root@greatsql]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE greatsql/greatsql latest 6540b4fa4887 3 days ago 582 MB <-- 官方仓库里的镜像 greatsql/greatsql 8.0.23-centos7 d1963ef0c403 3 days ago 582 MB <-- 官方仓库里的镜像 greatsql 8.0.23 d1963ef0c403 3 days ago 582 MB <-- 本地镜像
可以搜索镜像,感受下看到自己劳动成果的喜悦。
[root@greatsql]# docker search greatsql INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/greatsql/greatsql 0
现在可以下载该镜像了:
[root@greatsql]# docker pull greatsql/greatsql
不加任何标签名的话,则自动选择最新的,也就是等同于:
[root@greatsql]# docker pull greatsql/greatsql:latest
可以自行修改标签名下载。
本次先介绍到这里,下一P再介绍如何利用GreatSQL Docker镜像构建一个MGR集群。
水平有限,也请各位读者大人帮忙看看哪些可以优化的地方,感谢。
Enjoy GreatSQL & Docker