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

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

  • 相关阅读:
    hdu 1290 献给杭电五十周年校庆的礼物 (DP)
    hdu 3123 GCC (数学)
    hdu 1207 汉诺塔II (DP)
    hdu 1267 下沙的沙子有几粒? (DP)
    hdu 1249 三角形 (DP)
    hdu 2132 An easy problem (递推)
    hdu 2139 Calculate the formula (递推)
    hdu 1284 钱币兑换问题 (DP)
    hdu 4151 The Special Number (DP)
    hdu 1143 Tri Tiling (DP)
  • 原文地址:https://www.cnblogs.com/smartrui/p/13825076.html
Copyright © 2011-2022 走看看