从主机连接到Docker MySQL

4

我有一个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,但是从本地主机无法连接,出现的错误是“主机 site_mysql 未知”

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

my.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作为主机名来连接。

2个回答

4

如果您从主机计算机连接,则必须使用“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主机)是:(也许“restart: always”有帮助)

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中的服务器名称时,它们全部工作正常。 - Bogdan Dubyk
数据库配置: 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这是我的配置。也许 "restart: always" 有所帮助。 - MarcoB

1

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

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

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

3
这样,我仍然从Docker容器中进行连接,但我需要能够使用主机机器进行连接,例如使用MySQL Workbench,就像我这种情况下想要在主机机器上运行Laravel命令php artisan migrate的能力。正如我已经多次提到的那样,在这个项目中它不起作用... - Bogdan Dubyk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接