如何从 Docker 容器(MySQL、MariaDB 等)向主机公开 Linux 套接字文件

如何从 Docker 容器(MySQL、MariaDB 等)向主机公开 Linux 套接字文件

免责声明:我并不是在寻找配置 MySQL/MariaDB 以使用 TCP 连接的方法。我知道这个选项,问题与这个方面无关。

我无法将套接字文件从容器内部绑定到主机文件系统。我期望像这样的简单 docker-compose 条目能够正常工作:

    volumes:
      - /srv/docker/sockets/mariadb.container.sock:/var/run/mysqld/mysqld.sock

但那没有用。相反,我遇到了以下错误消息:

its_sql_dev    | 190305 10:31:23 [ERROR] Can't start server : Bind on unix socket: Address already in use
its_sql_dev    | 190305 10:31:23 [ERROR] Do you already have another mysqld server running on socket: /var/run/mysqld/mysqld.sock ?

主机系统中文件的状态似乎并不重要 —— 无论它是否已经存在、是否有a+rwx权限存在、是否有正确的用户存在或者根本不存在,似乎都不会对容器是否启动产生任何影响。

也许最令人困惑的是主机文件系统的最终结果:

[user@server mariadb]# ls -alsh /srv/docker/shared/
total 16K
4.0K drwxrwxrwx 4 root    root     4.0K Mar  5 11:31 .
4.0K drwxr-xr-x 7 root    root     4.0K Mar  1 13:09 ..
4.0K drwxr-xr-x 2 root    root     4.0K Mar  5 11:31 mariadb.container.sock

事实证明.sock 文件变成了主机上的一个(空)目录!

将套接字文件移动到其自己的目录并将该目录安装到主机后,我获得了一些运气,在这种情况下它可以工作一次,但在容器重启后则无法工作。

答案1

问题是绑定安装是为了暴露一些东西主持人到容器中。因此,当您执行此操作时:

volumes:
  - /srv/docker/sockets/mariadb.container.sock:/var/run/mysqld/mysqld.sock

您正在尝试安装/srv/docker/sockets/mariadb.container.sock--不存在—— 到/var/run/mysqld/mysqld.sock容器内部。由于源对象不存在,Docker 将在该位置创建一个空目录并将其挂载到容器中……这当然意味着 mysqld 在启动时无法创建套接字。

正确的解决方法是挂载主机目录到/var/run/mysqld/,例如:

volumes:
  - /srv/docker/sockets/mariadb:/var/run/mysqld

然后在您的主机上,套接字将可用作/srv/docker/sockets/mariadb/mysqld.sock

相关内容