【问题标题】:connect to docker mysql from host machine从主机连接到 docker mysql
【发布时间】:2018-06-21 12:42:49
【问题描述】:

我有 docker-compose(只显示 MySQL 部分):

  site_mysql:
    image: site/mysql:latest
    build: ./images/mysql
    environment:
      MYSQL_ROOT_PASSWORD: secret
    volumes:
      -  site_mysqldata:/var/lib/mysql
    networks:
      -  site_appnet
    ports:
      - "3306:3306"

我可以从容器内部连接到 MySQL,但我不能从 localhost,我得到的错误是 Host site_mysql is unknown。

docker 文件是:

FROM mysql:5.7

MAINTAINER Author

# The official MySQL docker image will run all .sh and .sql scripts found in this directory
# the first time the container is started.
COPY init.sql /docker-entrypoint-initdb.d
COPY my.cnf /etc/mysql/conf.d

我的.cnf:

[mysqld]
# Always use UTC
default-time-zone='+00:00'

# To turn off strict mode (alas, we started out that way, will be work to turn it on)
sql-mode="NO_ENGINE_SUBSTITUTION"

max-allowed-packet = 16M

### Per-thread Buffers
sort-buffer-size = 2M
read-buffer-size = 128K
read-rnd-buffer-size = 256K
join-buffer-size = 256K

### Temp Tables
tmp-table-size = 64M
max-heap-table-size = 64M

#### Storage Engines
default-storage-engine = InnoDB
innodb = FORCE

init.sql:

CREATE DATABASE IF NOT EXISTS site;
CREATE DATABASE IF NOT EXISTS site_test;
CREATE USER 'site'@'%' IDENTIFIED BY 'secret';
GRANT ALL PRIVILEGES ON site.* TO 'site'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

我在不同的项目中使用了一段时间的相同配置,直到现在一切都还好。任何想法为什么我的主机无法识别site_mysql

更新

另外,我有:

  site_memcached:
    image: memcached:1.4-alpine
    networks:
      -  videosite_appnet

在这里我可以使用site_memcached 作为主机名进行连接

【问题讨论】:

    标签: mysql docker docker-compose


    【解决方案1】:

    如果你从你的主机连接你必须使用“localhost”而不是“site_mysql”

    site_mysql: --> this is the servername within docker
        image: site/mysql:latest
        build: ./images/mysql
        environment:
          MYSQL_ROOT_PASSWORD: secret
        volumes:
          -  site_mysqldata:/var/lib/mysql
        networks:
          -  site_appnet
        ports:
          - "3306:3306" --> here you open 
              port 3306 also on localhost (your host computer)
              and bind it to the containers port 3306
    

    我的个人配置(mac 主机)是:(也许“重启:总是”有帮助)

    db:
        image: "mysql:5"
        ports:
          - "3306:3306"
        networks:
          - main
        volumes:
          - ./mysql/config:/etc/mysql/conf.d:cached
          - ./mysql/data:/var/lib/mysql:cached
          - ./mysql/init:/docker-entrypoint-initdb.d:cached
        restart: always
        environment:
          TZ: UTC
          MYSQL_ROOT_PASSWORD: somepassword
    

    【讨论】:

    • 实际上,我已经尝试使用localhost,也无法连接,我尝试绑定到不同的端口,如33066:3306,也无法正常工作。现在在我的机器上,我在 docker 上还有两个项目(所有容器都关闭了,所以这里不能有任何冲突),配置相同,当我使用来自 docker compose 的服务器名称时,所有项目都在工作
    • db: image: "mysql:5" ports: - "3306:3306" networks: - main volumes: - ./mysql/config:/etc/mysql/conf.d:cached - ./mysql/data:/var/lib/mysql:cached - ./mysql/init:/docker-entrypoint-initdb.d:cached restart: always environment: TZ: UTC MYSQL_ROOT_PASSWORD: somepassword 这是我的配置。也许“重启:总是”有帮助
    【解决方案2】:

    要从主机连接到 mySQL,请使用以下命令

    docker exec -it mysql_container-name mysql -uroot -p
    

    “root”是 MySQL 数据库的用户名。

    【讨论】:

    • 以这种方式,我仍然从 docker 容器连接,但我需要能够使用例如 MySQL 工作台从主机连接,并且在我的情况下,我希望有能力从 php artisan migrate 这样的主机运行 laravel 命令,正如我已经提到的几次,它不仅仅在这个项目中工作......
    猜你喜欢
    • 2015-11-28
    • 2016-01-05
    • 2019-04-26
    • 2017-11-02
    • 2023-04-03
    • 2020-10-20
    • 2020-09-21
    • 1970-01-01
    • 2017-06-13
    相关资源
    最近更新 更多