docker官方mysql镜像自定义配置的方法

复制代码 代码如下:

$ docker run --name some-mysql -e mysql_root_password=my-secret-pw -d daocloud.io/mysql:tag

some-mysql 指定了该容器的名字,my-secret-pw 指定了 root 用户的密码,tag 参数指定了你想要的 mysql 版本

这样数据是没有持久化的 所以在启动参数中需要挂载本地目录

于是这样数据库一直跑着,但是由于最近程序需要支持emoji表情,不得不将mysql的字符集更改。

复制代码 代码如下:

$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e mysql_root_password=my-secret-pw -d daocloud.io/mysql:tag

这时候就可以挂载自定义配置文件,官方文档说明

当 mysql 服务启动时会以 /etc/mysql/my.cnf 为配置文件,本文件会导入 /etc/mysql/conf.d 目录中所有以 .cnf 为后缀的文件。这些文件会拓展或覆盖 /etc/mysql/my.cnf 文件中的配置。因此你可以创建你自己需要的配置文件并挂载至 mysql 容器中的 /etc/mysql/conf.d 目录。

所以最简单改变数据库配置的方式就是在宿主机上新建配置文件,改成utf8mb4

[client]

default-character-set=utf8mb4


[mysqld]

character-set-client-handshake = false

character-set-server = utf8mb4

collation-server = utf8mb4_unicode_ci

[mysql]
default-character-set=utf8mb4

随后将文件复制到相应docker容器文件夹下

docker cp /home/my.cnf(宿主机文件路径) [容器id]:/etc/mysql/mysql.conf.d

最后使用docker stop和start命令重启容器就实现了加载自定义配置。

由docker的mysql官方镜像配置的容器无法启动问题

我使用的是mysql的docker镜像。先创建并启动镜像:

# docker run --name mysql-b \
>
-p 33002:3306 -v /zc/mysql/datadir-b:/var/lib/mysql \
>
-e mysql_root_password='
123456'
-d mysql:latest

正常启动,没有问题。通常我们使用mysql的时候,需要设置参数。要设置参数,我们先得进入容器的bash,进行操作:

docker exec -it mysql-b bash

mysql的默认配置文件是 /etc/mysql/my.cnf 文件。如果想要自定义配置,建议向 /etc/mysql/conf.d 目录中创建 .cnf 文件。新建的文件可以任意起名,只要保证后缀名是 cnf 即可。新建的文件中的配置项可以覆盖 /etc/mysql/my.cnf 中的配置项。因为 mysql 的 docker 官方镜像没有提供 vim 编辑器,所以我用cat命令生成文件并添加内容:

# cat >

轻松实现Docker官方MySQL镜像的自定义配置


test.cnf <
<
eof
[mysqldump]
user=root
password='
123456'

[mysqld]
max_allowed_packet=8m
lower_case_table_names=1
character_set_server=utf8
max_connections=900
max_connect_errors=600
default-character-set=utf8
eof

退出后,停止容器,再重新启动容器,发现容器无法启动。

解决方法

删除原来那个不能启动的容器。重新创建一个新的容器。问题的关键在于原来的 test.cnf 文件有错误。找到原来配置文件的最后一行:

default-character-set=utf8

把这一行删除。添加配置文件的时候保证没有这一行就可以了。

问题原因

mysql 的官方 docker 镜像里面,在标签 latest 下,[mysqld] 这一配置段上并没有 default-character-set 这一配置项。如果你要查看所有的配置项,可以使用如下命令,利用管道将输出的帮助都放到 help.txt 文件里面:

docker run -it --rm mysql:tag --verbose --help >
help.txt

其中 tag 表示镜像的标签,比如 latest 和 5.6。



