【问题标题】:How can I access my docker maria db?如何访问我的 docker mariadb?
【发布时间】:2016-01-15 04:58:22
【问题描述】:

我的主要问题是,在我使用命令 docker run --name db -e MYSQL_ROOT_PASSWORD=test -d -p 3306:3306 mariadb 为我的 mariadb 创建了一个 docker 容器后,我如何访问 sql db?

我在某处看到了使用临时(退出后删除容器)容器的解决方案,但再也找不到它了。

我正在搜索类似的命令:sudo docker exec -it [other flags] [command] db

【问题讨论】:

    标签: mysql docker mariadb


    【解决方案1】:

    首先访问集装箱码头

     docker exec -it some-mariadb bash
    

    'some-mariadb' 是 mysql 容器名称

    然后直接使用mysql终端命令访问db

    mysql -u root -p
    

    【讨论】:

      【解决方案2】:

      来自Official Mariadb website

      从容器外部连接到 MariaDB

      如果我们尝试连接到本地主机上的 MariaDB 服务器,客户端将绕过网络并尝试使用本地文件系统中的套接字文件连接到服务器。但是,当 MariaDB 在容器内运行时,这不起作用,因为服务器的文件系统与主机隔离。客户端无法访问容器内的socket文件,所以连接失败。

      因此,必须使用 TCP 建立与 MariaDB 服务器的连接,即使客户端与服务器容器在同一台计算机上运行。

      大多数 MariaDB 镜像(包括官方镜像)都使用 #my.cnf# 文件中的 bind-address 选项禁用了外部 TCP 连接。本指南中使用的 docker 镜像基于 Ubuntu,因此文件位于 /etc/mysql/my.cnf。

      要使用 MariaDB,我们需要编辑配置文件以更改适当的选项,然后重新启动容器。

      在容器内,编辑文件 my.cnf 并检查以 bind-address 开头的行。在行首添加一个哈希以将其注释掉:

      #bind-address            = 127.0.0.1
      

      保存文件。

      当仍在容器内时,将关闭命令发送到 MariaDB。这将关闭服务器并退出到主机:

      mysqladmin -u root -p shutdown
      

      再次启动容器。这次 MariaDB 服务器将启用网络:

      docker start mariadbtest
      

      查找已分配给容器的 IP 地址:

      docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mariadbtest
      

      您现在可以使用与该 IP 地址的 TCP 连接来连接到 MariaDB 服务器。

      强制 TCP 连接

      如上所述在 MariaDB 中启用网络连接后,我们将能够从容器外部连接到服务器。

      在主机上,运行客户端并将服务器地址(“-h”)设置为您在上一步中找到的容器 IP 地址:

      mysql -h 172.17.0.2 -u root -p
      

      这种简单的连接形式应该适用于大多数情况。根据您的配置,可能还需要为服务器指定端口或强制 TCP 模式:

      mysql -h 172.17.0.2 -P 3306 --protocol=TCP -u root -p
      

      集群容器和复制的端口配置

      在不同的 Docker 容器中运行的多个 MariaDB 服务器可以使用 TCP 相互连接。这对于形成 Galera 集群或复制很有用。

      当通过 Docker 运行集群或复制设置时,我们希望容器使用不同的端口。实现这一点的最快方法是将容器端口映射到我们系统上的不同端口。我们可以在创建容器(docker run 命令)时执行此操作,必要时使用 -p 选项多次。例如,对于 Galera 节点,我们将使用类似于以下的映射:

      -p 4306:3306 -p 5567:5567 -p 5444:5444 -p 5568:5568
      

      【讨论】:

        【解决方案3】:

        语法略有不同,ubuntu 18.04 上的 docker 18.05.0-ce:

        sudo docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' db
        

        【讨论】:

        【解决方案4】:

        只有 mysql-client,没有额外的 docker 容器

        在你的主机上安装mysql客户端,

        apt-get install mysql-client
        

        然后使用以下命令访问您的数据库容器。

        mysql -u<user> -p<pass> -h $(docker inspect --format '{{ .NetworkSettings.IPAddress }}' <db-container>)
        

        该命令会自动获取你的 docker 容器的 IP。

        确保将&lt;user&gt;&lt;pass&gt;&lt;db-container&gt; 替换为您各自的值。在你的情况下:

        mysql -uroot -ptest -h $(docker inspect --format '{{ .NetworkSettings.IPAddress }}' db)
        

        您的命令让 mariadb 在标准端口 3306 上运行。如果没有,您必须告诉 mysql 命令新端口。

        【讨论】:

          【解决方案5】:

          从 MySQL 命令行客户端连接到 MariaDB 以下命令启动另一个 mariadb 容器实例并针对您的原始 mariadb 容器运行 mysql 命令行客户端,允许您针对您的数据库实例执行 SQL 语句:

          $ docker run -it --link some-mariadb:mysql --rm mariadb sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$MYSQL_ENV_MYSQL_ROOT_PASSWORD"'
          

          ...其中 some-mariadb 是原始 mariadb 容器的名称。

          关于 MySQL 命令行客户端的更多信息可以在 MySQL 文档中找到

          参考:https://hub.docker.com/_/mariadb/

          【讨论】:

          • 试图运行它但得到来自守护进程的错误响应:无法链接到 /myappwonkhedev-mysql,因为它不属于默认网络。命令:容器名称是 'myappwonkhedev-mysql' docker run -it --link myappwonkhedev-mysql:mysql --rm mariadb sh -c 'exec mysql -h"$MYSQL_PORT_3306_TCP_ADDR" -P"$MYSQL_PORT_3306_TCP_PORT" -uroot -p"$ MYSQL_ENV_MYSQL_ROOT_PASSWORD"' - 任何想法表示赞赏!
          • 你能针对这个问题发一个新帖子吗?
          猜你喜欢
          • 2020-04-22
          • 2017-12-01
          • 1970-01-01
          • 2021-05-05
          • 2021-10-08
          • 2017-10-02
          • 1970-01-01
          • 2020-10-11
          • 1970-01-01
          相关资源
          最近更新 更多