Docker搭建MySQL

Docker搭建MySQL

准备工作

  1. 先准备配置目录和持久化目录,举个栗子:mkdir -p /opt/module/mysql/{conf,data,log}
  2. 准备配置文件*.cnf,放到/opt/module/mysql/conf目录下。
  3. 当然不准备也没事,容器中有个默认配置:/etc/mysql/conf.d/my.cnf

拉取官方MySQL镜像

bash 复制代码
# 拉取 mysql8.0.33
docker pull mysql:8.0.33
docker pull mysql:5.7 

# 拉取最新版mysql镜像
docker pull mysql

运行镜像【安装MySQL8.0】

bash 复制代码
docker run -d -p 3306:3306 --name mysql \
-v /opt/module/mysql/conf:/etc/mysql/conf.d \
-v /opt/module/mysql/data:/var/lib/mysql \
-v /opt/module/mysql/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=root mysql:8.0.33

-d 表示后台启动;
-p 3306:3306 表示端口映射,前面是主机端口,后面是代表容器端口;
--name mysql 表示容器名称;


-v /opt/module/mysql/conf:/etc/mysql/conf.d 挂载配置文件,前面是主机目录,后面是容器内目录。
特别说明:

  • MySQL默认配置文件为/etc/mysql/my.cnf,该文件里面最后有一行!includedir /etc/mysql/conf.d/,表示包含该文件夹下面的*.cnf配置,故自定义配置放到该目录下即可;
  • 比较常用的方式是-v /opt/module/mysql/conf/my.cnf:/etc/mysql/my.cnf,直接挂载/opt/module/mysql/conf/my.cnf替换掉/etc/mysql/my.cnf文件;
  • 两种方式都行,个人更喜欢前一种;

-v /opt/module/mysql/data:/var/lib/mysql 挂载数据文件,前面是主机目录,后面是容器内目录;

-v /opt/module/mysql/log:/var/log/mysql 挂载数据文件,前面是主机目录,后面是容器内目录;

-e MYSQL_ROOT_PASSWORD=root 表示增加环境变量,等号前面是变量名称,这里是设置密码为root;
mysql:8.0.31 表示镜像名称和tag;

设置mysql开机自启

bash 复制代码
#查看是否运行
docker ps -a
#设置mysql开机自启
sudo docker update mysql --restart=always

查看启动日志

bash 复制代码
#docker logs [服务id/服务名]
docker logs mysql

docker logs -f -t --tail 20 mysql

进入MySQL容器内部

bash 复制代码
docker ps -a     # 查看正在运行的容器,并得到 容器id

# 进入mysql容器内部
docker exec -it [容器id] /bin/bash  # 中间那个是容器id 就是 CONTAINER_ID
#  -it 表示进入
bash 复制代码
docker exec -it mysql bash
docker exec -it mysql /bin/bash
bash 复制代码
# 使用 命令别名 开启 ll命令
cat <<EOF >> /etc/profile
alias ll='ls -l --color=tty'
alias grep='grep --color=auto'
EOF

检查

bash 复制代码
# 执行如下命令可以登录MySQL
docker exec -it mysql mysql -uroot -p  #回车后输入密码进入MySQL
# 执行相关MySQL语句查询
show databases; #回车

配置my.cnf

bash 复制代码
cat <<EOF >> /opt/module/mysql/conf/my.cnf
[client]
default_character_set=utf8
[mysqld]
collation_server = utf8_general_ci
character_set_server = utf8
EOF

查看docker下的ip地址

bash 复制代码
docker inspect [container_id 容器id]
或
docker inspect [container_id 容器id] | grep ip address

docker inspect --format='{{.NetworkSettings.IPAddress}}' [container_id 容器id]

查看防火墙【开放端口】

bash 复制代码
# 查询端口是否开放
firewall-cmd --query-port=3306/tcp

# 开放3306端口
firewall-cmd --permanent --add-port=3306/tcp

# 移除端口
firewall-cmd --permanent --remove-port=3306/tcp

# 重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload

# 查看已经开发那些端口
firewall-cmd --list-ports
firewall-cmd --zone=public --list-ports

