下载 MySQL Server Docker Image

#tag代表版本号,如5.5,5.6,5.7,8.0或者latest
docker pull mysql/mysql-server:tag
#查看下载的镜像
docker images
要下载MySQL Enterprise Edition 镜像,请运行如下命令:
docker pull store/oracle/mysql-enterprise-server:tag
或
docker pull container-registry.oracle.com/mysql/enterprise-server:tag
开启MySQL Server 实例
使用以下命令为MySQL社区服务器启动一个新的Docker容器:
docker run --name=mysql1 -d mysql/mysql-server:tag
如果从Oracle容器注册表中下载了Docker镜像,那么就可以使用这个命令为MySQL企业服务器启动一个新的Docker容器:
docker run --name=mysql1 -d container-registry.oracle.com/mysql/enterprise-server:tag
如果Docker映像是从Docker商店下载的,那么就用这个命令为MySQL企业服务器启动一个新的Docker容器:
docker run --name=mysql1 -d store/oracle/mysql-enterprise-server:tag

--name 选项,为docker容器提供一个自定义的名称,如mysql1,这个操作是可选的。如果没有提供容器名称,则会生成一个随机的容器名。如果之前的Docker pull 或 Docker run命令没有下载指定名称和标签的Docker镜像,那么上面的命令会去下载最新的mysql镜像。下载完后,容器的初始化就开始执行。当您运行docker ps命令时,docker容器列表中会显示:

shell> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a24888f0d6f4 mysql/mysql-server "/entrypoint.sh my..." 14 seconds ago Up 13 seconds (health: starting) 3306/tcp, 33060/tcp mysql1

容器初始化可能需要一些时间。当服务器准备好使用时,docker ps 命令输出中的容器的状态从(health:starting)到(healthy).上面的docker run 命令中使用的 -d 选项使容器在后台运行。使用这个命令监视容器的输出:

docker logs mysql1

一旦初始化完成,命令的输出就会包含为root用户生成的随机密码。例如,检查密码。

shell> docker logs mysql1 2>&1 | grep GENERATED
GENERATED ROOT PASSWORD:Axegh3kAJyDLaRuBemecis&EShOs

从容器内连接到MySQL服务器

一旦服务器准备好了,您就可以在刚刚启动的MySQL服务器容器中运行MySQL客户端,并将其连接到MySQL服务器。使用Docker exec -it 命令在您已经启动的Docker容器中启动一个mysql客户端,如下所列:

docker exec -it mysql1 mysql -uroot -p

当被询问时,输入生成的根密码(参见上面关于如何查找密码的MySQL服务器实例的最后一步)。因为mysql onetime password选项默认为true,在您将mysql客户端连接到服务器之后,您必须通过发出以下语句重置服务器根密码:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'password';

用您选择的密码替换密码。一旦密码被重置,服务器就可以使用了。

容器Shell访问

要让shell访问MySQL服务器容器,请使用docker exec -it 命令在容器内启动一个bash shell:

shell> docker exec -it mysql1 bash
bash-4.2#
然后您可以在容器内运行Linux命令。例如,要查看容器内服务器的数据目录中的内容,请使用以下命令:
bash-4.2# ls /var/lib/mysql
auto.cnf ca.pem client-key.pem ib_logfile0 ibdata1 mysql mysql.sock.lock private_key.pem server- cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile1 ibtmp1 mysql.sock performance_schema public_key.pem server-key.pem

停止并删除一个MySQL容器

要停止我们创建的MySQL服务器容器,请使用以下命令:

docker stop mysql1

docker stop 向mysqld进程发送SIGTERM信号,这样服务器就会优雅地关闭。

还要注意的是,当容器的主进程(MySQL服务器容器中的mysqld)停止时,Docker容器会自动停止。

再次启动MySQL服务器容器:

docker start mysql1
重启容器
docker restart mysql1
删除mysql服务容器前先停止容器:
docker stop mysql1
docker rm mysql1

如果您想要同时删除服务器数据目录的Docker卷,则将 -v 选项添加到Docker rm命令中。

致此,以上操作已经完全满足docker安装mysql的方式。如下是针对Docker的优化MySQL安装 。

