无法从MySQL Workbench连接到dockerized MySQL服务器

时间:2016-05-14 12:18:24

标签: java mysql docker mysql-workbench

我试图从MySQL Workbench连接到我的dockerized mysql服务器。我使用的是Windows 10.这是我的Dockerfile:

FROM ubuntu:latest

# package updates & install mysql
RUN apt-get update && apt-get install -y mysql-server
RUN apt-get -y install supervisor

ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# bind sql script
ADD musicdb.sql /tmp/musicdb.sql

RUN sed -i -e"s/^bind-address\s*=\s*127.0.0.1/bind-address = 0.0.0.0/" /etc/mysql/my.cnf

EXPOSE 3306

RUN /bin/bash -c "/usr/bin/mysqld_safe &" && \
sleep 5 && \
mysql -u root -e "CREATE DATABASE musicdb" && \
mysql -u root musicdb < /tmp/musicdb.sql

CMD ["/usr/bin/supervisord", "-n"]

我正在使用这个库从Java创建,运行等容器:

https://github.com/spotify/docker-client

我在Java中执行此操作的实际方法是:

    public static void createContainerWithPorts(){
        DockerClient docker;


        try {
            docker = DefaultDockerClient.fromEnv().build();

//PortBindings
            Map<String, List<PortBinding>> portBindings = new HashMap<>();

            List<PortBinding> hostPorts = new ArrayList<>();

            hostPorts.add(PortBinding.of("0.0.0.0", "3306"));
            portBindings.put("3306", hostPorts);

            HostConfig hostConfig = HostConfig.builder().portBindings(portBindings).build();
            ContainerConfig containerConfig = ContainerConfig.builder().hostConfig(hostConfig).image("mysql-container").exposedPorts("3306").build();

//create container
            ContainerCreation contaierCreation = docker.createContainer(containerConfig);
            String id = contaierCreation.id();

//start container
            docker.startContainer(id);

            ContainerInfo containerInfo = docker.inspectContainer(id);
            System.out.println(containerInfo.toString());

            Scanner scanner = new Scanner(System.in);
            scanner.next();
            docker.killContainer(id);
            docker.removeContainer(id);
            docker.close();
        } catch (DockerCertificateException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (DockerException e) {
            e.printStackTrace();
        }
    }

Java从之前创建的Docker Image中构建了Container。当我查看实际运行的Docker Container时,它看起来端口绑定有效。当我使用docker exec -it SQLContainer bash访问我的容器时,它工作正常,我可以访问我的SQL服务器。

当我尝试连接MySQL Workbench时,我收到如下图所示的错误消息: MySQL Workbench Error Message

有人知道我做错了什么吗?

谢谢,

1 个答案:

答案 0 :(得分:1)

我认为你需要为你的mysql服务器创建一个新用户,并指定用户可以在哪里使用。这是因为我只相信root权限只能通过localhost获得。

因此,要创建新用户,您需要在启动服务器的RUN命令中添加一些内容:

RUN /bin/bash -c "/usr/bin/mysqld_safe &" && \
sleep 5 && \
mysql -u root -e "CREATE DATABASE musicdb" && \
mysql -u root musicdb < /tmp/musicdb.sql && \
mysql -u root -e "CREATE USER 'newUser'@'%' IDENTIFIED BY 'somePassword'" && \
mysql -u root -e "GRANT ALL PRIVILEGES ON *.* TO 'newUser'@'%' WITH GRANT OPTION"

这样您就可以创建一个名为newUser的新用户,可以从任何地方访问。