卸载

bash 复制代码
#停止mysql服务(也可以停止其他)
#docker stop [容器id/容器名]
docker stop mysql

#删除mysql服务(也可以删除其他)
#docker rm [服务id/服务名]
docker rm mysql

#删除mysql镜像
#docker rmi [镜像id/镜像名]
docker rmi mysql

常见错误

mysql Tablespace exists解决
1813 - Tablespace 'xx.xx`' exists.

执行如下命令:

dart 复制代码
mysql> show global variables like "%datadir%";
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.03 sec)
ruby 复制代码
去这个目录(/var/lib/mysql/ )下面找 表名.idb 文件,
删除该.ibd文件文件后,再重新创建表就没有问题了

补充MySQL权限操作

MySQL中:

  1. 创建hadoop用户,密码为:root
  2. 给hadoop用户,分配可以操作AAA、BBB数据库权限
  3. 开启hadoop用户的远程访问权限

在MySQL中,你可以通过以下步骤来完成上述任务:

  1. 创建用户并设置密码
sql 复制代码
CREATE USER 'hadoop'@'localhost' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;

这将在本地创建一个名为'hadoop'的用户,并设置密码为'root'。如果要允许从任何主机远程访问,可以使用以下命令:

sql 复制代码
CREATE USER 'hadoop'@'%' IDENTIFIED BY 'root';
FLUSH PRIVILEGES;
  1. 给用户分配数据库权限【指定数据库】
sql 复制代码
GRANT ALL PRIVILEGES ON AAA.* TO 'hadoop'@'localhost';
GRANT ALL PRIVILEGES ON BBB.* TO 'hadoop'@'localhost';
FLUSH PRIVILEGES;

这将授予用户'hadoop'在本地对数据库'AAA'和'BBB'的全部权限。如果要允许从任何主机远程访问,可以使用以下命令:

sql 复制代码
GRANT ALL PRIVILEGES ON AAA.* TO 'hadoop'@'%';
GRANT ALL PRIVILEGES ON BBB.* TO 'hadoop'@'%';
FLUSH PRIVILEGES;
  1. 给用户分配数据库权限【全部数据库】

    如果你想给hadoop用户分配可以操作所有数据库的权限,你可以使用通配符*。以下是在MySQL中授予用户对所有数据库的全部权限的方法:

    sql 复制代码
    -- 在localhost上授予权限
    GRANT ALL PRIVILEGES ON *.* TO 'hadoop'@'localhost' WITH GRANT OPTION;
    
    -- 允许远程访问时,使用以下语句
    GRANT ALL PRIVILEGES ON *.* TO 'hadoop'@'%' WITH GRANT OPTION;

    上述语句中,*.*表示所有数据库的所有表。WITH GRANT OPTION表示hadoop用户将拥有授予权限给其他用户的权限。

    请注意,给予用户对所有数据库的全部权限可能存在安全风险,因此在生产环境中应该仔细考虑授权策略,只授予用户实际需要的最小权限。

  2. 开启远程访问权限

默认情况下,MySQL用户只能从本地连接。为了允许远程连接,你需要修改MySQL配置文件,并重新启动MySQL服务。

打开MySQL配置文件,一般在/etc/mysql/my.cnf/etc/my.cnf。找到并注释掉或修改如下行:

ini 复制代码
#bind-address = 127.0.0.1

将上述行注释掉或者将127.0.0.1改成服务器的IP地址。然后保存文件。

重启MySQL服务:

bash 复制代码
sudo service mysql restart

请注意,为了安全考虑,最好只允许特定IP地址范围访问MySQL。如果是在生产环境中使用,还应该考虑使用SSH隧道或SSL来加密连接。

补充内容Docker安装MySQL5.7

准备工作
  1. 先准备配置目录和持久化目录,举个栗子:mkdir -p /opt/module/mysql/{conf,data,log}
  2. 准备配置文件*.cnf,放到/opt/module/mysql/conf目录下。
  3. 当然不准备也没事,容器中有个默认配置:/etc/mysql/conf.d/my.cnf
精简版

