MySQL docker容器-无法完成任何工作

时间:2019-10-22 01:32:23

标签: mysql docker networking

我正在尝试使用mysql docker image进行一些数据库开发。我似乎无法连接到它,也无法使用其客户端连接到现有数据库。

服务器

这是我在尝试创建数据库并连接到它:

% cat Dockerfile
FROM mysql:5.7
COPY drupal.sql.gz /docker-entrypoint-initdb.d
COPY civicrm.sql.gz /docker-entrypoint-initdb.d
RUN perl -pi -e 's/^#(bind-address\s*=\s*127\.0\.0\.1)/$1/' /etc/mysql/mysql.conf.d/mysqld.cnf

% docker build -t my-mysql .
Sending build context to Docker daemon  7.166MB
Step 1/4 : FROM mysql:5.7
 ---> e1e1680ac726
Step 2/4 : COPY drupal.sql.gz /docker-entrypoint-initdb.d
 ---> Using cache
 ---> 93d57dcd45e9
Step 3/4 : COPY civicrm.sql.gz /docker-entrypoint-initdb.d
 ---> Using cache
 ---> cb0342af9523
Step 4/4 : RUN perl -pi -e 's/^#(bind-address\s*=\s*127\.0\.0\.1)/$1/' /etc/mysql/mysql.conf.d/mysqld.cnf
 ---> Using cache
 ---> bf68cb50c994
Successfully built bf68cb50c994
Successfully tagged my-mysql:latest

% docker run -p 4306:3306 -e MYSQL_ROOT_PASSWORD=1234 -d my-mysql
ff19571bebf58ac1d58e44d40677c693953cd981fd70d18fd93d3d2fe8738349

% mysql --port 4306 -h 127.0.0.1 -u root -p1234
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 0

实际上是在那个端口上找到某物,因为如果我连接到某个随机端口而没有服务器,则会出现另一个错误:

% mysql --port 4307 -h 127.0.0.1 -u root -p1234
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (61)

日志似乎显示服务器已成功启动:

% docker logs ff19571bebf5 2>&1 |tail -n3
2019-10-22T01:04:51.953141Z 0 [Note] mysqld: ready for connections.
Version: '5.7.27'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server (GPL)
2019-10-22T01:04:52.933930Z 0 [Note] InnoDB: Buffer pool(s) load completed at 191022  1:04:52

客户

类似地,当我尝试使用容器作为客户端连接到本地mysql服务器时,客户端无法连接。使用本地客户端进行连接:

% mysql -u ken -p -h 127.0.0.1 --port 3306
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 253
Server version: 5.7.27 Homebrew

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

并且这里使用Docker客户端尝试相同的事情:

% docker run -it --network=host --rm mysql mysql -h 127.0.0.1 --port 3306 -u ken
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

我在这里做错了什么?这是不了解Docker网络的问题,还是这些映像有问题?

最终

最终,我确实希望使用docker-compose使其正常工作,以便我的Web容器可以与我的数据库容器进行通信,但是我认为我会将其简化为易于调试的东西。

2 个答案:

答案 0 :(得分:1)

如果您在Docker容器内设置了一个服务器进程以绑定到127.0.0.1,即该容器的 本地主机接口,那么它将无法从容器外部访问。 mysql图片的默认设置在这里是正确的;删除更改MySQL RUN设置的bind-address行。

答案 1 :(得分:1)

我正在回答“如何最终使用docker-compose使它正常工作”。

您首先要执行此操作,以使docker-compose工作,即使您不需要群集。

docker swarm init

设置一个docker-compose.yml文件如下

version: "2"
networks:
    mynet:
        driver: overlay
services:
    web:
        image:  put image tag here
        hostname:  web
        ports:
            - "8000:80/tcp"
        networks:
           mynet:
                aliases:
                     - web
    db:
        image:  put mysql image tag here
        hostname:  db
        ports:
              - "4306:3306/tcp"
        environment:
            - MYSQL_ROOT_PASSWORD=1234
        networks:
           mynet:
                aliases:
                     - db

在触发docker-compose之前

检查缩进。我在手机上输入了上面的文字,任何编辑帮助都表示赞赏。

在放置docker-compose.yml的目录中,例如说它是“ mydir”。

docker-compose up 

docker-compose将尝试创建一个名为“ mydir_mynet”的新网络,以及两个分别名为“ web”和“ db”的容器。 在docker-compose完成启动之后,您应该能够

mysql --port 4306 -h 127.0.0.1 -u root -p1234

或docker内的mysql客户端

docker exec db mysql --port 3306 -h 127.0.0.1 -u root -p1234

请注意端口号的差异

通过以下方式破坏容器和网络

docker-compose down