安装部署环境
- Ubuntu 20.04.1 LTS
- Docker 20.10.11
- MySQL latest(8.0.27)
下载镜像
从仓库中拉取mysql
镜像,如果没加标签的话,默认获取最新版本(latest)
$ docker pull mysql:tag
复制代码
简单启动 MySQL服务器
启动 MySQL 实例很简单:
$ docker run --name some-mysql \
-e MYSQL_ROOT_PASSWORD='my-secret-pw' \
-d mysql:tag
复制代码
some-mysql
:分配给容器的名称root
:为root用户设置的密码tag
:mysql
镜像标签
挂载数据卷以及配置文件启动
查找配置文件位置
不同版本部署的 MySQL 内,可能文件路径不一致,如 /etc/mysql/my.cnf
、 /etc/mysql/conf.d
或者 /etc/mysql/mysql.conf.d
等。运行以下命令查找mysql
配置文件my.cnf
的位置:
$ docker run --rm mysql mysql --help | grep my.cnf
复制代码
得到结果:
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf
复制代码
意思是按照/etc/my.cnf
、/etc/mysql/my.cnf
、~/.my.cnf
路径按优先排序。
依次访问上述路径:
$ docker run --rm mysql cat /etc/my.cnf
cat: /etc/my.cnf: No such file or directory
$ docker run --rm mysql cat /etc/mysql/my.cnf
# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
...
复制代码
可以得到镜像中mysql
配置文件路径为/etc/mysql/my.cnf
查找数据文件位置
运行以下命令查看mysql
镜像信息:
$ docker inspect mysql
复制代码
得到结果:
...
"Volumes": {
"/var/lib/mysql": {}
},
...
复制代码
可以得到mysql
挂载的数据文件路径为/var/lib/mysql
创建本地路径
在物理机上,创建指定数据和配置文件的挂载路径(须在docker进程有写权限的目录下,如/home/docker
)
$ mkdir -p /home/docker/mysql/conf && mkdir -p /home/docker/mysql/datadir
复制代码
将容器的mysql
默认配置文件/etc/mysql/my.cnf
拷贝出来
$ CID=`docker run -d mysql` \
&& docker cp $CID:/etc/mysql/my.cnf /home/docker/mysql/conf \
&& docker stop $CID \
&& docker rm $CID
复制代码
挂载启动MySQL
知道了mysql
配置文件和数据文件位置,就可以挂载启动mysql
服务了
$ docker run --name some-mysql \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=my-secret-pw \
-v /home/docker/mysql/conf/my.cnf:/etc/my.cnf \
-v /home/docker/mysql/datadir:/var/lib/mysql \
--restart=on-failure:3 \
-d mysql
复制代码
- --name:为容器指定一个名字
- -p:指定端口映射,格式为:主机(宿主)端口:容器端口
- -e:设置环境变量
- --restart=on-failure:3:是指容器在未来出现异常退出(退出码非0)的情况下循环重启3次
- --mount:目录挂载
- -d:后台运行容器,并返回容器 id
MySQL 命令行客户端
命令启动另一个mysql
容器实例进入命令行客户端:
$ docker run -it --rm mysql mysql \
-hsome.mysql.host -usome-mysql-user -p
复制代码
查看MySQL日志
$ docker logs some-mysql
复制代码
环境变量说明
在启动mysql
镜像时,可以通过在docker run
命令行中传递一个或多个环境变量来调整 MySQL 实例的配置。请注意,如果您使用已经包含数据库的数据目录启动容器,则以下任何变量都不会产生任何影响:在容器启动时,任何预先存在的数据库将始终保持不变。
MYSQL_ROOT_PASSWORD
此变量是必需的,它指定将为 MySQLroot
超级用户帐户设置的密码。在上面的例子中,它被设置为root
。
MYSQL_DATABASE
此变量是可选的,允许您指定要在映像启动时创建的数据库的名称。如果提供了用户/密码(见下文),则该用户将被授予对该数据库的超级用户访问权限(对应于GRANT ALL
)。
MYSQL_USER
, MYSQL_PASSWORD
这些变量是可选的,结合使用来创建新用户和设置该用户的密码。该用户将被授予对MYSQL_DATABASE
变量指定的数据库的超级用户权限(见上文)。
MYSQL_ALLOW_EMPTY_PASSWORD
这是一个可选变量。设置为非空值,例如yes
,以允许使用 root 用户的空白密码启动容器。
MYSQL_RANDOM_ROOT_PASSWORD
这是一个可选变量。设置为非空值,如yes
,为 root 用户生成随机初始密码(使用pwgen
)。生成的 root 密码将打印到控制台 ( GENERATED ROOT PASSWORD: .....
)。
MYSQL_ONETIME_PASSWORD
初始化完成后,将root(不是在MYSQL_USER
! 中指定的用户)用户设置为过期,强制在首次登录时更改密码。任何非空值都将激活此设置。注意:此功能仅在 MySQL 5.6+ 上受支持。在 MySQL 5.5 上使用此选项将在初始化期间引发适当的错误。
MYSQL_INITDB_SKIP_TZINFO
默认情况下,入口点脚本会自动加载CONVERT_TZ()
函数所需的时区数据。如果不需要,任何非空值都会禁用时区加载。
备份和恢复
创建数据库转储
启动mysql
镜像使用mysqldump
命令备份:
$ docker exec some-mysql sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /some/path/on/your/host/all-databases.sql
复制代码
从转储文件中恢复数据
启动mysql
镜像执行.sql
文件
$ docker exec -i some-mysql sh -c 'exec mysql -uroot -p"$MYSQL_ROOT_PASSWORD"' < /some/path/on/your/host/all-databases.sql
复制代码