免責事項: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
権限で存在しているか、正しいユーザーで存在しているか、まったく存在していないかは、コンテナが起動します。
多分最も不可解なのは、ホストファイルシステムの最終結果でした。
[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ファイルが判明しました!
ソケットファイルを独自のディレクトリに移動して、そのディレクトリをホストにマウントすると、もう少し運が良かった。
問題は、バインドマウントが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
として利用できます。