在Docker中为Alpine Linux安装MySQL

4
我在alpine上使用docker安装mysql仍然存在问题。我还需要安装openjdk:8u201-jdk-alpine3.9。以下是我的dockerfile:
FROM openjdk:8u201-jdk-alpine3.9
RUN apk update && \
    apk add mysql mysql-client && \
    rm -f /var/cache/apk/* && \
    addgroup mysql mysql && \
    mkdir run/mysqld && \
    touch /var/run/mysqld/mysqld.sock && \
    touch /var/run/mysqld/mysqld.pid && \
    chown -R mysql:mysql /var/run/mysqld/mysqld.sock && \
    chown -R mysql:mysql /var/run/mysqld/mysqld.pid && \
    chmod -R 644 /var/run/mysqld/mysqld.sock && \
    apk add openrc --no-cache

但是,在容器中: - 没有mysql服务(只有mariadb,但这可能是alpine的标准情况) - /etc/mysql目录中没有任何my.cnf文件

当我尝试使用mysql命令时,出现了错误:

Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' (111)

当我尝试运行命令 mysql -h 127.0.0.1 -P 3306 -u root 时,出现了错误:

Can't connect to MySQL server on '127.0.0.1' (115)

同样适用于本地主机。

你展示的内容都没有启动MySQL服务器。你几乎总是会在单独的容器中运行它。 - David Maze
我尝试通过登录容器并启动MySQL服务来启动MySQL服务器。但是它不存在。我想在docker-compose中启动和运行命令,但是如何操作呢?可能我不理解运行mysql所需的非常重要的东西。 - profiler
1
你应该在 docker-compose.yml 文件中添加一个单独的 MySQL 容器。Docker 文档包括一个 Django 和 PostgreSQL 示例应用程序,这应该是一个足够合理的起点。 - David Maze
我已经完成了,并且它完美地工作。但通常我需要执行一些 SQL 脚本,这些脚本只在 Java 应用程序容器中。这就是为什么我想将 MySQL 添加到此容器中,并从 docker-compose 的 entrypoint 执行脚本的原因。 - profiler
2个回答

8
首先 - 为什么你想要在那个特定的映像上安装mysql-server? 我建议使用2个独立的容器 - 一个用于mysql数据库,另一个用于使用该openjdk映像开发的应用程序。
您可以简单地使用此代码片段https://gist.github.com/karlisabele/d0bebe3d27fc44a57d1db9a9abdff45a创建一个设置,其中您的Java应用程序可以使用 database (mysql服务器的服务名称)连接到mysql数据库。
有关mysql映像的其他配置,请参见https://hub.docker.com/_/mysql(您应定义MYSQL用户、密码、数据库名称等...)
<p> UPDATE

我更新了代码片段并添加了必要的MySQL环境变量...将qwerty值替换为自己的值,您就可以通过使用环境变量中提供的用户名和密码,从Java应用程序访问数据库进行管理。

文件末尾的volumes定义告诉docker daemon我们要在主机文件系统中某个地方创建持久卷,并使用 mysql 作为别名。因此,当我们定义数据库服务volumes时,我们可以简单地使用mysql:/var/lib/mysql,它实际上会挂载docker在文件系统上创建的一个模糊文件夹。这将使mysql数据库每次启动服务时都具有持久状态(因为它将挂载主机机器上的数据),您不必担心卷的实际位置

您可以运行 docker volumes ls 以查看所有卷。

1
@profiler 更新了答案,并添加了额外的解释,以及将示例环境配置添加到了代码片段中。 - Kārlis Ābele
1
哦...我刚意识到你想要直接从Java应用程序执行mysql命令...在这种情况下,您还需要创建自定义镜像,但您只需要安装mysql-client即可。我再次更新了gist。 您可以通过运行docker-compose up -d然后运行docker-compose exec app sh,最后运行mysql -h database -u qwerty -pqwerty来测试它,然后您应该已连接到mysql服务器。因此,从现在开始,您的应用程序应该能够连接到数据库。 - Kārlis Ābele
2
这非常取决于您打算在生产服务器上如何使用它,但无论如何,您都可以使用相同的docker-compose.yml文件(您只需要定义端口映射),它应该与本地工作方式相同。 有关卷的更多信息:https://docs.docker.com/compose/compose-file/#volume-configuration-reference 有关端口映射的更多信息:https://docs.docker.com/compose/compose-file/#ports - Kārlis Ābele
1
@profiler 你试过用我提供的命令测试连接了吗?为了确保,我没有做任何更改就使用了那个gist进行了测试,结果对我来说很好。 也许你是从Java应用程序中进行操作,可能有一些特定的问题。 请确保你正在使用数据库服务名称作为主机...(gist中的服务名称是database) - Kārlis Ābele
1
图像本身没有添加那些 .sql 文件。如果您希望构建一个已经包含所有这些 .sql 文件的数据库镜像,那么您需要创建一个自定义的 Dockerfile,使用 mysql 作为基础镜像,并使用 COPY 命令将 .sql 文件添加到所需的文件夹中。 或者您只需要将这些转储文件可用于挂载... - Kārlis Ābele
显示剩余15条评论

1
  1. vim /etc/my.cnf.d/mariadb-server.cnf
[mysqld]

#skip-networking

重新启动MySQL容器。

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