针对Docker的优化MySQL安装

MySQL的Docker镜像针对代码的大小进行了优化,这意味着它们只包含了那些在Docker容器中运行MySQL实例的大多数用户的关键组件。在以下方面,MySQL Docker安装与普通的、非Docker的安装不同:

包含的二进制文件仅限于:

/usr/bin/my_print_defaults
/usr/bin/mysql
/usr/bin/mysql_config
/usr/bin/mysql_install_db
/usr/bin/mysql_tzinfo_to_sql
/usr/bin/mysql_upgrade
/usr/bin/mysqladmin
/usr/bin/mysqlcheck
/usr/bin/mysqldump
/usr/bin/mysqlpump
/usr/sbin/mysqld

所有的二进制被剥落,不包含调试信息。

配置MySQL Server

当你启动mysql docker容器时,您可以通过Docker run命令将配置选项传递给服务器;例如:

docker run --name mysql1 -d mysql/mysql-server:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_col

命令以utf8mb4作为默认字符集和utf8mb4col作为您的数据库的默认排序启动MySQL服务器。

另一种配置MySQL服务器的方法是准备一个配置文件,并将其挂载到容器内的服务器配置文件的位置。有关详细信息,请参阅持久数据和配置更改。

持久数据和配置更改

Docker容器在原则上是临时的,如果容器被删除或损坏,任何数据或配置都将丢失(参见讨论)。然而,Docker卷提供了一种机制,可以在Docker容器中保存数据。在初始化时,MySQL服务器容器为服务器数据目录创建Docker卷。运行docker检查容器命令的JSON输出有一个挂载键,其值提供数据目录卷的信息:

shell> docker inspect mysql1
...
"Mounts": [
{
"Type": "volume",
"Name": "4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652",
"Source": "/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data",
"Destination": "/var/lib/mysql",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
...

输出显示源文件夹

/var/lib/docker/volumes/4f2d463cfc4bdd4baebcb098c97d7da3337195ed2c6572bc0b89f7e845d27652/_data,将数据持久化到主机上的数据,已经安装在/var/lib/mysql中,容器内的服务器数据目录。

保存数据的另一种方法是在创建容器时使用 --mount 选项挂载主机目录。同样的技术可以用来持久化服务器的配置。下面的命令创建一个MySQL服务器容器,并将数据目录和服务器配置文件绑定在一起:

docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/path-on-host-machine/datadir,dst=/var/lib/mysql \
-d mysql/mysql-server:tag
配置文件path-on-host-machine/my.cnf必须存在,同时包含指定的用户:
[mysqld]
user=mysql

path-on-host-machine.datadir目录必须存在。要发生服务器初始化,目录必须是空的。您还可以安装一个带有数据的目录,并使用它启动服务器;但是,您必须确保启动Docker容器,其配置与创建数据的服务器具有相同的配置,并且启动容器时所需的任何主机文件或目录都被安装。

运行额外的初始化脚本

如果您想在创建后立即在数据库上运行任何.sh或.sql脚本,您可以将它们放入主机目录中,然后mount目录在/docker-entrypoint-initdb.d

docker run --name=mysql1 \
--mount type=bind,src=/path-on-host-machine/scripts/,dst=/docker-entrypoint-initdb.d/ \
-d mysql/mysql-server:tag

从另一个Docker容器中的应用程序连接到MySQL

通过建立一个Docker网络,你可以让多个Docker容器相互通信,这样,在另一个Docker容器中的客户端应用程序就可以在服务器容器中访问MySQL服务器。首先,创建一个Docker网络:

docker network create my-custom-net

然后,当您创建并启动服务器和客户端容器时,使用-网络选项将它们放在您创建的网络上。例如:

docker run --name=mysql1 --network=my-custom-net -d mysql/mysql-server
docker run --name=myapp1 --network=my-custom-net -d myapp

myapp1容器随后可以与mysql1主机连接到mysql1容器,反之亦然,因为Docker会自动为给定的容器名称设置一个DNS。在下面的例子中,我们从myapp1容器中运行mysql客户端,以便在自己的容器中连接主机mysql1:

docker exec -it myapp1 mysql --host=mysql1 --user=myuser --password