转自:https://www.cnblogs.com/jsonhc/p/7809571.html

首先从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 mysql MAINTAINER json_hc@163.com 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脚本:

[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/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

[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

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

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

    详解使用DockerHub官方的mysql镜像生成容器 收藏 yope 发表于 10个月前 阅读 1506 收藏 32 点赞 1 评论 0 腾讯云·云上实验室:开发者零门槛,免费使用真机在线实验!&g ...

  2. 详解如何使用Docker Hub官方的MySQL镜像生成容器

    一直在尝试以官方CentOS镜像为基础,制作基于CentOS的MySQL镜像.但是制作后发现镜像大小已经超过1.5G,这对于一般的Docker镜像来说太臃肿了.Docker Hub官方提供的CentO ...

  3. 使用docker 基于centos7制作mysql镜像

    说明:由于业务需要使用centos7.6+mysql5.7+jdk8以及其他的java程序,本想在网上找一个现成的,发现镜像都不适合我. 一.yum方式安装mysql 1.编写dockerfile文件 ...

  4. navicat与phpmyadmin做mysql的自定义函数和事件

    自定义函数和事件是mysql一个很方便的功能,navicat在5.1以上版本就支持了自定义函数和事件,phpmyadmim不清楚. 用这个是由于一些简单的事情,没有必要去做一个服务器计划使用 接下来我 ...

  5. (一)构建基于ubuntu docker MySQL 5.6 镜像并推送到Docker Hub

    一,创建目录二,文件准备三,构建四,使用五,在宿主机上连接docker 中的mysql六,推送镜像到Docker hub 一,创建目录 mkdir -p mysql/5.6 二,文件准备 注意执行脚本 ...

  6. Mysql 5.7 基于组复制(MySQL Group Replication) - 运维小结

    之前介绍了Mysq主从同步的异步复制(默认模式).半同步复制.基于GTID复制.基于组提交和并行复制 (解决同步延迟),下面简单说下Mysql基于组复制(MySQL Group Replication ...

  7. Centos8 部署 ElasticSearch 集群并搭建 ELK,基于Logstash同步MySQL数据到ElasticSearch

    Centos8安装Docker 1.更新一下yum [root@VM-24-9-centos ~]# yum -y update 2.安装containerd.io # centos8默认使用podm ...

  8. 自定义 OpenShift s2i 镜像与模板——OracleJDK8

    本文目标 由于 OpenShift 官方提供的镜像与模板(OpenJDK8)不完全满足业务需要: 不包含飞行记录功能.只有 OpenJDK11 以上才被 Oracle 开源 生成堆 dump 很大很慢 ...

  9. 基于Inception搭建MySQL SQL审核平台Yearing

    基于Inception搭建MySQL SQL审核平台Yearing Inception 1. Inceptionj简介 2. Inception安装 2.1 下载和编译 2.2 启动配置 Yearni ...

随机推荐

  1. MySQL学习----索引的使用

    一.什么是索引?为什么要建立索引? 索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的 ...

  2. [UE4]修改射击方向

  3. T-SQL 逻辑控制语句 ifelse while casewhen

    ifelse,如果逻辑语句有多行,用begin end 包裹 use StudentManageDB go --查询成绩 declare @cAvg int select @cAvg=avg(CSha ...

  4. 安装npm报错 npm cache clean --force 搞定

  5. CGo中传递多维数组给C函数

    转自:http://www.cnblogs.com/cobbliu/p/5035358.html package main /* #include <stdio.h> #include & ...

  6. spark streaming检查点使用

    import org.apache.spark._ import org.apache.spark.streaming._ /** * Created by code-pc on 16/3/14. * ...

  7. C# webbrowser全掌握(二)

    全篇引用单元mshtml; 路径:C:\windows\assembly\GAC\Microsoft.mshtml\7.0.3300.0__b03f5f7f11d50a3a\Microsoft.msh ...

  8. SPOJ COT3 - Combat on a tree

    /* 考虑直接使用暴力来算的话 SG[i]表示以i为根的子树的SG值, 然后考虑枚举删除那个子树节点, 然后求拆成的树的sg异或值, 求mex即可 复杂度三次方 然后考虑尝试 整体来做 发现对于每次子 ...

  9. Django之Django debug toolbar调试工具

    一.安装Django debug toolbar调试工具 pip3 install django-debug-toolbar 如果出错命令为 pip install django_debug_tool ...

  10. CentOS7开机时的菜单选项及时间的修改

    一.在CentOS更新后,并不会自动删除旧内核.所以在启动选项中会有多个内核选项,可以手动使用以下命令删除多余的内核:(正常下,第一个选项正常启动,第二个选项急救模式启动(系统出项问题不能正常启动时使 ...