web-dev-qa-db-ja.com

LinuxソケットファイルをDockerコンテナー(MySQL、MariaDBなど)からホストに公開する方法

免責事項:TCP接続を使用するようにMySQL/MariaDBを構成する方法を探していません。私はそのオプションを認識しており、問題はその側面についてではありません。

コンテナ内からホストファイルシステムへのソケットファイルのバインドに問題があります。次のような単純な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権限で存在しているか、正しいユーザーで存在しているか、まったく存在していないかは、コンテナが起動します。

多分最も不可解なのは、ホストファイルシステムの最終結果でした。

[[email protected] 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ファイルが判明しました!

ソケットファイルを独自のディレクトリに移動して、そのディレクトリをホストにマウントすると、もう少し運が良かった。

3
Torque

問題は、バインドマウントがHostの何かをコンテナに公開するためのものであることです。したがって、これを行うと:

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として利用できます。

8
larsks