【问题标题】:How to run a MySQL command terminal in Docker, with a docker-compose server如何使用 docker-compose 服务器在 Docker 中运行 MySQL 命令终端
【发布时间】:2020-05-12 09:01:23
【问题描述】:

假设我有以下撰写文件:

networks:
  my_network:

services:

  ...

  mysql:
    container_name: "mysql"
    image: "mysql:5.7"
    volumes:
      - ./mysql.cnf:/etc/mysql/conf.d/mysql.cnf
    environment: 
      MYSQL_ROOT_PASSWORD: "password"
      MYSQL_USER: "user"
      MYSQL_PASSWORD: "password"
      MYSQL_DATABASE: "test-db"
    ports:
      - "3306:3306"
    restart: always
    networks: 
      - my_network

一旦我运行docker-compose up,我的服务就会启动,我可以看到我的 MySQL 服务器已准备好接受连接。现在我需要做什么才能从容器“外部”访问 mysql 终端提示符?我记得看到一位老师(从一个新终端)运行另一个 docker 容器,并访问 MySQL 命令提示符,使他能够从另一个终端窗口手动管理数据库,但我不记得确切的命令了。

我尝试像这样运行一个新的 Docker 容器:

docker run -it --rm --name mysqlterm \
  --network="compose_project_my_network" \
  --link mysql mysql:5.7 \
  sh -c 'exec mysql \
  -h "localhost" -P 3306" \
  -uroot \
  -ppassword'

但不幸的是,容器无法连接到 MySQL 服务器,给我以下错误:ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

我猜“本地主机”或 3306 端口是错误的?我应该在这些参数中输入什么?

提前感谢您的回答:)

【问题讨论】:

    标签: mysql docker docker-compose


    【解决方案1】:

    你需要一个普通的 MySQL 客户端;如果您的主机的包管理器(Debian/Ubuntu APT、MacOS Homebrew、...)有一个名为 mysql-client 的包,就是这样。

    当您运行 mysql 时,该工具不会将 localhost 解释为主机名,而是作为使用 Unix 套接字的信号,因此您需要使用相应的 IP 地址 127.0.0.1。 (如果数据库在不同的系统上运行,请使用其 DNS 名称或 IP 地址:这与直接在 Docker 之外的主机上运行数据库没有区别。)

    所以从主机运行:

    mysql -h 127.0.0.1 -u root -p
    

    默认端口 3306 与发布的 ports: 匹配,系统会提示您以交互方式输入密码。

    【讨论】:

    • 我希望我能多次对此表示赞同。这是非常出乎意料的行为。其中 localhost 与 127.0.0.1 不同。我的作文工作正常但我想连接外部工具(如客户端)但 localhost 不是 127.0.0.1。哇。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多