安装MySQL 5.7 可以通过 Docker 进行,以下是通过 Docker 安装 MySQL 5.7 的基本步骤:

  1. 安装 Docker:

    如果你还没有安装 Docker,请先安装 Docker。你可以在 Docker 官网 上找到适合你操作系统的安装说明。

  2. 拉取 MySQL 5.7 镜像:

    打开终端(命令行界面)并运行以下命令拉取 MySQL 5.7 镜像:

    bash 复制代码
    docker pull mysql:5.7
  3. 运行 MySQL 容器:

    运行以下命令创建并启动一个 MySQL 容器:

    bash 复制代码
    docker run -d --name=mysql-5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=your_password mysql:5.7

    这里,将 your_password 替换为你想要设置的 MySQL root 用户的密码。

    • -d 表示在后台运行容器。
    • --name=mysql-5.7 给容器起一个名字,这里是 mysql-5.7,你可以根据需要更改。
    • -p 3306:3306 将容器的 MySQL 服务端口映射到主机的 3306 端口。
    • -e MYSQL_ROOT_PASSWORD=your_password 设置 MySQL root 用户的密码。
  4. 进入 MySQL 容器:

    如果你想在容器内执行一些 MySQL 命令,可以使用以下命令进入容器:

    bash 复制代码
    docker exec -it mysql-5.7 mysql -uroot -p

    输入你在第 3 步中设置的密码,然后你就可以在容器内使用 MySQL 了。

现在,你已经成功在 Docker 中安装并运行了 MySQL 5.7。请注意,这是一个简单的配置,生产环境中可能需要更多的配置选项,如数据卷、持久化存储等。

🍀进阶版
bash 复制代码
docker run -d -p 3306:3306 --name mysql-5.7 \
-v /opt/module/mysql/conf:/etc/mysql/conf.d \
-v /opt/module/mysql/data:/var/lib/mysql \
-v /opt/module/mysql/log:/var/log/mysql \
--restart=always --privileged=true \
-e MYSQL_ROOT_PASSWORD=root mysql:5.7
  • -d: 表示以后台模式运行容器。
  • -p 3306:3306: 将主机的 3306 端口映射到容器的 3306 端口。
  • --name mysql-5.7: 为容器指定一个名字(mysql-5.7)。
  • -v /opt/module/mysql/conf:/etc/mysql/conf.d:将主机上的 MySQL 配置文件目录 /opt/module/mysql/conf 映射到容器内的 /etc/mysql/conf.d 目录,以便你可以自定义 MySQL 的配置。【容器中MySQL配置文件:/etc/mysql/conf.d/my.cnf
  • -v /opt/module/mysql/data:/var/lib/mysql: 将主机上的 MySQL 数据目录映射到容器内的相应位置。
  • -v /opt/module/mysql/log:/var/log/mysql: 将主机上的 MySQL 日志目录映射到容器内的相应位置。
  • --restart=always: 表示容器在退出时总是重新启动。
  • --privileged=true: 这个选项赋予容器所有的 Linux 的 capabilities,并打开所有的 Linux Security Modules。在一般情况下,最好仅提供容器所需的最小权限。如果没有特殊需求,建议不使用这个选项。
相关推荐
汤姆大聪明3 小时前
Mysql定位慢查询
数据库·mysql
AWS官方合作商5 小时前
从AWS MySQL数据库下载备份到S3的完整解决方案
数据库·mysql·aws
Y第五个季节5 小时前
Docker常见命令
docker
库森学长6 小时前
索引失效的场景有哪些?
后端·mysql·面试
爱做梦Di猪6 小时前
openEuler 22.03 LTS Rootless Docker 安装指南
docker·eureka·openeuler
羊狗狗一只2022年6 小时前
x86上编译jetson nano的docker
运维·docker·容器
Komorebi_99997 小时前
MySQL常用指令
数据库·mysql
叁沐8 小时前
MySQL 17 如何正确地显示随机消息?
mysql
王木风8 小时前
InnoDB 多版本控制 &慢sql排查(基于MySQL 5.7)
数据库·sql·mysql
程序员的世界你不懂10 小时前
CentOS下安装Mysql
mysql·adb·centos