docker 入门到放弃4-- docker容器内启动配置mysql8.0,完成外部访问
目录docker 入门到放弃1----安装、注册、使用并上传自定义镜像docker 入门到放弃2----拉取镜像,安装常用环境并上传docker 入门到放弃3-- docker安装mysql8.0并启动docker 入门到放弃4-- docker容器内启动配置mysql8.0,完成外部访问启动和一些配置更改上篇3其实已经多讲了一点,包括启动后的初始化配置,这里还先以流水账的方...
目录
- docker 入门到放弃1----安装、注册、使用并上传自定义镜像
- docker 入门到放弃2----拉取镜像,安装常用环境并上传
- docker 入门到放弃3-- docker安装mysql8.0并启动
- docker 入门到放弃4-- docker容器内启动配置mysql8.0,完成外部访问
启动和一些配置更改
上篇3其实已经多讲了一点,包括启动后的初始化配置,这里还先以流水账的方式记录下:
grep 'temporary password' /var/log/mysqld.log
mysql -uroot -pos9.ReNe%M=+
已经在容器内得到初始密码并进入了mysql之后,注意的地方就是:鉴于没法改动password_policy,就设置了一个包含大写字母、小写字母、数字、和符号的密码,一个都不能少:
mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '密码';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
mysql> set global validate_password_policy = 0;
ERROR 1193 (HY000): Unknown system variable 'validate_password_policy'
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '更强的密码Hl0.';
Query OK, 1 rows affected (0.00 sec)
mysql> update mysql.user set host = '%' where user ='root';
Query OK, 1 rows affected (0.00 sec)
mysql> show global variables like 'port';
mysql> set global validate_password.policy = 0;
mysql> show VARIABLES like "%password%";
mysql> create user 'XXX'@'%' identified by 'XXXXX';
mysql> ALTER USER 'xxx'@'%' IDENTIFIED WITH mysql_native_password BY 'xxxx';
mysql> create user 'barkdata_ro'@'%' IDENTIFIED WITH mysql_native_password BY 'xxxx';
mysql> select user, host, authentication_string, plugin from mysql.user;
...
紧接着还做了如下改动:
vi /etc/my.cnf
把 default-authentication-plugin=mysql_native_password 这一行的注释去掉。当然像上面申请密码的时候加上参数WITH mysql_native_password 也是ok的关键看下面:
mysql_native_password就可以保证低版本的cli也能连接进来啦,否则会报ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: /usr....这样的错误。
接下来开始尝试外部访问
docker inspect feb946fbc663 | grep IP
iptables -t nat -A DOCKER -p udp --dport 3306 -j DNAT --to-destination 172.17.0.2:3306
但是好像并不行,报错 ERROR 1045 (28000): Access denied for user '........;
尝试换方法,看下iptable记录下,下面DOCKER的chain第一行可能是容器创建的时候生成的,或许有影响:
[root@小林のCentos 10:59:08 ~]>13$ docker run -tdi --privileged -p 3306:3306 ab8b3ab25f88 'init;service mysqld start'
81893044d8831e37b7767335ac6488a402aae762623f0350a55c80a691485940
docker: Error response from daemon: driver failed programming external connectivity on endpoint mystifying_rosalind (809044fbefb30e38a2993f01550f1d36b32d4898c703ce5f2b5e4d996f457594): Error starting userland proxy: listen tcp 0.0.0.0:3306: bind: address already in use.
查看3306 确实被这样一个进程占用,可能是虚机原始的mysql:
可能是阿里云的初始进程?尝试换一个端口
[root@小林のCentos 11:00:29 ~]>17$ docker run -tdi --privileged -p 3307:3306 ab8b3ab25f88 'init;service mysqld start'
75dc109529dd0ef5bba2910abcb3bd6739f7e93a9e3b76d79f5e393c06df6a0f
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"init;service mysqld start\": executable file not found in $PATH": unknown.
可能PATH里找不到service 命令吧,查看进程确实没有mysqld服务,于是尝试还是进入容器启动;然而原来docker ps 里的status为Created是没有成功运行的,所以暂时理解成上面那个报错说明容器是有原子性的,run的命令失败了容器创建不成功。
重新只用init创建容器,并进入:
[root@小林のCentos 11:06:26 ~]>23$ docker run -tdi --privileged -p 3307:3306 ab8b3ab25f88 'init'
[root@小林のCentos 11:07:01 ~]>26$ docker exec -it ab05597d5b75 /bin/bash
[root@ab05597d5b75 /]# whereis service
service: /usr/sbin/service
重复上篇的启动和本篇第一部分。之后容器外部和外部网络连接可以成功啦:
或许第一种方式也是因为容器外的3306端口是其他服务接管了才报遮掩的错误,如此看来可能报错Access denied 表示是可以连接上的账号密码错误,不包含端口不通的情况。
然后以上测试的时候发现commit成镜像再重新run容器的时候,数据的配置(包括容器内的/etc/my.cnf)是不保留的,还要重新来一遍,那么下一节,我们来看看能不能容器实现数据持久化,做一个私用的账号权限配置能保存下来的mysql。
隔天换个地方,直接运行docker run -tdi --privileged -p 3306:3306 antony314/centos:v1.4_r init,阿里云安全组打开3306,便可以直接访问到上面的数据库了,数据是持久化的,所以上面一段的结论估计是错的。
杂记下这一小节可能需要用到的命令:
iptables -t nat -A DOCKER -p tcp --dport 3309 -j DNAT --to-destination 172.17.0.2:3306
iptables -t nat -nL --line-number | grep -A 10 DOCKER
iptables -t nat -D DOCKER 1
最后放上需要收藏的文章
更多推荐
所有评论(0)