基于官方镜像MySQL做自定义业务扩充镜像

首先从https://hub.docker.com/_/mysql/拉取官方镜像,如果速度缓慢,建议添加国内加速

[[email protected] ~]# 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/

[[email protected] ~]# docker run --name=mysql -e MYSQL_ROOT_PASSWORD=redhat -d mysql

[[email protected] ~]# docker exec -it mysql /bin/bash
[email protected]:/# 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密码:

[[email protected] ~]# docker run -d --name=mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=yes mysql
9c9b61491d9c5f035a32c3ccbe8832ac025676051cc6513159d7bd7cec327d6e
[[email protected] ~]# 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中:

[[email protected] ~]# docker exec -it mysql /bin/bash
[email protected]:/# 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进行登录:

[[email protected] ~]# docker run -d --name=mysql -p3306:3306 -e MYSQL_ROOT_PASSWORD=redhat mysql
19c8d047c38d445ca114433ef13f56921106b582e563d5763da61c5c8f48e898
[[email protected] ~]# 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进行登录:

[[email protected] ~]# docker exec -it mysql /bin/bash
[email protected]:/# 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> 

启动容器时,挂载映射数据库数据目录:

[[email protected] ~]# docker run -d --name=mysql -p3306:3306 -e MYSQL_ROOT_PASSWORD=redhat -v /data/mysql:/var/lib/mysql mysql
a6f5ff4550fb13ae767cc1e1e37e344c33f90592dc19b2d2ddc80c5e6b842bf1
[[email protected] ~]# 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的数据目录:

[[email protected] ~]# 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:

[[email protected] ~]# 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
[[email protected] ~]# 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

验证创建的结果:

[email protected]:/# 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等其他需求

[[email protected] mysql]# tree
.
├── business.sql
├── Dockerfile
├── mysqld.cnf
└── setup.sh

查看Dockerfile文件:

[[email protected] mysql]# cat Dockerfile
FROM mysql

MAINTAINER [email protected]

ENV MYSQL_ALLOW_EMPTY_PASSWORD yes

COPY mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf
COPY business.sql /root/business.sql
COPY setup.sh /root/setup.sh

RUN chmod +x /root/setup.sh
EXPOSE 3306

