容器外部的MySQL发生内部错误

我build立了一个MySQL服务器映像,可以运行它的容器,我也可以从另一个容器中访问它,上个星期,在我的笔记本电脑上运行Ubuntu 16.04上的Docker 17.05.0-ce 。 那么,昨天我无法从外面访问MySQL。 它开始给我的错误: ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0 "Internal error/check (Not system error)"

这里是Dockerfile内容:

 $ cat mysql/Dockerfile FROM ubuntu:16.04 RUN apt-get update \ && apt-get install -y libncurses-dev \ && apt-get install -y build-essential \ && apt-get install -y cmake COPY mysql-5.6.30.tar.gz /usr/bin/ WORKDIR /usr/bin/ RUN gzip -d mysql-5.6.30.tar.gz \ && tar -xvf mysql-5.6.30.tar \ && ln -s mysql-5.6.30 mysql WORKDIR /usr/bin/mysql/ RUN mkdir install && mkdir install/data && mkdir install/var && mkdir install/etc && mkdir install/tmp RUN cd /usr/bin/mysql/ \ && cmake \ -DCMAKE_INSTALL_PREFIX=/usr/bin/mysql/install \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DMYSQL_DATADIR=/usr/bin/mysql/install/data \ -DDOWNLOAD_BOOST=1 \ -DWITH_BOOST=/usr/bin/mysql/install/boost \ -DMYSQL_UNIX_ADDR=/usr/bin/mysql/install/tmp/mysql.sock \ && make \ && make install \ && make clean EXPOSE 3306 COPY startup.sh install/startup.sh COPY my.cnf install/my.cnf ENTRYPOINT ["/bin/bash", "install/startup.sh"] 

my.cnf文件内容:

 [mysqld] bind-address = 0.0.0.0 # Allow client binding from any IP address instead of just 127.0.0.1 port = 3307 sql_mode = NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION # This is strict mode: NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES socket = /usr/bin/mysql/install/tmp/mysql.sock user = root basedir = /usr/bin/mysql/install datadir = /usr/bin/mysql/install/data log-bin = /usr/bin/mysql/install/mysql.bin.log log-error = /usr/bin/mysql/install/mysql.error.log general-log-file = /usr/bin/mysql/install/mysql.log slow-query-log-file = /usr/bin/mysql/install/mysql.slow.queries.log innodb_file_per_table = 1 innodb_flush_log_at_trx_commit = 1 sync_binlog = 1 innodb_flush_method = O_DIRECT character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init-connect = 'SET NAMES utf8mb4' character-set-client-handshake = FALSE wait_timeout = 28800 # amount of seconds during inactivity that MySQL will wait before it will close a connection on a non-interactive connection interactive_timeout = 28800 # same, but for interactive sessions [client] socket = /usr/bin/mysql/install/tmp/mysql.sock default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 

startup.sh文件内容:

 #!/bin/bash -x if [ ! -f /usr/bin/mysql/install/data/ibdata1 ]; then chmod 755 /usr/bin/mysql/install/scripts/mysql_install_db sleep 1 # Needed to avoid running the script when this mysql_install_db file has not yet been released by the permissions change /usr/bin/mysql/install/scripts/mysql_install_db \ --no-defaults \ --explicit_defaults_for_timestamp \ --basedir=/usr/bin/mysql/install \ --datadir=/usr/bin/mysql/install/data \ --tmpdir=/usr/bin/mysql/install/tmp \ --lc-messages-dir=/usr/bin/mysql/install/share /usr/bin/mysql/install/bin/mysqld_safe --defaults-file=/usr/bin/mysql/install/my.cnf & sleep 10s echo "GRANT ALL ON *.* TO root@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; FLUSH PRIVILEGES" | /usr/bin/mysql/install/bin/mysql tail -f /etc/hosts else /usr/bin/mysql/install/bin/mysqld_safe --defaults-file=/usr/bin/mysql/install/my.cnf fi 

我可以用命令运行它:

 docker run -d -p 3307:3306 -v /home/stephane/dev/php/learnintouch/docker/mysql/data:/usr/bin/mysql/install/data --name mysql stephaneeybert/mysql:5.6.30 

我可以看到端口有一个开放的状态:

 nmap -p 3307 localhost 

我可以进入它的bash shell:

 docker exec -it mysql bash 

而且,从容器内,我login就好了:

 /usr/bin/mysql/install/bin/mysql -u root -p 

但是如果我想从主机login:

 cd programs/install/mariadb/; bin/mysql -h localhost -P 3307 --protocol=tcp -u root -p 

它给了我信息:

 ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0 "Internal error/check (Not system error)" 

容器暴露端口3306。

 FROM ubuntu:16.04 # ... EXPOSE 3306 # ... 

mysql正在监听端口3307的容器,在这里应该是3306。

 [mysqld] bind-address = 0.0.0.0 port = 3307 

然后docker工转发容器端口3306到主机3307。

 docker run -d -p 3307:3306