zoukankan      html  css  js  c++  java
  • 刚用Docker,就让我翻车了

    上次用Docker安装Mysql8的时候,还说要以后的环境尽量用Docker来搞,没想到这次因为一个小小的改动,就让我在Docker面前翻车了,哎,真是流下了没有技术的泪水。

    原由

    事情是这样的,项目中用到了Mysql8group by查询,结果Mysql8直接给我报一个错,大概意思就是你查询的字段未出现在group by中是不行的。那这个时候就只能改sql_mode这个模式了,去掉 NOLY_FULL_GROUP_BY这个了。本来也是很简单的事,但上次安装Mysql8的时候,那个配置文件没有挂上,所以这个时候就没法通过宿主机来修改配置让容器生效了,我也不可能去直接改容器呀,毕竟容器重启后又复原了。

    于是在网上找到可以修改已运行容器的挂载目录的方法,不过,我试了几次没有成功,所以就没有继续了,这里,我把如何修改目录简单的说下。

    网上大部分都是Linux方面的修改,Macos不太好找,费了一些时间后找到了一篇,所以我这里的修改是基于Macos的,不过,Linux的也差不多,相对来说,Linux还要简单些。

    挂载目录修改

    一 停止容器,然后找到你要修改容器的容器id,用inspect

    $ docker stop mysql8
    $ docker inspect mysql8 
    [
        {
            "Id": "37bcead3d1b17e2d3674ebde40f3d234743366895ca258395abbb30e6ffede6e",
            "Created": "2020-10-02T09:15:44.202160714Z",
            "Path": "docker-entrypoint.sh",
            "Args": [
                "mysqld"
            ],
    

    找到里面的Id的值,记录一下,一会修改容器的时候会用到。

    二 进入容器目录

    进入Docker的data目录,这个目录可以在安装的Docker软件Preferenceadvanced下的disk image pah找到.

    也可以用ps来找

    $ ps -u XXXX | grep docker
    /Users/XXXX/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux
    

    然后进入到amd64-linux这个目录,你会发现有一个tty文件,我们可以通过这个文件登录到Docker内部的linux:

    $ screen tty
    

    注:Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

    通过screen后,我们进入到容器内部了,然后就可以修改挂载了

    在虚拟linux系统中

    $ vi /var/lib/docker/containers/{容器id}/config.v2.json
    $ vi /var/lib/docker/containers/{容器id}/hostconfig.json
    

    容器id是你第一步的时候查出的要修改的那个Id值。

    然后就可以修改hostconfig.json这个文件的Binds字段的值,

    config.v2.json这个文件的 MountPoints字段的值。

    修改完成后,记得用:w保存。

    退出Linux(重要)

    这一步很重要,按Ctrl+A+D,退出screen命令。然后,使用screen -ls命令,查看当前会话:

    $ screen -ls
    There is a screen on:
        41557.ttys004.YandeMacBook-Pro  (Detached)
    1 Socket in /var/folders/d0/y2ythxgd2p54y1p46bv90wpm0000gn/T/.screen.
    
    使用kill命令杀死会话:
    $ kill -9 41557
    
    退出会话:
    $ screen -wipe
    There is a screen on:
        41557.ttys004.YandeMacBook-Pro  (Removed)
    1 socket wiped out.
    No Sockets found in /var/folders/d0/y2ythxgd2p54y1p46bv90wpm0000gn/T/.screen.
    

    重启docker(重要)

    必须重启,也很重要,否则配置文件内容还是会被还原,我就是因为忘记了,造成改了一直不生效

    注意是重启你的Docker软件,不是Docker容器镜像。

    重启容器

    经过上面的步骤,可以重启容器看看修改对了没,也可以用 docker inspect来查看你的更改生效了没。

    凡正我折腾了好久不行,我就不继续了,我把数据库备份了下后,我重新又生成了一个新的容器,没想到在生成新容器中也碰到了些问题。

    生成新容器

    重新用docker run生成

    docker run -p 3307:3306 --name mysql8 -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql     -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0
    

    执行后,没有啥报错,以为成功了,用docker ps查看了下,竟然没有输出,也就是说容器没有启动起来,没理由的呀,上次我就是用的这个命令,唯一的不同就是配置文件/etc/mysql这个开始是错的,现在改成正确的了。

    这就有意思了,错误的目录可以,搞成正确的目录竟然不行,于是我就把那个-v对应的目录挨个试,发现只有加上 /etc/mysql这个目录就不行了,其它的都能正常启动,在此期间更改目录的权限,改所属等,删了又建,建了又删,没想到正是因为这里的这些删除操作造成了后面的麻烦,这个后面我再说。

    说回一加上正确配置就不能启动的问题,试了好多次后没办法了,那就在网上找找方法吧,找来找去找到的也都是这些方法,而且好多文章都差不多,我都严重怀疑他们真的这样操作是可以的。

    无意间想到容器应该有日志,于是用docker log来看看容器日志有啥输出,执行后果然里面有一个报错,意思是如果你要挂外部配置,那么mysql-files也需要挂上去的,于是加上-v $PWD/mysql-files:/var/lib/mysql-files ,把mysql-files也挂上去。

    执行完后,容器倒是能启动了,满以为这次可以了,可是在进入容器后,用上面的密码登录mysql竟然登不上,然后直接用无密码又能登录了,下意识的觉得又出状况了。

    仔细查看上面的命令,确认没问题呀,而且容器也能启动,按理说不会有问题的,查来查去,后面发现那个配置文件有点不太对,挂载配置文件时,宿主机的文件要先生成,于是把容器的文件拷过来.

    $ docker cp mysql8:/etc/mysql/my.cnf  /data/application/conf/my.cnf
    $ docker cp mysql8:/etc/mysql/conf.d  /data/application/conf/conf.d
    

    然后又是删容器,建立容器,这次也正常,也能生成能启动,于是进入容器

    $docker exec -it mysql88 /bin/bash
    

    可是结果还是一样,只能无密码登录,看来还是有问题。

    没法,重新建,这次我不挂载任何目录,挂一个建一个,一个个的试,没想到建立的这些容器无密码登录不可以,也就是说还是某个目录不对呀,想到Mysql的授权应该在数据表中,于是我把挂载的data和其它目录都删除了,然后把所有的挂载目录加上,重新建一个容器,成功后进入容器,这次用123456的密码就能登录了,无密码的不行了,到这里总算解决了。

    没想到这么一个小问题,断断续续的折腾了这么久,最后的惊喜竟然是这样的,我想主要原因还是因为在删除和建立容器的时候,一直用的是那几个挂载目录,也没有删除,所以在某些时候可能影响了,造成了这些问题。

    总结

    docker log 命令很有用,通过这个可以看容器的一些日志,对解决问题起很大的作用,我开始就是没想到这个,浪费了好多时间。

    挂载目录时,如果可能,删除了新建,不然可能会有莫名其妙的问题。

  • 相关阅读:
    IE input X 去掉文本框的叉叉和密码输入框的眼睛图标
    vue监听滚动事件 实现某元素吸顶或者固定位置显示
    判断滚动条到底部的JS逻辑
    vue plugin 插件编写以loading为例
    Maven使用yuicompressor-maven-plugin打包压缩css、js文件
    AngularJS 用 Interceptors 来统一处理 HTTP 请求和响应
    jQuery mouseover与mouseenter,mouseout与mouseleave的区别
    angular内ng存在属性是专门用来解决跨域问题的,$sce
    dede上怎么让所有链接在新窗口打开
    dede文章页调用当前栏目链接方法
  • 原文地址:https://www.cnblogs.com/smartrui/p/13825076.html
Copyright © 2011-2022 走看看