Docker MySQL5.5镜像
定制MySQL的镜像有个很大的难题:mysqld启动之前要初始化数据目录,5.5自带有空账号密码需要初始化。
Dockerfile
FROM centos
# 拷贝需要的安装和MySQL初始脚本
COPY ["src","/src"]
RUN groupadd -g 1003 mysql \
&& useradd -u 1003 -g mysql -s /sbin/nologin mysql ;\
yum install -y gcc \
gcc-c++ \
cmake \
make \
readline-devel \
&& yum clean all ;\
cd /src/ \
&& tar xf percona-server-5.5.61-38.13.tar.gz \
&& cd percona-server-5.5.61-38.13 \
&& CHOST="x86_64-pc-linux-gnu" CFLAGS="-march=nocona -O2 -pipe" CXXFLAGS="-march=nocona -O2 -pipe" \
cmake . \
-DMYSQL_USER=mysql \
-DCMAKE_BUILD_TYPE:STRING=Release \
-DSYSCONFDIR:PATH=/usr/local/mysql \
-DCMAKE_INSTALL_PREFIX:PATH=/usr/local/mysql \
-DENABLED_PROFILING:BOOL=ON \
-DENABLE_DEBUG_SYNC:BOOL=OFF \
-DMYSQL_DATADIR:PATH=/data/database/mysql \
-DMYSQL_MAINTAINER_MODE:BOOL=OFF \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_BIG_TABLES:BOOL=ON \
-DWITH_FAST_MUTEXES:BOOL=ON \
-DENABLE-PROFILING:BOOL=ON \
-DWITH_SSL:STRING=bundled \
-DWITH_UNIT_TESTS:BOOL=OFF \
-DWITH_ZLIB:STRING=bundled \
-DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON \
-DWITH_PLUGINS=heap,csv,partition,innodb_plugin,myisam \
-DEFAULT_COLLATION=utf8_general_ci \
-DEFAULT_CHARSET=utf8 \
-DENABLED_ASSEMBLER:BOOL=ON \
-DENABLED_LOCAL_INFILE:BOOL=ON \
-DENABLED_THREAD_SAFE_CLIENT:BOOL=ON \
-DENABLED_EMBEDDED_SERVER:BOOL=OFF \
-DWITH_CLIENT_LDFLAGS:STRING=all-static \
-DINSTALL_LAYOUT:STRING=STANDALONE \
-DCOMMUNITY_BUILD:BOOL=ON \
-DWITH_SAFEMALLOC=OFF \
-DENABLE_DTRACE=0 \
-DWITHOUT_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1 \
-DWITHOUT_ARCHIVE_STORAGE_ENGINE=1 \
&& make -j`grep -c processor /proc/cpuinfo` \
&& make install ;\
cd / ;\
cp /src/mysql_init.sh / ;\
cp /src/my.cnf /etc/ ;\
ln -sv /usr/local/mysql/bin/* /usr/local/bin/ ;\
mkdir /data/{save,database/mysql} -p ;\
strings /dev/urandom | tr -dc A-Za-z0-9 | head -c20 > /data/save/mysql_root ;\
chmod 600 /data/save/mysql_root ;\
chmod 700 /data/save ;\
chmod 750 /data/database/mysql ;\
chown mysql:mysql -R /data/database/mysql ;\
echo -e "/usr/local/mysql/bin/mysql -uroot -p\`cat /data/save/mysql_root\`" > /root/inmysql ;\
echo -e "/usr/local/mysql/bin/mysqladmin -uroot -p\`cat /data/save/mysql_root\` 'shutdown'" > /root/mysql_stop ;\
chmod 700 /root/mysql_stop /root/inmysql ;\
yum remove -y iputils* \
bind* \
vim* \
make \
cmake \
cpp \
acl \
rootfiles \
lzo \
readline-devel \
python-chardet \
hostnamed \
bus-python \
gobject-introspection \
libxml2-python \
python-gobject-base \
basesystem \
libgomp \
libstdc++-devel \
glibc-headers \
mpfr \
passwd \
yum-plugin-ovl \
dbus-glib \
python-kitchen \
ncurses-devel \
kernel-headers \
gpg-pubkey \
yum-util ;\
userdel mail ;\
userdel ftp ;\
userdel games ;\
cp /usr/share/zoneinfo/Asia/Shanghai /etc/ ;\
cp /usr/share/zoneinfo/Asia/Shanghai /etc/ ;\
ln -svf /etc/Shanghai /etc/localtime ;\
rm -rf /src /root/.bash* /root/.cshrc /root/.tcshrc /var/cache /usr/share/zoneinfo ;\
rm -rf /usr/local/mysql/{mysql-test,sql-bench,support-files,data,man,README.MySQL,COPYING,INSTALL-BINARY,docs}
ENTRYPOINT ["/mysql_init.sh"]
HEALTHCHECK --interval=60s --timeout=5s CMD /usr/local/mysql/bin/mysqladmin -uroot -p$(cat /data/save/mysql_root) ping | grep alive || exit 1
EXPOSE 3306
CMD ["/usr/local/mysql/bin/mysqld","--defaults-file=/etc/my.cnf","--user=mysql"]
src目录:
[root@Docker_Machine_192.168.31.130 ~]# cd /data/dokcer/dockerfile/mysql5.5/
[root@Docker_Machine_192.168.31.130 mysql5.5]# ll
total 21820
-rw-r--r-- 1 mysql mysql 3673 Dec 13 14:07 my.cnf
-rwxr-xr-x 1 root root 1705 Dec 13 17:20 mysql_init.sh
-rw-r--r-- 1 root root 22332795 Sep 4 16:10 percona-server-5.5.61-38.13.tar.gz
mysql_init.sh
脚本判断数据目录为空就进行初始化mysqld,然后再启动mysql
#!/bin/bash
#数据库初始化脚本
chown mysql:mysql -R /data/database/mysql
#判断数据目录为空,则先初始化再启动
if [ -z "$(ls -A /data/database/mysql/)" ] ; then
#初始化新实例
/usr/local/mysql/scripts/mysql_install_db --defaults-file=/etc/my.cnf --datadir=/data/database/mysql --basedir=/usr/local/mysql --user=mysql
[ "$?" -eq 0 ] && echo "初始化数据库完成..." || exit 1
chmod 750 /data/database/mysql
chmod 700 /data/database/mysql/mysql
chmod 700 /data/database/mysql/test
chmod 660 /data/database/mysql/mysql/*
#启动mysqld新实例
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf > /dev/null &
mysqld_pid="$!"
#等待mysqld启动完成
while [ ! -S /tmp/mysql.sock ]
do
if ps uax | grep -v grep |grep $mysqld_pid > /dev/null 2>&1 ; then
echo "等待mysqld启动..."
sleep 2s
else
echo "mysqld启动失败..."
exit 1
fi
done
[ "$?" -eq 0 ] && echo "mysqld启动完成..." || exit 1
#配置初始化密码,删除空账号
/usr/local/mysql/bin/mysqladmin -u root password `cat /data/save/mysql_root`
/usr/local/mysql/bin/mysqladmin -h 127.0.0.1 -u root password `cat /data/save/mysql_root`
[ "$?" -eq 0 ] && echo "root密码已重置..." || exit 1
/usr/local/mysql/bin/mysql -u root -p`cat /data/save/mysql_root` -e "DELETE FROM mysql.user WHERE password='' OR user=''; FLUSH PRIVILEGES ; "
[ "$?" -eq 0 ] && echo "空账号已清理..." || exit 1
#关闭mysqld
/usr/local/mysql/bin/mysqladmin -uroot -p`cat /data/save/mysql_root` shutdown
[ "$?" -eq 0 ] && echo "重启mysqld..." || exit 1
fi
exec "$@"
构建镜像
docker build -t volumes/percona-server:v5.5.61 .
启动容器
docker run -tid -v /data/dokcer/docker_local_volume/mysql_test1_3306/data/:/data/database/mysql -v /data/dokcer/docker_local_volume/mysql_test1_3306/etc/my.cnf:/etc/my.cnf --name=percona-server-v5.5.61_test1 volumes/percona-server:v5.5.61
第一次启动因为需要初始化配置,所以比较慢,可以通过logs 参数查看
- 数据目录挂载到:/data/database/mysql
- 配置文件挂载到:/etc/my.cnf
进入MySQL
docker exec -it percona-server-v5.5.61_test1 sh /root/inmysql
停止容器
docker exec percona-server-v5.5.61_test1 sh /root/mysql_stop
docker stop percona-server-v5.5.61_test1
说明一点:容器实例中的1号进程需要具备接收外部型号,然后根据信号控制其子进程的能力。
Docker MySQL5.5镜像的更多相关文章
- docker安装mysql5.6镜像并进行主从配置
docker安装mysql镜像并进行主从配置 1.去DaoCloud官网(dockerhub可能因为网速问题下载的慢)查找需要的mysql版本镜像 docker pull daocloud.io/li ...
- docker load导入镜像报错:open /var/lib/docker/tmp/docker-import-970689518/bin/json: no such file or directory
今天将之前打包好的mysql5.7.19的tar包通过docker load命令导入到Docker环境中却报出了如下错误: [root@host---- task]# docker load < ...
- Docker安装mysql镜像并进行主从配置
Docker安装mysql镜像并进行主从配置 1.下载需要的mysql版本镜像 docker pull mysql:5.6 2.启动mysql服务实例(基本启动) #启动主mysql docker r ...
- Docker的ubuntu镜像安装的容器无ifconfig和ping命令的解决
Docker的Ubuntu镜像安装的容器无ifconfig命令和ping命令 解决: apt-get update apt install net-tools # ifconfig apt ...
- 关于Docker官方CentOS镜像无法启动mysqld的总结
很多童鞋反映,在Docker官方CentOS镜像中安装了Mysql server后,无法正常启动. 无法正常启动表现为两种情况: 1> 初始完数据库后,mysqld启动报错 2> syst ...
- 理解docker容器和镜像(layer,ufs)和docker命令解释
博客好文1:http://blog.csdn.net/x931100537/article/details/49633107(理解docker容器和镜像,理解简单,从原理入手,什么是layer,什么是 ...
- 4.docker学习之镜像
镜像 我们知道,我们想在Windows操作系统上跑Linux,需要安装一个虚拟机程序,然后下载一个Linux镜像,在该虚拟机程序中创建一个虚拟机,并使用该镜像安装对应的Linux操作系统,安装好之后, ...
- 容器与Docker简介(四)Docker容器,镜像与 Registries——微软微服务电子书翻译系列
当使用Docker时,开发人员创建一个应用程序或服务,并将其和其依赖关系打包到容器镜像中. 镜像是应用程序或服务及其配置和依赖的静态表示形式. 要运行应用程序或服务,应用程序的镜像将被实例化以创建一个 ...
- docker之NGINX镜像构建
Nginx是一个高性能的Web和反向代理服务器,它具有很多非常优越的特性:1.作为Web服务器.2.作为负载均衡服务器.3.作为邮件代理服务器.4.安装及配置简单.接下来我们介绍在docker构建ng ...
随机推荐
- Linux下solr集群搭建
第一步:创建四个tomcat实例.每个tomcat运行在不同的端口.8180.8280.8380.8480 第二步:部署solr的war包.把单机版的solr工程复制到集群中的tomcat中. 第三步 ...
- 使用spring的aop对Struts2的Action拦截后出现依赖注入为空问题
两种解决方案: 1.action类继承ActionSupport了后,出现依赖注入为空,要在applicationContext.xml配置中加入:<aop:aspectj-autoproxy ...
- [LeetCode] 598. Range Addition II_Easy tag: Math
做个基本思路可以用 brute force, 但时间复杂度较高. 因为起始值都为0, 所以肯定是左上角的重合的最小的长方形就是结果, 所以我们求x, y 的最小值, 最后返回x*y. Code ...
- selenium处理弹出窗口
在selenium ui自动化测试过程中,经常会遇到,弹出新窗口,那么会对我们元素定位造成哪些影响呢? 1.元素id或xpath;name都没有问题,就是定位不到. 那如何解决呢?没错webdrive ...
- RF基础(一) RF内建函数库BuiltIn
Robot framework做为一个测试框架,并不是只能做selenium测试,是支持扩展的, 比如说,你引用requests库就可以做接口测试, 那么无论你用什么库 首先要了解, RF本身提供的内 ...
- unity3d-解密加密数据
利用RijndaelManaged加密解码.需要导入命名空间 using System.Security.Cryptography; 一个很简单的例子,最终的结果 解密和加密类 public clas ...
- webpack打包报错
Invalid configuration object. Webpack has been initialised using a configuration object that does no ...
- case when 遇到varchar转为int类型值失败的错误
问题描述: 在Sql Server 2005下, 使用如下语句报错:在将 varchar 值 '大' 转换成数据类型 int 时失败. 注:status 是整型字段 select ff= case ...
- 功能的显著性分析——GO Enrichment Analysis
Gene Ontology(GO)是基因功能国际标准分类体系.GO富集分析是对差异基因等按GO分类,并对分类结果进行基于离散分布的显著性分析.错判率分析.富集度分析,得到与实验目的有显著联系的.低 ...
- HIBERNATE与 MYBATIS的对比
我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...