基于官方镜像MySQL做自定义业务扩充镜像
首先从https://hub.docker.com/_/mysql/拉取官方镜像,如果速度缓慢,建议添加国内加速
[root@docker ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mysql latest 5709795eeffa 4 days ago 408MB
查看如何使用mysql镜像启动一个container:
docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
-e:设置环境变量
MYSQL_ROOT_PASSWORD这个变量是强制性的,需要指定密码,如果没有设置此变量的值,那么创建container不会成功
MYSQL_USER:为MySQL服务创建一个用户(可选变量)
MYSQL_PASSWORD:为创建的用户给定密码(可选变量,与上面变量连用)
MYSQL_ALLOW_EMPTY_PASSWORD:指定允许mysql使用空密码(针对的是MySQL服务的root用户的密码)
MYSQL_DATABASE:为MySQL中创建库,指定库名称
更多其他变量查看:https://hub.docker.com/_/mysql/
[root@docker ~]# docker run --name=mysql -e MYSQL_ROOT_PASSWORD=redhat -d mysql[root@docker ~]# docker exec -it mysql /bin/bash root@c240bb45b889:/# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 Server version: 5.7.20 MySQL Community Server (GPL)Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
指定可以使用空密码,然后不设置root密码:
[root@docker ~]# docker run -d --name=mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql 9c9b61491d9c5f035a32c3ccbe8832ac025676051cc6513159d7bd7cec327d6e [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9c9b61491d9c mysql "docker-entrypoint..." 3 seconds ago Up 2 seconds 3306/tcp mysql
然后登录到mysql中:
[root@docker ~]# docker exec -it mysql /bin/bash root@9c9b61491d9c:/# mysql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.20 MySQL Community Server (GPL)Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
映射端口到本机host,然后进行-h host进行登录:
[root@docker ~]# docker run -d --name=mysql -p3306:3306 -e MYSQL_ROOT_PASSWORD=redhat mysql 19c8d047c38d445ca114433ef13f56921106b582e563d5763da61c5c8f48e898 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 19c8d047c38d mysql "docker-entrypoint..." 4 seconds ago Up 3 seconds 0.0.0.0:3306->3306/tcp mysql
使用mysql -uroot -p -h 192.168.101.14进行登录:
[root@docker ~]# docker exec -it mysql /bin/bash root@19c8d047c38d:/# mysql -uroot -p -h192.168.101.14 Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.20 MySQL Community Server (GPL)Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
启动容器时,挂载映射数据库数据目录:
[root@docker ~]# docker run -d --name=mysql -p3306:3306 -e MYSQL_ROOT_PASSWORD=redhat -v /data/mysql:/var/lib/mysql mysql a6f5ff4550fb13ae767cc1e1e37e344c33f90592dc19b2d2ddc80c5e6b842bf1 [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a6f5ff4550fb mysql "docker-entrypoint..." 4 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp mysql
查看映射到本机host的数据目录:
[root@docker ~]# ll /data/mysql/ total 188484 -rw-r-----. 1 systemd-bus-proxy input 56 Nov 9 14:58 auto.cnf -rw-------. 1 systemd-bus-proxy input 1679 Nov 9 14:58 ca-key.pem -rw-r--r--. 1 systemd-bus-proxy input 1107 Nov 9 14:58 ca.pem -rw-r--r--. 1 systemd-bus-proxy input 1107 Nov 9 14:58 client-cert.pem -rw-------. 1 systemd-bus-proxy input 1675 Nov 9 14:58 client-key.pem -rw-r-----. 1 systemd-bus-proxy input 1321 Nov 9 14:58 ib_buffer_pool -rw-r-----. 1 systemd-bus-proxy input 79691776 Nov 9 14:58 ibdata1 -rw-r-----. 1 systemd-bus-proxy input 50331648 Nov 9 14:58 ib_logfile0 -rw-r-----. 1 systemd-bus-proxy input 50331648 Nov 9 14:58 ib_logfile1 -rw-r-----. 1 systemd-bus-proxy input 12582912 Nov 9 14:58 ibtmp1 drwxr-x---. 2 systemd-bus-proxy input 4096 Nov 9 14:58 mysql drwxr-x---. 2 systemd-bus-proxy input 8192 Nov 9 14:58 performance_schema -rw-------. 1 systemd-bus-proxy input 1679 Nov 9 14:58 private_key.pem -rw-r--r--. 1 systemd-bus-proxy input 451 Nov 9 14:58 public_key.pem -rw-r--r--. 1 systemd-bus-proxy input 1107 Nov 9 14:58 server-cert.pem -rw-------. 1 systemd-bus-proxy input 1679 Nov 9 14:58 server-key.pem drwxr-x---. 2 systemd-bus-proxy input 8192 Nov 9 14:58 sys
当启动容器时,给MySQL服务创建一个数据库wordpress,创建一个用户wordpress,并指定密码wordpress:
[root@docker ~]# docker run -d --name=mysql -p3306:3306 -e MYSQL_ROOT_PASSWORD=redhat -v /data/mysql:/var/lib/mysql -e MYSQL_DATABASE=wordpress -e MYSQL_USER=wordpress -e MYSQL_PASSWORD=wordpress mysql 4ec8d2d23af884a90aed4e8f5ffd81a7beaa7a3e65065dfdaba49056880d985a [root@docker ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4ec8d2d23af8 mysql "docker-entrypoint..." 4 seconds ago Up 3 seconds 0.0.0.0:3306->3306/tcp mysql
验证创建的结果:
root@b5f97b989c51:/# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.20 MySQL Community Server (GPL)Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | wordpress | +--------------------+ 5 rows in set (0.00 sec)mysql> select user from mysql.user; +-----------+ | user | +-----------+ | root | | wordpress | | mysql.sys | | root | +-----------+ 4 rows in set (0.00 sec)mysql>
当这次创建的时候,必须先将上次创建的数据目录进行删除掉,因为如果不删除的话,还是上次创建container时的那次的数据
根据上面的一些操作可以明显的了解到,利用官方镜像启动容器然后执行sql必须麻烦,所以为了需求需要将镜像进行自定义扩容,能够在官方镜像上执行sql等其他需求
[root@docker mysql]# tree . ├── business.sql ├── Dockerfile ├── mysqld.cnf └── setup.sh
查看Dockerfile文件:
[root@docker mysql]# cat Dockerfile FROM mysqlMAINTAINER json_hc@163.comENV MYSQL_ALLOW_EMPTY_PASSWORD yesCOPY mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf COPY business.sql /root/business.sql COPY setup.sh /root/setup.shRUN chmod +x /root/setup.sh EXPOSE 3306ENTRYPOINT ["/root/setup.sh"]
Dockerfile中基于官方MySQL镜像,目前是MySQL5.7的版本,所以MySQL软件不需要进行安装,根据上一篇自定义构建MySQL的原理,可以知道在MySQL服务安装好的情况下
编写shell脚本重新将MySQL服务进行初始化,然后在启动和关闭数据库服务起降执行所需要的sql,最后前台执行MySQL进程就行
在最开始有一个ENV MYSQL_ALLOW_EMPTY_PASSWORD yes环境变量的设置,这是由于官方的MySQL镜像必须进行二选一进行root用户的密码要求
于是Dockerfile就是将需要执行的sql和shell脚本以及配置文件进行了copy
查看setup.sh这个shell脚本:
[root@docker mysql]# cat setup.sh #!/bin/sh chown -R mysql:mysql /var/lib/mysql#mysql_install_db --user=mysql --datadir=/var/lib/mysql > /dev/null mysqld --initialize-insecure --user=mysql > /dev/nullmysqld --user=mysql &sleep 5mysql < /root/business.sqlsleep 5ps -wef | grep mysql | grep -v grep | awk '{print $2}' | xargs kill -9mysqld --user=mysql
由于MySQL5.6和MySQL5.7初始化的过程不一样,默认情况下MySQL5.7初始化会生成一个root用户的随机密码,可以使用--initialize-insecure进行初始化使root用户
的密码为空,达到初始化的目的
查看business.sql
[root@docker mysql]# cat business.sql grant all privileges on *.* to 'root'@'localhost' identified by 'root';create database wordpress DEFAULT CHARACTER SET utf8;USE mysql; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;UPDATE user SET password=PASSWORD("root") WHERE user='root'; FLUSH PRIVILEGES;
查看配置文件
[root@docker mysql]# cat mysqld.cnf [mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql log-error = /var/log/mysql/error.log # By default we only accept connections from localhost bind-address = 0.0.0.0
COPY mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf这是官方配置文件的所在地最后进行构建:
[root@docker mysql]# docker build -t mysql:v1 .
[root@docker mysql]# docker run -d --name=mysql -p3306:3306 -v /data/mysql:/var/lib/mysql mysql:v1 9a7509d3f48eba1a67ec690db652c5b73cbcc88c96ff871701c0ef7becc3ecc4 [root@docker mysql]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 9a7509d3f48e mysql:v1 "/root/setup.sh" 3 seconds ago Up 2 seconds 0.0.0.0:3306->3306/tcp mysql
验证business.sql的内容:
[root@docker mysql]# docker exec -it mysql /bin/bash root@9a7509d3f48e:/# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.20 MySQL Community Server (GPL)Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | wordpress | +--------------------+ 5 rows in set (0.00 sec)mysql>
映射并挂载到本机host的数据目录:(挂载之前删掉/data/mysql,避免遗留的是上次挂载的数据)
[root@docker ~]# ll /data/mysql/ total 122916 -rw-r-----. 1 systemd-bus-proxy input 56 Nov 9 15:22 auto.cnf -rw-r-----. 1 systemd-bus-proxy input 419 Nov 9 15:22 ib_buffer_pool -rw-r-----. 1 systemd-bus-proxy input 12582912 Nov 9 15:22 ibdata1 -rw-r-----. 1 systemd-bus-proxy input 50331648 Nov 9 15:22 ib_logfile0 -rw-r-----. 1 systemd-bus-proxy input 50331648 Nov 9 15:22 ib_logfile1 -rw-r-----. 1 systemd-bus-proxy input 12582912 Nov 9 15:22 ibtmp1 drwxr-x---. 2 systemd-bus-proxy input 4096 Nov 9 15:22 mysql drwxr-x---. 2 systemd-bus-proxy input 8192 Nov 9 15:22 performance_schema drwxr-x---. 2 systemd-bus-proxy input 8192 Nov 9 15:22 sys drwxr-x---. 2 systemd-bus-proxy input 20 Nov 9 15:22 wordpress
配置文件和sql语句都可以根据业务进行替换,然后在MySQL镜像的基础上进行构建
该构建项目在GitHub:https://github.com/jsonhc/docker_project/tree/master/docker_dockerfile/mysql
转载于:https://www.cnblogs.com/jsonhc/p/7809571.html
基于官方镜像MySQL做自定义业务扩充镜像相关推荐
- docker 怎样用一个基础镜像然后做一个新的镜像
docker 怎样用一个基础镜像然后做一个新的镜像 我们知道docker 镜像必须有一个基础镜像,那么如何从一个基础镜像制作出自己需要的镜像呢? docker load 基础镜像 ------load ...
- 使用 “Cubic” 制作自定义 “ubuntu” 系统镜像
目录 一.前言 二.正文 ISO镜像定制 UUI镜像定制 定制系统测试 三.镜像下载 一.前言 使用ubuntu系统进行开发的时候,我们需要安装很多开发工具,比如sublime text.vscode ...
- centos基础镜像做mysql镜像_使用docker 基于centos7制作mysql镜像
说明:由于业务需要使用centos7.6+mysql5.7+jdk8以及其他的java程序,本想在网上找一个现成的,发现镜像都不适合我. 一.yum方式安装mysql 1.编写dockerfile文件 ...
- 详解使用DockerHub官方的mysql镜像生成容器
为什么80%的码农都做不了架构师?>>> 写在前面:看到网上关于利用DockerHub官方的mysql镜像生成容器此类的文档比较少,故结合自身实践分享给大家,还望多多指教. 我 ...
- mysql做kv数据库_从零开始写KV数据库:基于哈希索引
前言 新的KV数据库层出不穷,我们经常听说的KV数据库如RocksDb.Hbase等都是基于日志结构的存储引擎.最近我在看<数据密集型应用系统设计>,里面有一章专门在讲日志结构的存储引擎的 ...
- 基于mysqld_multi实现MySQL 5.7.24多实例多进程配置
MySQL多实例的原理 mysql多实例,简单理解就是在一台服务器上,mysql服务开启多个不同的端口(如3306.3307.3308)运行多个服务进程.这些 mysql 服务进程通过不同的 sock ...
- docker 打包mysql_基于docker部署mysql的数据持久化问题
本人最近在使用docker部署mysql时,在持久化mysql数据时遇到了一个有趣的问题,将排查过程及思考记录在这里,以备后查. 先简单描述下我遇到的问题:在mysql容器中创建了两个数据库,然后使用 ...
- Docker自定义部署Redis镜像
一. DOCKER介绍 Docker简介 (1)Docker 是一个开源的应用容器引擎,基于 Go 语言,并遵从Apache2.0协议开源. (2)Docker 可以让开发者打包他们的应用以及依赖包到 ...
- 基于滴滴云安装 Docker 并上传镜像到滴滴云 Docker 仓库
前言 Docker 简化了容器中应用程序进程的管理过程.容器允许您在资源隔离的进程中运行应用程序.容器与虚拟机类似,但容器更便携.更资源友好,并且更依赖于主机操作系统. 本文将介绍如何用滴滴云服务器在 ...
最新文章
- Android 调试 Release 包(debuggable)
- 由华为提供现网商用平台的IPTV业务亮相深圳文博会
- ansible安装部署和配置、常用模块整理
- 看完就能知道渗透测试的技术结构
- 模型剖析 | 如何解决业务运维的四大难题?
- centos 卸载自带的 java
- 履约时间预估:如何让外卖更快送达?
- python如何使用文件_Python的文件操作
- 怎么让存储过程通用化_怎么做分布式存储的面试?
- matlab单元数组和结构,Matlab使用单元数组和结构数组
- 并发、并行、线程、进程与CPU基本概念
- DN服务器修改配置文件,LDIF修改LDAP记录或配置示例
- 【自我救赎--牛客网Top101 4天刷题计划】 第三天 渐入佳境
- [机器学习]朴素贝叶斯原理和基于Spark 实例
- HashMap为什么是线程不安全的
- charles windows版使用教程
- Linux服务器中查询IP地址五个方法
- 38译码器数码管c语言代码,51单片机38译码器实现动态数码管控制
- 《领域驱动设计》学习笔记
- 03 day2--javascript笔记pink老师--对象