Docker:构建Mysql 5.7 Docker容器
在许多情况下会用到mysql,每用到一次,都要重新找教程来部署一次,现在构思就是使用docker来创建容器,这样有镜像就可以创建容器。
但是现在面临着一个问题,就是从dockerhub上面拉取下来的mysql5.7的镜像会存在登录不上的问题,到现在还没有解决,还有一个问题就是dockerhub需要梯子才能访问。我们最终的目的就是有一个mysql5.7的镜像,可以从hub中直接拉取,也可以自己创建一个构建出来镜像。
但是自己构建出来的镜像占用了大量的内存空间,差不多有3个g,上传dockerhub都传不上去。
最后决定,使用dockerhub
中oilrmutp57/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、价值文章参考
MySQL Error: : 'Access denied for user 'root'@'localhost'