ENTRYPOINT ["/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脚本:

[[email protected] 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/null

mysqld --user=mysql &

sleep 5

mysql < /root/business.sql

sleep 5

ps -wef | grep mysql | grep -v grep | awk ‘{print $2}‘ | xargs kill -9

mysqld --user=mysql

由于MySQL5.6和MySQL5.7初始化的过程不一样,默认情况下MySQL5.7初始化会生成一个root用户的随机密码,可以使用--initialize-insecure进行初始化使root用户

的密码为空,达到初始化的目的

查看business.sql

[[email protected] 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;

查看配置文件

[[email protected] 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这是官方配置文件的所在地最后进行构建:
[[email protected] mysql]# docker build -t mysql:v1 .
[[email protected] mysql]# docker run -d --name=mysql -p3306:3306 -v /data/mysql:/var/lib/mysql mysql:v1
9a7509d3f48eba1a67ec690db652c5b73cbcc88c96ff871701c0ef7becc3ecc4
[[email protected] 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的内容:

[[email protected] mysql]# docker exec -it mysql /bin/bash
[email protected]:/# 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,避免遗留的是上次挂载的数据)

[[email protected] ~]# 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/maohuidong/p/9914799.html

时间: 2024-10-10 20:01:52

基于官方镜像MySQL做自定义业务扩充镜像的相关文章

详解使用DockerHub官方的mysql镜像生成容器

收藏 yope 发表于 10个月前 阅读 1506 收藏 32 点赞 1 评论 0 腾讯云·云上实验室:开发者零门槛,免费使用真机在线实验!>>>   摘要: 详解使用DockerHub官方的mysql镜像生成容器 一.下载官方的mysql镜像: 二.生成容器 : 三.进入到新生成的容器: 四.修改容器中mysql的配置文件 . 写在前面:看到网上关于利用DockerHub官方的mysql镜像生成容器此类的文档比较少,故结合自身实践分享给大家,还望多多指教. 我的需求:利用docker

mysql二进制日志详解及备份恢复、基于mysqldump及lvmsnapshot做备份恢复详解

二进制日志: 时间点恢复 复制 20140411 回顾: 日志文件:6类 一般查询日志:log, general_log, log_output 慢查询日志: 错误日志 二进制日志 中继日志 事务日志 二进制日志:"修改" position:位置 time: 时间 滚动: 1.大小 2.时间 二进制日志的功用: 即时点恢复: 复制: mysql> SHOW MASTER STATUS; mysql> FLUSH LOGS; mysql> SHOW BINARY LOG

基于mysqld_multi实现MySQL 5.7.24多实例多进程配置

MySQL多实例的原理 mysql多实例,简单理解就是在一台服务器上,mysql服务开启多个不同的端口(如3306.3307.3308)运行多个服务进程.这些 mysql 服务进程通过不同的 socket来监听不同的数据端口,进而互不干涉的提供各自的服务. 在同一台服务器上,mysql 多实例会去共用一套 mysql 应用程序,因此你在部署 mysql 的时候只需要部署一次mysql程序即可,无需多次部署.但是,mysql多实例之间会各自使用不同的 my.cnf配置文件.启动程序和数据文件.在提

基于mysqld_multi实现MySQL多实例配置

环境: 操作系统  CentOS7.5(已安装MySQL) 主机名    localhost 本机安装路径为 /usr/local/mysql 实验初始配置:所有主机关闭防火墙与selinux [[email protected] ~]# iptables -F [[email protected] ~]# systemctl stop firewalld [[email protected] ~]# setenforce 0 MySQL多实例的原理 mysql多实例,简单理解就是在一台服务器上

为什么需要自定义一个基础镜像?

开始之前 为什么需要自定义一个PHP基础镜像? 对于使用php (python)等开发的项目,由于是解释型语言并不需要编译代码这个步骤(go或者java将依赖打包到可执行程序或包中),但是往往还需要安装一些依赖的库或者第三方模块. 在项目实践中一般会先在PHP官方镜像之上,添加项目一些必用扩展模块,例如连接 mysql数据库的 mysqlnd 模块,或者连接 redis.memcache.mongodb 等常用的php扩展模块,以项目实际需求为准. 基础镜像作用是为项目镜像提供支持,准备好php

基于keepalived搭建MySQL的高可用集群

http://www.cnblogs.com/ivictor/p/5522383.html 基于keepalived搭建MySQL的高可用集群 MySQL的高可用方案一般有如下几种: keepalived+双主,MHA,MMM,Heartbeat+DRBD,PXC,Galera Cluster 比较常用的是keepalived+双主,MHA和PXC. 对于小公司,一般推荐使用keepalived+双主,简单. 下面来部署一下 配置环境: 角色                          

基于Keepalived实现Mysql高可用

前言 由于最近要使用Mysql数据库,而目前公司服务器与业务有限,于是只使用了一台Mysql.所以,问题很明显,如果这台Mysql坏了,那么将会影响整个公司的业务,所以考虑做Mysql的高可用方案.目前,Mysql的高可用方案很多,这里选择Keepalived+Mysql实现高可用. 环境介绍 ID OS IP Role node1 CentOS6.5_X64 192.168.1.159 Master node2 CentOS6.5_X64 192.168.1.160 Slave  Mysql

基于apache和mysql,安装seafile - v1.0

seafile:下一代的开源云存储更好的文件同步,隐私保护和团队协作功能!本文基于官方文档,补充描述基于apache和mysql,安装seafile服务器. 原文网址:https://cloud.seafile.com/group/762/wiki/%E5%9C%A8apache%E7%8E%AF%E5%A2%83%E4%B8%8B%E9%83%A8%E7%BD%B2seafile/ 修改:陈海青(http://hhrz.org) 1.准备 下载安装预装了apache和mysql的虚拟机(基于d

基于amoeba实现mysql数据库的读写分离/负载均衡

一.Amoeba的简述:[来自百度百科] Amoeba是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求.与MySQL官方的MySQL Proxy相比,作者强调的是amoeba配置的方便(基于XML的配置文件,用SQLJEP语法书写规则,比基于lua脚本的MySQL Proxy简单). Amoeba相当于一个SQL请求的路由器,目的是为