问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Docker运行MySQL服务详细教程

创作时间:
作者:
@小白创作中心

Docker运行MySQL服务详细教程

引用
1
来源
1.
https://www.cnblogs.com/yilangcode/p/18095423

本文将详细介绍如何在Linux系统上使用Docker运行MySQL服务。内容包括环境准备、镜像拉取、容器启动、远程连接配置、数据目录挂载等多个步骤,每个步骤都配有详细的命令解释和操作指导。文章还列举了在实际操作中可能遇到的问题及其解决方案,具有较强的实用性和参考价值。

环境说明

在开始之前,需要确认以下环境信息:

  • Linux系统版本:可以通过lsb_release -a命令查看
  • Docker版本:可以通过docker -v命令查看

不同的操作系统以及软件版本,可能会遇到不一样的问题,一定要注意版本问题。

查看docker中mysql的版本,可以去官网,需要kx上网才能打开。
https://hub.docker.com/

最好是确认自己的服务器已经设置阿里云的镜像加速,或者使用腾讯的,网易的都是可以的。自己选,设置之后下载镜像的速度回快很多。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://registry-vpc.cn-hangzhou.aliyuncs.com"]
}
EOF

查看自己本地的Mysql版本

Select VERSION();

版本为5.7.20

1. 拉取docker的mysql镜像

因此自己去拉取docker的Mysql镜像的时候,同样拉取这个版本。

命令如下,

docker pull mysql:5.7

docker images命令可以查看当前服务器上已经安装的镜像,从图中可以看出mysql镜像已经正确安装。

2. 启动测试

docker run --name=mysql -it -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d 5107333e08a8

参数解释:

  • docker run 运行docker容器服务
  • --name=mysql 给容器服务取一个名字,便于区分服务,不取会默认给一个名字
  • -p 3306:3306表示将宿主机的端口3306映射到mysql容器服务的3306端口上,-p表示port的简写
  • -e MYSQL_ROOT_PASSWORD=123456表示设置mysql服务的密码为123456
  • -d 5107333e08a8表示以指定的镜像ID启动容器服务,因为同一种类型的镜像可能有多个,比如有多个版本的mysql镜像

注意:如果不添加-d 5107333e08a8指令,默认启动时会以最新版本启动容器服务;没有最新版本的容器,就会自动去下载最新版本的容器,很烦人。

启动好之后,会返回一个容器ID,长度为64位。这个容器ID是Docker为镜像分配的唯一标识符,可以用于对容器进行操作和管理。

3. 打开服务器端口,远程连接测试

登录阿里云服务器管理控制台,找到控制台->服务器->安全组,打开进入的端口,如下所示。

真实使用的时候,建议不要使用默认端口,现在是做测试使用没啥问题。

测试连接,发现连接错误,初步判断需要开启远程连接。

尝试一:使用阿里云的通义千问查询关键词 docker启动 mysql 开启远程连接

删除之前启动的mysql容器服务,重新执行下面的命令,

尝试使用里面的方式来进行操作

docker run --name=mysql -it \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_ROOT_HOST=% \
-d 5107333e08a8

命令说明:

  • -e MYSQL_ROOT_HOST=%:允许任意主机(%)连接到MySQL服务器(这将启用远程连接)

再次远程连接测试,连接成功。

4. 在宿主机上创建对应的mysql目录,然后创建必要的目录和配置文件。如下所示

添加配置信息如下,

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/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
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
port=3308
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock

至于这些配置信息如何来的,大致思路说一下,可以先临时启动一个mysql容器,然后使用如下命令,

.a.进入mysql容器的命令如下:

docker exec -it tmysql /bin/bash

.b.查找mysql容器内 配置文件所在的位置,命令如下

mysql --help | grep my.cnf

结果发现有两个配置文件,那么哪一个配置文件会生效呢?

对于这个问题,自己就不在去进行测试,直接使用网友给的答案。第二个会生效。

如果想做测试的话,方法很简单,去修改配置文件里面的值,然后重新启动mysql容器服务,

看修改的值是否生效。比如最大连接数,修改后重启服务,然后登录mysql查询一下即可看到效果。

.c.将容器内mysql的配置文件复制一份到宿主机上保存,然后停止原来的容器,删除容器。

其他配置信息可根据需要进行添加即可。

docker cp mysql:/etc/my.cnf /opt/u01/exam/mysql/my.conf

5. 重新执行命令

.a.停掉原来的容器服务;

.b.删除原来的容器服务;

.c.执行新的启动容器的命令。

docker run --name=mysql -it \
-p 3306:3308 \
-e MYSQL_ROOT_HOST=% \
-v /opt/u01/exam/mysql/my.cnf:/etc/mysql/my.cnf \
-v /opt/u01/exam/mysql/logs:/var/log/mysql \
-v /opt/u01/exam/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
-d 5107333e08a8

参数说明:

  • -v /opt/u01/exam/mysql/my.cnf:/etc/mysql/my.cnf 表示将宿主机上的配置文件挂载到mysql容器中
  • -v /opt/u01/exam/mysql/logs:/var/log/mysql 表示宿主机上的日志目录挂载到mysql容器中
  • -v /opt/u01/exam/mysql/data:/var/lib/mysql 表示将宿主机上的目录挂载到mysql容器中

说明:端口自己已经在mysql的配置文件中修改为3308,密码自己直接在配置文件中进行设置,

如果数据库没有初始化,则可能会报错,

因此-e MYSQL_ROOT_PASSWORD=123456这条命令建议最好加上。

6. 查看挂载的目录是否生效

发现宿主机上的data目录下已经有对应的各种数据文件,说明目录挂载已经生效。

测试方式

.a.先进入mysql容器内,查询最大连接数。

docker exec -it mysql /bin/bash
mysql -u root -p
use mysql;
show VARIABLES like 'max_conn%';

.b.修改宿主机中的配置文件,添加最大连接数

.c.重启容器服务,重新查看是否生效;如下图所示,已经生效。证明挂载的配置文件已经生效。

命令: docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mysql

可以获取容器内mysql桥接的地址。

遇到问题

问题一:密码一直是123456,需要自己去重新设置密码。

mysql -u root -p
use mysql;
如果Mysql的版本是5.7及以上的话update语句如下:
update user set authentication_string=password("test") where user='root';
flush privileges;

查看Mysql对应的端口号语句如下,

show global variables like 'port';

问题二:在设置mysql最大连接数的时候,max_connections=180 的位置一定要放正确。

错误示范

导致的问题如下,登录时报错

正确的设置端口还有最大连接数的位置如下。

问题三:设置mysql配置文件的时候,启动容器服务,报密码错误。

使用docker logs 容器ID或名称如下

导致这个问题的原因是mysql配置文件中,配置密码的位置在配置文件中的[client]的位置一定要注意!

参考博文.

https://juejin.cn/post/6975374769923293191
https://cloud.tencent.com/developer/article/2154817
https://www.cnblogs.com/notchangeworld/p/12208538.html
https://www.cnblogs.com/huoshuyinghua/p/14094530.html
https://www.cnblogs.com/peashooter/p/9456255.html
https://www.cnblogs.com/sheseido/p/12708864.html
https://cloud.tencent.com/developer/article/1872788

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号