【问题标题】:cann't connect to the mysql docker container following the official instructures无法按照官方讲师连接到mysql docker容器
【发布时间】:2020-11-06 08:15:03
【问题描述】:

按照https://hub.docker.com/_/mysql/中的步骤:

启动一个mysql服务器实例

启动一个 MySQL 实例很简单:

$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:标签

... some-mysql 是您要分配给容器的名称, my-secret-pw 是要为 MySQL root 用户和标签设置的密码 是指定你想要的 MySQL 版本的标签。请参阅上面的列表 用于相关标签。从 MySQL 命令行客户端连接到 MySQL

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

$ docker run -it --network some-network --rm mysql mysql -hsome-mysql -uexample-user -p

... some-mysql 是原始 mysql 容器的名称 (连接到 some-network Docker 网络)。

我启动了一个mysql docker容器,然后我尝试运行另一个作为mysql客户端,但我不知道如何指定--network参数:

我应该输入什么而不是some-network?我是 Docker 的新手,不知道 Docker network。如果我省略这个参数,就会报Unknown MySQL server host 错误。

【问题讨论】:

    标签: mysql docker


    【解决方案1】:

    如果你有多个容器一起工作,你应该阅读 docker-compose 以配置网络、主机、环境变量等...

    // docker-compose.yml
    
    version: "3.2"
    
    services:
      mysql_client:
        depends_on:
          - mysql_database
    
      mysql_database:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: test
          MYSQL_DATABASE: test
          MYSQL_USER: test
          MYSQL_PASSWORD: test
    
    # exec this command to up your containers
    docker-compose up
    

    默认情况下,容器位于同一网络上,在您的 mysql_client 中使用 mysql_database 作为 mysql 连接的主机名。

    【讨论】:

      【解决方案2】:

      通过DockerHub,我发现这个 docker compose 脚本可以让 Adminer 和 MySQL 和谐运行。

      # Use root/example as user/password credentials
      
      version: '3.1'
      
      services:
      
        adminer:
          image: adminer
          restart: always
          ports:
            - 8080:8080
      
        db:
          image: mysql:5.6
          restart: always
          environment:
            MYSQL_ROOT_PASSWORD: example
      

      将它保存到一个名为 docker-compose.yml 的文件中,然后使用 docker-compose 运行它。

      在 cmd promt 中导航到包含该文件的目录并运行以下命令: docker-compose up

      docker-compose reference

      【讨论】:

        【解决方案3】:

        在启动第一个容器之前,你需要创建一个 Docker 网络

        docker network create some-network
        

        您可以在此处使用任何您想要的名称,但为了与问题保持一致,我将使用 some-network

        启动数据库容器时,也需要连接到同一个网络

        docker volume create mysql-data  # this is essentially required too
        docker run \
          --name some-mysql \
          -e MYSQL_ROOT_PASSWORD=my-secret-pw \
          -d \
          --net some-network \                 # matches `docker network create`
          -v mysql-data:/var/lib/mysql/data \  # don't lose data on restart
          mysql:tag
        

        (还有一个docker network connect 命令,但重新创建容器来更改设置是很正常的做法。)

        您也不需要第二个容器来运行 MySQL 客户端:您可以从主机使用普通的mysql 命令行工具进行连接。您需要从容器中发布一个端口

        docker run \
          -p 12345:3306 \
          ...
        

        第一个端口号可以是任何你想要的,不会与主机上的另一个进程冲突;第二个数字必须是标准 MySQL 端口号 3306。然后您可以使用

        连接到该数据库
        mysql -h 127.0.0.1 -p 12345 -u example-user -p
        

        此问题的其他答案已认可 Docker Compose 作为设置。 Compose将为您docker network create一个网络; Networking in Compose 更详细地描述了此设置。但是,它在运行交互式终端应用程序方面并不出色,您可能需要执行docker-compose run db mysql -h db ... 之类的操作才能以这种方式访问​​它。已发布的ports: 方法也可以使用。

        【讨论】:

          猜你喜欢
          • 2016-04-26
          • 2016-07-22
          • 2020-12-30
          • 2020-07-29
          • 2022-11-18
          • 1970-01-01
          • 2019-04-01
          • 2017-08-10
          • 1970-01-01
          相关资源
          最近更新 更多