Docker是一种非常流行的容器化技术,Docker Hub也提供了很多官方镜像。其中,MySQL镜像是应用非常广泛的一个。但是,有些时候你需要对MySQL进行一些自定义配置,这时候就需要对官方MySQL镜像进行配置了。本文将介绍如何对Docker官方MySQL镜像进行自定义配置。
使用Docker官方MySQL容器
首先,你需要安装Docker,并拉取Docker官方MySQL镜像。可以运行下面的命令:
```
docker pull mysql/mysql-server
```
启动MySQL容器
使用以下命令来启动MySQL容器:
```
docker run --name=mysql1 -e MYSQL_ROOT_PASSWORD=pass -d mysql/mysql-server
```
其中,–name参数表示容器的名称,-e参数表示配置MySQL的root用户密码为“pass”,-d参数表示后台运行,MySQL容器启动后会在后台生存并运行。如果你想依次启动MySQL容器,可以运行这个命令:
```
docker start mysql1
```
更改MySql配置
MySQL容器的配置文件位于容器内部,而不是容器外。因此,更改配置文件需要进入容器。你可以使用以下命令,通过bash shell访问容器内部:
```
docker exec -it mysql1 bash
```
然后,你就可以进入容器内部的bash shell,然后可以编辑MySQL配置文件。MySQL容器配置文件的位置处于/ect/mysql/my.cnf。使用vim或nano编辑器进行编辑:
```
vim /etc/mysql/my.cnf
```
如果你不想编辑器就退出,并且保存更改。只要按下ESC键,然后输入:wq或者ZZ就可以了。
更改MySQL配置变更后,重启MySQL服务,使其生效。使用以下命令重新启动MySQL服务:
```
service mysql restart
```
保存MySQL容器全新的数据库
在Docker中,镜像会在容器重启之后被删除。这意味着你也会失去数据。因此,对于MySQL容器中产生的数据,需要在容器关闭时,保存数据。你可以使用以下方法,为MySQL容器创建卷:
```
docker run -v /your/data/dir:/var/lib/mysql --name mysql1 -e MYSQL_ROOT_PASSWORD=pass -d mysql/mysql-server
```
其中,-v参数表示为MySQL容器指定了卷,这个卷可以在主机中的/your/data/dir目录上找到。所有MySQL容器产生的数据都保存在这个目录下。如果你以后再次创建MySQL容器,并且使用同样的卷,MySQL容器会读取上一个容器中产生的数据,而不是重新创建数据。
定制MySQL镜像
如果你经常需要使用MySQL容器,并且你对容器中的MySQL进行了大量的自定义配置,并且需要保存容器中的数据,那么你可以使用定制MySQL镜像来跟简单的创建MySQL容器。创建定制MySQL镜像需要:
1.在官方MySQL的基础上,创建Dockerfile文件。

2.将Dockerfile构建成镜像。
Dockerfile的内容非常简单,需要在MySQL的基础上,添加你的MySQL配置文件。这里是Dockerfile的内容:
```
FROM mysql/mysql-server
COPY my.cnf /etc/mysql/my.cnf
```
这个Dockerfile文件中,使用了FROM指令将官方MySQL基础镜像作为基础。然后使用COPY指令,将配置文件my.cnf拷贝到镜像内部。
然后使用下面的命令将这个文件构建为定制的MySQL镜像:
```
docker build --tag mymysql .
```
其中,–tag参数指定了镜像的名称和版本。点号.表明当前目录是构建上下文的根目录,Docker会将当前目录下所有文件作为构建上下文。
最后,使用下列命令启动你的MySQL容器:
```
docker run -v /my/own/datadir:/var/lib/mysql --name mymysql -d mymysql
```
这个命令启动了MySQL容器,并在镜像上指定了卷。所有容器中产生的数据都会保存在/your/own/datadir目录中。
总结
本文中,为大家介绍了Docker官方MySQL镜像进行自定义配置的方法。你可以将MySQL配置文件保存在宿主机的目录,以便于在容器关闭时保留数据。定制MySQL镜像,是一种可重用的方式,可以使你变得更简单。