暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Docker中玩转MySQL

万能修实验室 2021-07-14
1334


关于数据库是否适合放在容器里运行,一直备受争议。
小马过河的故事从小听到大:与其听别人OOXX,不如自己试下。


目前比较官方的 MySQL Docker库有两个:

  • 1 由Docker团队维护,通过运行mysql:latest即可使用。

  • 2 由Oracle的MySQL团队维护,使用docker run mysql/mysql-server:latest语法使用。


在以下示例中,将使用Oracle提供的Docker映像,并且只搭建单实例。由于基本都是默认参数,建议仅用于测试开发环境。


参考:

https://www.percona.com/blog/2019/11/19/installing-mysql-with-docker/


如果要使用复制功能,建议用这个 DBDeployer

(https://github.com/datacharmer/dbdeployer)




在Docker运行MySQL


# 1、使用Docker安装最新的MySQL版本

    docker run --name mysql-latest  \
    -p 3306:3306 -p 33060:33060 \
    -e MYSQL_ROOT_HOST='%' -e MYSQL_ROOT_PASSWORD='strongpassword' \
    -d mysql/mysql-server:latest
    复制


    # 2、连接到MySQL
    通过Docker Run启动MySQL命令行:

      docker exec -it mysql-latest mysql -uroot -pstrongpassword
      复制


      也可以启动MySQL Shell:

        docker exec -it mysql-latest mysqlsh -uroot -pstrongpassword
        复制



        管理Docker中的MySQL


        # 停止

          docker stop mysql-latest
          复制


          # 启动

            docker start mysql-latest
            复制


            # 如遇到问题时,排查日志

              docker logs mysql-latest
              复制


              # 重新创建一个新的Docker容器

                docker stop mysql-latest
                docker rm mysql-latest
                docker run XXXXX
                复制


                # 将配置参数传递给Docker容器中的MySQL中

                  docker run --name mysql-latest  \
                  -p 3306:3306 -p 33060:33060 \
                  -e MYSQL_ROOT_HOST='%' -e MYSQL_ROOT_PASSWORD='strongpassword' \
                  -d mysql/mysql-server:latest \
                  --innodb_buffer_pool_size=256M \
                  --innodb_flush_method=O_DIRECT \
                  复制


                  我的测试


                  针对不同版本,各自建立一个MySQL:

                    # 5.6最新版,端口3306
                    docker run --name mysql-5.6 \
                    -p 3306:3306 -p 33060:33060 \
                    -e MYSQL_ROOT_HOST='%' -e MYSQL_ROOT_PASSWORD='strongpassword' \
                    -d mysql/mysql-server:5.6
                    复制


                      # 5.6最新版,端口3307
                      docker run --name mysql-5.7 \
                      -p 3307:3306 -p 33070:33060 \
                      -e MYSQL_ROOT_HOST='%' -e MYSQL_ROOT_PASSWORD='strongpassword' \
                      -d mysql/mysql-server:5.7
                      复制

                       

                        # 8.0最新版,端口3308
                        docker run --name mysql-8.0 \
                        -p 3308:3306 -p 33080:33060 \
                        -e MYSQL_ROOT_HOST='%' -e MYSQL_ROOT_PASSWORD='strongpassword' \
                        -d mysql/mysql-server:8.0
                        复制


                        启动吧:

                          docker start mysql-5.6
                          docker start mysql-5.7
                          docker start mysql-8.0
                          复制


                          确认已都启动:

                            [root@bogon ~]# docker ps
                            CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
                            ec29909cd6d7 mysql/mysql-server:8.0 "/entrypoint.sh mysq…" 27 seconds ago Up 26 seconds (health: starting) 0.0.0.0:3308->3306/tcp, 0.0.0.0:33080->33060/tcp mysql-8.0
                            cb10ba336663 mysql/mysql-server:5.7 "/entrypoint.sh mysq…" About a minute ago Up About a minute (healthy) 0.0.0.0:3307->3306/tcp, 0.0.0.0:33070->33060/tcp mysql-5.7
                            aae85c630200 mysql/mysql-server:5.6 "/entrypoint.sh mysq…" About a minute ago Up About a minute (healthy) 0.0.0.0:3306->3306/tcp, 0.0.0.0:33060->33060/tcp mysql-5.6
                            70a1cc61129a percona/pmm-server:2 "/opt/entrypoint.sh" 5 weeks ago Up 9 days 0.0.0.0:443->443/tcp, 0.0.0.0:2019->80/tcp pmm-server
                            复制

                            这样在几分钟内,就搞定了3个不同版本的数据库。


                            连进去看看,是想象中的版本:

                              # 5.6
                              docker exec -it mysql-5.6 mysql -uroot -P3306 -pstrongpassword


                              mysql> \s
                              --------------
                              mysql  Ver 14.14 Distrib 5.6.46, for Linux (x86_64) using  EditLine wrapper
                              Connection id: 6
                              Current database:
                              Current user: root@localhost
                              SSL: Not in use
                              Current pager: stdout
                              Using outfile: ''
                              Using delimiter: ;
                              Server version: 5.6.46 MySQL Community Server (GPL)
                              复制
                                # 5.7
                                docker exec -it mysql-5.7 mysql -uroot -P3307 -pstrongpassword


                                mysql> \s
                                --------------
                                mysql Ver 14.14 Distrib 5.7.28, for Linux (x86_64) using EditLine wrapper


                                Connection id: 7
                                Current database:
                                Current user: root@localhost
                                SSL: Not in use
                                Current pager: stdout
                                Using outfile: ''
                                Using delimiter: ;
                                Server version: 5.7.28 MySQL Community Server (GPL)
                                复制
                                  # 8.0
                                  docker exec -it mysql-8.0 mysql -uroot -P3308 -pstrongpassword


                                  mysql> \s
                                  --------------
                                  mysql Ver 8.0.18 for Linux on x86_64 (MySQL Community Server - GPL)


                                  Connection id: 12
                                  Current database:
                                  Current user: root@localhost
                                  SSL: Not in use
                                  Current pager: stdout
                                  Using outfile: ''
                                  Using delimiter: ;
                                  Server version: 8.0.18 MySQL Community Server - GPL
                                  复制


                                  测试下,其实速度还是可以的。


                                  由于启动的基本都是默认参数,那么可以把自己的参数文件也导入到容器中的数据库运行:

                                  # 当前隔离级别为默认的RR:

                                    [root@bogon mysql_cnf]# docker exec -it mysql-5.7 mysql -uroot -P3307 -pstrongpassword


                                    mysql> show variables like '%iso%';
                                    +-----------------------+-----------------+
                                    | Variable_name | Value |
                                    +-----------------------+-----------------+
                                    | transaction_isolation | REPEATABLE-READ |
                                    | tx_isolation | REPEATABLE-READ |
                                    +-----------------------+-----------------+
                                    复制


                                    # 复制容器中的配置文件到本地:

                                      docker cp mysql-5.7:/etc/my.cnf ./
                                      复制


                                      # 修改本地配置文件

                                        vi my.cnf
                                        # 加一个参数试试
                                        transaction_isolation = READ-COMMITTED
                                        复制


                                        # 复制本地my.cn 到容器库

                                          docker cp ./my.cnf  mysql-5.7:/etc/
                                          复制


                                          # 重启数据库

                                            docker restart mysql-5.7
                                            复制


                                            # 隔离级别已变成RC

                                              [root@bogon mysql_cnf]# docker exec -it mysql-5.7 mysql -uroot -P3307 -pstrongpassword


                                              mysql> show variables like '%iso%';
                                              +-----------------------+----------------+
                                              | Variable_name | Value |
                                              +-----------------------+----------------+
                                              | transaction_isolation | READ-COMMITTED |
                                              | tx_isolation | READ-COMMITTED |
                                              +-----------------------+----------------+
                                              复制


                                              容器的出现,简化了很多繁琐的操作,就像把大象放冰箱里一样,几步就可以搞定,甚至可以搭建一套复杂环境自己打包。


                                              但是由于万能修先生的docker水平十分有限,基本属于现学现卖、现用现查级别,更多的玩儿法等着小伙伴们来发掘吧。


                                              冰箱门已经打开,PP不要着凉




                                              最后推荐一个美剧,星战迷不要错过。周末愉快



                                              文章转载自万能修实验室,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                              评论