一、拉取一个mysql5.5镜像
docker pull mysql:5.5
二、通过镜像启动一个容器,并在容器中安装ps命令,安装前需要更新apt-get
docker run ‐di -p 3306:3306 --name mysqldocker -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.5
因为原生的mysql:5.5镜像里面很干净,里面的apt-get工具也是老版的,所以进入容器后得先更新apt-get,再安装ps
apt-get update && apt-get install procps
根据自己的需要修改mysql配置文件/etc/mysql/my.cnf,下面是我的配置
[mysqld]
datadir=/var/lib/mysql
general_log=on
general_log_file=/var/log/mysql/general.log
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
pid-file=/var/run/mysqld/mysqld.pid
!includedir /etc/mysql/conf.d/
查看配置文件中的文件或文件夹是否存在,没有的话记得去创建
创建文件/var/log/mysql/general.log并给予权限chown -R mysql:mysql /var/log/mysql -> cd mysql -> touch general.log -> chmod +x general.log
建立一个软链接 ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock (一定得建立这个软链接,不然后面进入数据库时会报错)
三、退出容器,并使用此容器生成一个镜像
docker commit -m 'mysql5.5' -a 'ha' mysqldocker mysql5.5:part1
四、用上面生成的新的镜像来开启一个新的容器,后面加上/bin/bash
docker run -dit --privileged=true --name=testmysql mysql:part1 /bin/bash
进入testmysql容器中,ps查看mysql进程,没有自动启动,此时使用启动mysql的原始命令mysqld --user root
mysqld --user root
输入该命令后报错:[ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it
此时运行命令mysql_install_db --user=mysql
输入该命令后报错:
FATAL ERROR: Could not find ./bin/my_print_defaults
If you compiled from source, you need to run 'make install' to
copy the software into the correct location ready for operation.
If you are using a binary release, you must either be at the top
level of the extracted archive, or pass the --basedir option
pointing to that location.
按照错误提示,去mysql安装目录的bin目录下查找是否有my_print_defaults, 本镜像mysql的安装目录为/usr/local/mysql,进到bin文件夹下查看是否有my_print_defaults,发现是有的;再回过头看报错信息,注意到那个路径是相对路径,是以mysql的安装目录为起始的,而初始化则是进去初始化脚本目录里运行脚本;所以回到安装目录以相对路径去执行初始化脚本
cd /usr/local/mysql
./scripts/mysql_install_db --user=mysql
再重新执行一遍mysqld --user root,发现mysql已经成功启动
但在容器中执行mysql -u root -p123456是发现报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password:YES)
这是因为数据库里面user表中的用户密码被置空了,具体什么原因正在了解
此时需要修改my.cnf配置文件,添加skip-grant-tables,重新启动mysql,然后无密码进入数据库中
执行:update mysql.user set password=PASSWORD("123456") where user="root"
如果需要允许外部主机访问本数据库,则还需要在user表中添加一条记录:insert into user(host,user,password) values("%","root",PASSWORD("123456"));
刷新:flush privileges;
退出并重启数据库
五、将testmysql容器制作成最终的镜像
docker commit -m 'mysql5.5' -a 'ha' testmysql mysql5.5:part2