尝试从主机连接到mysql docker容器时出现“阅读初始通信数据包”错误

irlmq6kh  于 2023-03-17  发布在  Mysql
关注(0)|答案(8)|浏览(213)

我希望能够连接到我的Docker容器,就像MySQL服务器安装在我的本地计算机上一样。我使用以下命令测试连接:

mysql -u root -proot -h 127.0.0.1 -P 3306 --protocol=tcp

如果我使用Docker创建一个容器,我可以成功地做到这一点。

docker run --name some-mysql-standalone -p 127.0.0.1:3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql:5.7.29

如果我在docker-compose中使用容器作为服务,我会得到一个错误:

ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 2

MySQL服务器在容器内运行,我可以访问它。
我的Docker编写代码段:

version: '2'

services:

    mysql:

        image: mysql:5.7.29
        container_name: some_mysql
        restart: unless-stopped

        volumes:
            - ./mysql/data:/var/lib/mysql
            - ./mysql/init:/docker-entrypoint-initdb.d

        ports:
            - 3306:3306

        environment:
            MYSQL_DATABASE: some_mysql
            MYSQL_USER: root
            MYSQL_PASSWORD: root
            MYSQL_ROOT_PASSWORD: root

有趣的是,我已经使用docker-compose.yml一段时间了,没有任何问题,我真的不知道我的环境发生了什么变化,导致它停止工作。
我怎样才能让我的mysql容器在docker-compose中从主机访问?

eni9jsuy

eni9jsuy1#

首先,尝试在创建容器时设置-e MYSQL_ROOT_HOST=%
如果不起作用:一些docker映像忽略环境变量指令(如-e MYSQL_ROOT_PASSWORD=<MY_PASSWORD> -e MYSQL_ROOT_HOST=%),因此您必须手动在其他主机(%)上添加(root)用户:
docker exec -it <YOUR_CONTAINER_NAME> bash
mysql -u root -p<MY_PASSWORD>
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '<MY_PASSWORD>';
FLUSH PRIVILEGES;

zy1mlcev

zy1mlcev2#

正如7_R3X在这篇response中所说的那样,它似乎是对mysql服务器更安全的保护。
在我的例子中,我在一个构建在mysql:5.7之上的docker映像中运行服务,并且mysql服务器是通过调用**/etc/init.d/mysql start**而不是通过使用mysql官方映像的入口点启动的,因此它可能不适用于问题上下文,但它适用于mysql服务中指定的错误。
解决该问题的步骤包括:

  • 将本地主机/循环地址替换为**/etc/mysql/mysql.conf.d/mysqld.cnf**中的所有地址
  • sed -i "s/bind-address.*/bind-address = 0.0.0.0/g" /etc/mysql/mysql.conf.d/mysqld.cnf
  • 重新启动mysql服务:/etc/init.d/mysql restart

然后,我能够从外部(与主机检查)访问Docker暴露端口

pcww981p

pcww981p3#

有时候我在停止和恢复我的虚拟机后会遇到这个错误。解决这个问题的方法是重新启动虚拟机。

mctunoxg

mctunoxg4#

this thread上发现类似错误。请查看是否更改了防火墙配置,并尝试将SQL Server绑定到0.0.0.0,而不是localhost127.0.0.1

qncylg1j

qncylg1j5#

从实际的Angular 来看,我通过显式创建一个网络**来使它工作。

version: '2'

services:

    mysql:

        image: mysql:5.7.29
        container_name: some_mysql
        restart: unless-stopped

        volumes:
            - ./mysql/data:/var/lib/mysql
            - ./mysql/init:/docker-entrypoint-initdb.d

        ports:
            - 3306:3306

        environment:
            MYSQL_DATABASE: some_mysql
            MYSQL_USER: root
            MYSQL_PASSWORD: root
            MYSQL_ROOT_PASSWORD: root
        networks: 
            - default

...

networks:
    default:
        external:
            name: somename_default

我想既然我无法连接我应该尝试删除并创建一个新的网络,因为docker-compose在幕后为容器创建了一个单独的网络。我仍然不知道为什么我会遇到这个问题。

b5buobof

b5buobof6#

这帮助我解决了我的问题:使用以下命令创建容器

docker run --detach --rm --name mysql-server -p 8888:3306 --env MYSQL_ROOT_PASSWORD=admin mysql:latest

并登录到mysql

mysql -uroot -padmin -h127.0.0.1 -P8888 --protocol=tcp
6psbrbz9

6psbrbz97#

此配置对我很有效:

ports:
  # <Port exposed> : < MySQL Port running inside container>
  - '3306:3306'
expose:
  # Opens port 3306 on the container
  - '3306'
hmmo2u0o

hmmo2u0o8#

一个实际可行的变通方案(我不建议在不了解全部含义的情况下在prod上这样做,只是针对本地docker env):alter user 'root'@'%' identified with mysql_native_password by 'password123'
配额转到https://laracasts.com/discuss/channels/laravel/caching-sha2-password-error-when-running-php-artisan-migrate?page=1&replyId=578038

相关问题