docker 安装 mysql
可以在 docker hub搜索可用的 mysql 版本:https://hub.docker.com/_/mysql
假设我们选择8.1.0版本,就可以使用如下命令基于mysql:8.1.0来启动容器:
docker run --name mysql8.1 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=password \
-d mysql:8.1.0
参数解析:
--name mysql8.1
指定启动的容器名称,必须指定-p 3306:3306
将容器的 3306 端口暴露给主机的 3306 端口-e
用来指定环境变量-d
表示在后台启动容器,并返回容器IDmysql:8.1.0
是我们指定的镜像
docker run
命令的详细介绍可以使用docker run --help
命令查看。
如果镜像在本地不存在,会先从 docker hub
拉取镜像到本地,然后基于镜像启动容器。
然后就可以使用docker images
查看拉取的镜像:
最后使用docker ps
查看已启动的容器:
如果我们想要使用命令行连接到启动的mysql,一种方式是使用客户端(比如DataGrip)来连接,另一种方式是使用命令行来连接。首先进入到容器中:
docker exec -it mysql8.1 bash
然后使用如下命令登录mysql:
mysql -u root -p
然后根据提示输入密码即可。
如果要退出 mysql 使用 exit
即可,退出容器的话也是exit
。
mysql 启动的时候使用-d
参数指定了在后台启动,如果要看日志的话执行如下命令:
docker logs mysql8.1
最后不再使用的时候可以使用docker stop [container-id | container-name]
停止容器:
docker stop mysql8.1
删除容器的话可以使用docker rm [container-id | container-name]
docker rm mysql8.1
如果要永久删除镜像的话可以使用docker rmi [image:tag | image-id]
docker rmi mysql:8.1.0
使用自定义配置启动mysql
MySQL的默认配置文件是/etc/mysql/my.cnf
文件,如果想要自定义配置,可以参考:https://dev.mysql.com/doc/refman/8.1/en/server-system-variables.html。当然可以在容器启动的时候指定新的cnf
文件来覆盖默认配置文件。
在~/env
路径下创建配置文件mysql.cnf
:
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.1/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.1/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
!includedir /etc/mysql/conf.d/
使用配置文件启动:
docker run --name mysql8.1 \
-p 3306:3306 \
-v ~/env:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=password \
-d mysql:8.1.0
其中-v ~/env/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
指定将主机的配置文件挂载到容器的/etc/mysql/conf.d
路径下,这样容器启动的时候将会组合/etc/mysql/my.cnf
和/etc/mysql/conf.d/mysql.cnf
两个配置文件。
如果只有少数几个配置项需要覆盖,也可以在启动容器的命令中以--key=value
的形式指定,这样就不用使用cnf文件了:
docker run --name mysql8.1 \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=password \
-d mysql:8.1.0 \
--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
配置 mysql 的数据存储位置
在 docker 中运行的 mysql 的数据存放在哪里呢?在容器中存放在/var/lib/mysql
路径下,对应到主机上在什么路径下呢?
默认情况下,Docker将数据库文件写入主机上的磁盘来管理数据库数据,这样带来的缺点是:在主机系统上运行的应用程序很难找到这些文件。
我们可以在主机上创建一个数据目录,并将其挂载到容器内部的/var/lib/mysql
路径。
首先在主机上创建一个数据目录:
cd home
mkdir /mysql8/data
然后在容器启动的时候进行挂载:
docker run --name mysql8.1 \
-p 3306:3306 \
-v /home/mysql8/data:/var/lib/mysql \
-v /home/mysql8/config:/etc/mysql/conf.d \
-v /home/mysql8/logs:/logs \
-e MYSQL_ROOT_PASSWORD=password \
-d mysql:8.1.0