Skip to content

Docker:构建Mysql 5.7 Docker容器

About 1339 wordsAbout 4 min

dockermysql5.7docker容器构建

2024-02-20

在许多情况下会用到mysql,每用到一次,都要重新找教程来部署一次,现在构思就是使用docker来创建容器,这样有镜像就可以创建容器。

但是现在面临着一个问题,就是从dockerhub上面拉取下来的mysql5.7的镜像会存在登录不上的问题,到现在还没有解决,还有一个问题就是dockerhub需要梯子才能访问。我们最终的目的就是有一个mysql5.7的镜像,可以从hub中直接拉取,也可以自己创建一个构建出来镜像。

但是自己构建出来的镜像占用了大量的内存空间,差不多有3个g,上传dockerhub都传不上去。

最后决定,使用dockerhuboilrmutp57/mysql5.7镜像作为底座来实现

1、直接拉取oilrmutp57/mysql5.7镜像

1、拉取镜像:docker pull oilrmutp57/mysql5.7:1.1

2、我们有镜像了,我们需要根据这个镜像来创建容器:docker run -it --name mysql5.7 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 oilrmutp57/mysql5.7:1.1,虽然我这里添加了MYSQL_ROOT_PASSWORD的参数,但是根据123456的密码还是登录不了数据库。

下面我简单说一下排错的过程。

2、使用oilrmutp57/mysql5.7镜像运行容器

我们在上面创建出来一个mysql5.7的容器,但是我们现在登录不上去,这个时候执行下面操作

参考: MySQL Error: : 'Access denied for user 'root'@'localhost'

1、编辑/etc/my.cnf或者/etc/mysql/my.cnf文件。

2、在[mysqld]下面添加skip-grant-tables参数,如下方设置。

[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
default_authentication_plugin = mysql_native_password
character-set-server = utf8
collation-server = utf8_general_ci
init-connect='SET NAMES utf8'
skip-character-set-client-handshake
max_allowed_packet=500M
skip-grant-tables

3、然后重启mysql服务,这里可以service mysql restart, 也可以docker restart mysql5.7直接重启容器

4、重启之后,然后使用mysql -uroot -p随便输入一个密码进入到mysql的命令行模式, 输入flush privileges;

5、这个时候可能会没有root这个用户,可以use mysql; select host, user from user; 查看是否存在,如果不存在就需要新建一个root。

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select host, user from user;
+-----------+---------+
| host      | user    |
+-----------+---------+
| %         | dengc4r |
| localhost | root    |
+-----------+---------+
2 rows in set (0.01 sec)

6、最初我这里是没有任何用户的,所以我们需要创建一个root用户,并给root赋权。

mysql> CREATE USER 'root'@'localhost' IDENTIFIED BY 'newpassword';  # 创建root

但是你可能会发现你创建不了,因为你给出的密码不符合mysql的策略, 默认情况下密码必须大于8位、包含数字、大小写字母、特殊字符, 可以参考MySQL5.7修改默认root密码

创建用户可以用create user 'root'@'localhost' ...,也可以用create user 'root'@'%'..来创建,他们俩之间有什么区别呢?

localhost只能不能登录, % 任何客户机都能登录(不安全,可以在创建用户时指定ip), 注意'root'@'localhost''root'@'%'是两个不同的用户。

7、给root用户授予所有权限。

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; #赋予所有库所有表操作权限
mysql> flush privileges;
mysql> exit;

8、授权之后记得把my.cnf里面skip-grant-tables删掉,不然很容易被勒索。

8、最后在重启一下容器。

3、创建cityhub/mysql5.7:latest镜像并上传到dockerhub

因为我们这里没有对容器进行修改, 我们直接将原始的镜像推到dockerhub上面, 如果有修改, 可以将容器构建成镜像在提交.

(base) ~ docker login -u cityhub  # 这里需要输入personal access token,如果登录不上可以参考https://docs.docker.com/go/access-tokens/
(base) ~ docker tag 5089d76b7273 cityhub/mysql5.7:latest
(base) ~ docker push cityhub/mysql5.7:latest

这样的话,我们就把镜像推到了dockerhub上面,就可以在其他的地方使用 docker pull cityhub/mysql5.7

root@iZ2vc34h4mxsxearc36g2yZ:/home/dengc4r# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
cityhub/mysql5.7      v0.0.1    5949450473b2   5 weeks ago     3.09GB
cityhub/self_ubuntu   v0.1.1    174c8c134b2a   2 months ago    77.9MB
cityhub/mysql5.7      latest    5089d76b7273   20 months ago   749MB

我们在其他的服务器上面docker images可以看到,我之前自己构建的mysql5.7占用3.09G,新上传的mysql5.7只有749M,大大的减少内存占用。

今天2024年9月22号,需要部署一个mysql,就用到了自己提交的镜像。

docker run --name ph_mysql5.7 -p 3306:3306 -itd cityhub/mysql5.7

但是这里有一个问题,就是没有办法通过run命令来创建root账户的密码,这个是需要调整的一个内容。

4、过程中疑问点解惑

1、这个镜像是基于什么系统创建的?

root@8fb12e8f7641:/# cat /etc/issue
Debian GNU/Linux 10 \n \l

基于debian创建的,自己对这个系统不是很熟,后面完善。

2、创建了mysql用户如何删除?

drop user 'user'@'localhost';

5、价值文章参考

linux安装Mysql5.7

【MySql】解决mysql没有root用户问题

MySQL Error: : 'Access denied for user 'root'@'localhost'

MySQL5.7修改默认root密码

Linux查看系统基本信息,版本信息(最全版)

MySQL数据库——MySQL删除用户(DROP/DELETE USER)

How to fix MySQL --skip-grant-tables ERROR 1290

Changelog

Last Updated: View All Changelog
  • feat(wiki): hammeSpoon: 复制出来的文件需要重新生成永链

    On 3/27/25

求求了,快滚去学习!!!

求求了求求了,快去学习吧!

【题单】贪心算法

不知道方向的时候,可以多看看书,书会给你指明下一步该干什么,加油!