docker中mysq安装
简介
容器内的网络服务,和外部机器不能直接通讯
外部机器智能和宿主机通讯,不能直接和容器通讯
我们在这里把宿主机的3307和容器的3306做一个映射
做完映射之后,访问的路径就会变成下图:访问宿主机的3307就相当于访问容器的3306端口。这里的做法和路由器端口映射很相似。
知道了方法和思路之后,我们现在开始操作。
一、离线安装
1.1 在能联网的机器上执行
docker save -o /home/fairy/app/mysql57.tar mysql:5.7
1.1.1到官网下载
地址:https://dev.mysql.com/downloads/mysql/
1.2 上传
把/home/fairy/app/mysql57.tar文件上传到无法上网的机器上
然后执行:
docker load -i /root/Downloads/mysql57.tar
1.3 启动mysql
docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
命令的含义:
docker run:在docker中启动一个容器实例
-d:该容器在后台运行
-p 3306:3306:容器与主机映射端口为,主机3306,容器3306
--name mysql:容器运行后的名称
-v /root/mydata//mysql/log:/var/log/mysql:将容器/var/log/mysql目录下的数据,备份到主机的 /root/mydata//mysql/log目录下
-v /root/mydata//mysql/data:/var/lib/mysql:将容器/var/lib/mysql目录下的数据,备份到主机的 /root/mydata//mysql/data目录下
-v /root/mydata//mysql/conf:/etc/mysql:将容器/etc/mysql目录下的数据,备份到主机的 mysqldata/mysql/conf目录下
-e MYSQL_ROOT_PASSWORD=root:设置当前mysql实例的密码为root
mysql:5.7:需要运行的容器名称以及版本号
通过此处-v 命令备份后(-v是进行目录映射),就算当前mysql容器实例被删除,那么再次重启mysql容器后,数据将会自动重主机加载到容器当中
二、在线安装
2.1 在安装好docker的linux中执行命令
拉取mysql最新版本 docker pull mysql
拉取mysql指定版本
docker pull mysql:版本号
docker pull mysql:5.7 查看本地是否存在 docker images
2.2 创建数据卷
1:创建一个卷
docker volume create mysql-vol
备注:默认情况下 ,Docker 创建的数据卷为 local 模式,仅能提供本主机的容器访问。
删除数据卷的命令:
docker volume rm mysql
2:查看卷 所有的卷都在目录/var/lib/docker/volumes下
> docker volume ls
3:查看卷的详细信息,是为了去得知tomcat的安装目录
> docker volume inspect mytomcat-vol
4:创建一个mysql的目录挂载和卷的映射
-
带数据卷模式:宿主机目录 --> 数据卷 ---> 容器内目录(我们不清楚目录在哪里,需要去官网查找)
-
直接挂载模式:宿主机目录 ---> 容器内目录(我们自己创建的目录,自己清楚!后期好修改、维护)
使用 -v 命令
# 方式一
# 指定net网络模式:docker run -it -v 宿主机绝对路径目录:容器内目录 镜像名
docker run -di --net="host" --name=mysql -p 3036:3036 -e MYSQL_ROOT_PASSWORD=123456 mysql:latest
备注:使用 -v 的方式指定容器内需要被持久化的路径,Docker 会自动为我们创建卷,并且绑定到容器中
方式二、默认net网络模式
docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
参数说明:
- -p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3306 访问到 MySQL 的服务。
- MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。
************************************************
方式三、挂载方式(默认net网络模式)
sudo docker run -itd --privileged=true \
-p 3306:3306 --name mysql \
-v /root/mydata/mysql/log:/var/log/mysql \
-v /root/mydata/mysql/data:/var/lib/mysql \
-v /root/mydata/mysql/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql:5.7
方式四、挂载方式(默认net网络模式)
挂在到当前目录
上述命令的含义:
-v $PWD/data:/var/lib/mysql $PWD 可以获取当前的路径,$PWD/data:/var/lib/mysql 表示把当前路径下的data目录挂载到容器里面的/var/lib/mysql
-v $PWD/my.cnf:/etc/mysql/my.cnf
-v $PWD/mysql-files:/var/lib/mysql-files
上述命令的含义: docker run:在docker中启动一个容器实例 -d:该容器在后台运行 -p 3306:3306:容器与主机映射端口为,主机3306,容器3306 --name mysql:容器运行后的名称 -v /root/root/mydata/mysqllog:/var/log/mysql:将容器/var/log/mysql目录下的数据,备份到主机的 /root/mydata//mysql/log目录下 -v /root/root/mydata/mysqldata:/var/lib/mysql:将容器/var/lib/mysql目录下的数据,备份到主机的 /root/mydata//mysql/data目录下 -v /root/root/mydata/mysqlconf:/etc/mysql:将容器/etc/mysql目录下的数据,备份到主机的 mysqldata/mysql/conf目录下 -e MYSQL_ROOT_PASSWORD=root:设置当前mysql实例的密码为root--restart=always -> 开机启动容器,容器异常自动重启
通过此处-v 命令备份后(-v是进行目录映射),就算当前mysql容器实例被删除,那么再次重启mysql容器后,数据将会自动重主机加载到容器当中
方式五、创建网络
docker network create my-network
通过自建网络,实现docker内各容器通信
docker run -dit --name mysql --restart=always \
-p 3306:3306 \
-e TZ=Asia/Shanghai \
--network=my-network \
-e MYSQL_ROOT_PASSWORD=Wtf13579. \
-v /usr/local/dockerdata/mysql/log:/var/log/mysql \
-v /usr/local/dockerdata/mysql/data:/var/lib/mysql \
-v /usr/local/dockerdata/mysql/conf:/etc/mysql/conf.d \
-d mysql:5.7 \
2.2 创建配置文件
切换到上述命令配置的主机/root/mydata//mysql/conf目录下
cd /root/mydata//mysql/conf
#创建 my.cnf文件
touch my.cnf
使用vim命令对 my.cnf文件添加如下内容,
在docker中安装的mysql默认字符集是latin1,需要改成utf8
[client] default_character_set=utf8 [mysqld] collation_server = utf8_general_ci character_set_server = utf8
mysql8.0.26配置文件
[mysqld] pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql secure-file-priv= NULL # Custom config should go here !includedir /etc/mysql/conf.d/ [mysqld] user=mysql #服务端口号 默认3306 port=3306 #忽略表名大小写 lower_case_table_names=1 character-set-server=utf8 #密码加密 default_authentication_plugin=mysql_native_password secure_file_priv=/var/lib/mysql expire_logs_days=7 #mysql8会有group by 报错这样可以避免 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION max_connections=1000 [client] default-character-set=utf8 [mysql] default-character-set=utf8 [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4
重启mysql容器实例,让刚才的配置文件生效
docker restart mysql
#查看是否启动成功
docker ps
注意:
修改my.cnf权限:使其只有root/当前用户有读写权,其他用户只有读的权限
chmod 644 my.cnf
2.3 运行mysql
修改权限密码方式
① 进入mysql容器 docker exec -it mysql /bin/bash
② 登录mysql(PS:密码123456) mysql -u root -p
③ 执行修改脚本 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; flush privileges;
备注:
##创建一个user用户,密码为123456 CREATE USER 'user'@'%' IDENTIFIED BY '123456';
##给user用户赋予数据库的所有权限 GRANT ALL PRIVILEGES ON *.* TO 'user'@'%';
##刷新用户 flush privileges;
配置远程权限:
用root用户登陆,然后:
grant all privileges on *.* to 创建的用户名 @"%" identified by "密码";
flush privileges; * 刷新刚才的内容*
参数说明:
格式:grant 权限 on 数据库名.表名 to 用户@登录主机 identified by "用户密码";
@ 后面是访问mysql的客户端IP地址(或是 主机名) % 代表任意的客户端,如果填写 localhost
为本地访问(那此用户就不能远程访问该mysql数据库了)。同时也可以为现有的用户设置是否具有远程访问权限。
撤权并删除用户:
要取消一个用户的权限,使用REVOKE语句。REVOKE的语法非常类似于GRANT语句,除了TO用FROM取代并且没有INDETIFED BY和WITH GRANT OPTION子句:
REVOKE privileges (columns) ON what FROM user
user部分必须匹配原来GRANT语句的你想撤权的用户的user部分。privileges部分不需匹配,你可以用GRANT语句授权,然后用REVOKE语句只撤销部分权限。
REVOKE语句只删除权限,而不删除用户。即使你撤销了所有权限,在user表中的用户记录依然保留,这意味着用户仍然可以连接服务器。
要完全删除一个用户,你必须用一条DELETE语句明确从user表中删除用户记录:
DELETE FROM user WHERE User=’user_name’ and Host=’host_name’;
FLUSH PRIVILEGES;
说明:
DELETE语句删除用户记录,而FLUSH语句告诉服务器重载授权表。(当你使用GRANT和REVOKE语句时,表自动重载,而你直接修改授权表时不是。)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统