【问题标题】:How to connect to mysql docker container on a remote host from mysql workbench?如何从 mysql 工作台连接到远程主机上的 mysql docker 容器?
【发布时间】:2021-02-02 12:49:38
【问题描述】:

我已经在我拥有的远程计算机上设置了一个运行 mysql 实例的 docker 容器。在过去,这不是问题,但由于某种原因,我现在无法让它工作。我不确定问题可能是什么。我正在使用 docker compose,即使容器正在运行,我似乎也无法通过另一台计算机上的 mysql 工作台进行连接。这是我的详细信息:

docker-compose.yaml

version: '3.7'

services:

  api:
    image: api
    restart: unless-stopped
    container_name: api
    build: ./node/
    ports:
      - 3008:3008
      
  mysql:
    image: mysql
    restart: unless-stopped
    container_name: mysql
    environment:
      MYSQL_DATABASE: pitapaldb
      MYSQL_USER: user
      MYSQL_PASSWORD: password
      MYSQL_ROOT_PASSWORD: password
    build: ./database/
    ports:
      - 3306:3306
      
networks:
  default:
    external:
      name: my-net

数据库/Dockerfile

FROM mysql
COPY init.sql /docker-entrypoint-initdb.d

数据库/init.sql

CREATE DATABASE mydb;
USE mydb;
SET SQL_SAFE_UPDATES = 0;

ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY 'password';
flush privileges;


CREATE TABLE carts (
  id int PRIMARY KEY AUTO_INCREMENT,
  lat float,
  lon float,
  address varchar(255),
  status boolean,
  city_id int
);

容器肯定在运行:

CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS                          PORTS                                                              NAMES
784cf75183f4        mysql                                    "docker-entrypoint.s…"   2 minutes ago       Up About a minute               0.0.0.0:3306->3306/tcp, 33060/tcp                                  mysql

但是当我尝试通过工作台连接时,我得到“无法连接”。我用密码password 尝试了用户名userroot。我使用的 IP 地址肯定可以工作,因为我可以通过它运行其他服务,没有问题:

【问题讨论】:

  • 所以我建议您首先检查一下您的 MySQL 是否配置为允许外部连接。那将是您的 MySQL 配置文件中的 bind_address 参数,它应该设置为 *0.0.0.0。检查后,验证您创建的用户是否设置为从任何位置访问您的数据库,因此对于您的根用户,它应该是'root'@'%',请参阅此处的文档Connection access
  • 是否可以在 docker-compose 或 init.sql 文件中设置这些选项?
  • 是的,在 docker compose 的环境部分,您可以添加变量:MYSQL_ROOT_HOST: '%',您可以添加一个名为命令的新部分,如下所示:command: ["mysqld", "--bind_addresss=0.0.0.0"] 不确定绑定地址是否会工作,但值得一试。

标签: mysql docker docker-compose containers mysql-workbench


【解决方案1】:

@LoF10 以下是要检查的快速列表:

  1. 你能在运行 MySQL docker 的机器上连接到 docker 网络吗?一个简单的测试方法是在远程机器上运行如下命令: docker run --rm -it --network my-net mysql:5.7 mysql -h mysql -uroot -ppassword 如果没有,您的 MySQL 配置、MySQL 数据或容器的初始化可能存在问题。这些是@JorgeCampos 建议您验证的内容。由于您是直接从 MySQL 的 Docker Hub entry 中提取的,因此应该正确设置配置以允许远程连接。如果好,继续。仅供参考,如果您在终端上看到mysql>,您将知道您已成功连接。退出:\q
  2. 你能在运行 MySQL docker 的机器的本地主机上的暴露端口上连接吗?一个简单的测试方法是在远程机器上运行如下命令: docker run --rm -it --network host mysql:5.7 mysql -h 127.0.0.1 -uroot -ppassword 确保使用上面使用的 IP 和NO localhost。这是因为 MySQL 客户端通过在本地查找 mysqld 对“localhost”关键字进行了特殊处理。使用 127.0.0.1 强制 MySQL 通过正确的套接字连接进行连接。如果您无法连接,则将容器的端口映射到您的主机时存在问题。如果好,请继续。
  3. 假设两台机器在同一个网络上,并且有 MySQL Workbench 的机器也有 docker,你可以使用运行 MySQL 容器的机器的 IP 进行连接吗? 10.0.0.4?一个简单的测试方法是在远程机器上运行如下命令: docker run --rm -it mysql:5.7 mysql -h 10.0.0.4 -uroot -ppassword 如果没有,您可能需要验证是否可以:
  • ping 10.0.0.4 机器
  • 是否有任何防火墙规则阻止其正确暴露于网络。这通常发生在 Windows 的默认防火墙中...
  • 如果在 AWS 上,有很多 reasons 如果已正确分配公共端口,例如,您可能无法访问它。安全组、路由表、互联网网关等

一旦您能够从上面的3 继续操作,那么您应该能够按照您的描述使用 MySQL Workbench 进行连接。

希望这些帮助。任何更详细的建议都需要您分享有关本地网络设置(操作系统、物理/虚拟、如何确定 IP 等)的更多信息。

【讨论】:

    猜你喜欢
    • 2018-11-05
    • 2017-06-13
    • 2016-01-05
    • 2020-10-20
    • 2021-06-05
    • 2015-11-28
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多