Dockerでコンテナを作成するときのディレクトリ権限

Dockerでコンテナを作成するときのディレクトリ権限

昨日プロジェクトを書いていた時に、MySQL の派生版である Percona を使う必要があったので、Docker を使ってインストールしたいと思いました。結果、一晩中泥沼にはまり込んでしまい、今朝ようやく解決しました。ここで記録しておきます。
この落とし穴に陥る理由は、私が Linux のディレクトリ権限の問題に敏感ではないからです。私のシステムは Ubuntu 16.04 で、docker pull percona を実行してイメージをプルすると、すべて正常になります。


プル後、docker imagesと入力してすべてのイメージを表示すると、表示は正常になります。

次に、次のコマンドでコンテナを作成します (実行時に改行を使用しないでください)。

docker create --name percona -v /data/mysql-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root percona:lates

このコマンドは、percona という名前のコンテナを作成し、ローカルの /data/mysql-data ディレクトリを docker コンテナの /var/lib/mysql ディレクトリにマップしてポート 3306 を指定し、データベースのルート ユーザーのパスワードを root に設定し、最後の percona:latest で上記で取得したバージョンを指定することを意味します。

docker コンテナ内のデータベースは単なるミラーなので、実際には存在しないことがわかります。これをローカル ディレクトリにマッピングする目的は、docker によって /var/lib/mysql ディレクトリに保存されたデータを同期して、ローカルの /data/mysql-data ディレクトリに保存できるようにすることです。これにより、データが失われることがなくなり、ローカル操作が容易になります。

コマンドパラメータがわからない場合は、公式ドキュメントを読むか、説明のあるdockerビデオチュートリアルを検索してください。次に、このコンテナを起動します(docker start percona)。起動後、実行中のすべてのコンテナをdocker psで照会すると、問題が発生します。


空です。つまり、実行中のコンテナは見つかりません... 次に、実行中のコンテナと実行されていないコンテナを含むすべてのコンテナをチェックしました。 docker ps -a は次のように表示します。


ポートが正常にバインドされなかったため、実行されなかったことが判明しました。実行されるたびに自動的に終了しました。

このとき、docker ログを確認し、docker logs container id コマンドを入力すると、次のように表示されました。


注: ここでの 71 は、このコンテナの container_id の最初の 2 桁です。Docker はこの簡略化された記述をサポートしています。

ログ エラーには、コンテナ内の /var/lib/mysql ディレクトリを作成して書き込む権限がないことが示されています。
この問題の原因はわかりましたが、一晩中検索しても解決できませんでした。インターネット上の無責任な投稿は本当に落とし穴だと言わざるを得ません。
今朝ようやく解決策を見つけました:
つまり、ローカル ディレクトリの所有者と Docker コンテナ内の /var/lib/mysql ディレクトリの所有者が同じユーザーであるかどうかを確認します。

docker run -ti --rm --entrypoint="/bin/bash" percona -c "whoami && id"

このコマンドはコンテナの所有者を表示するために使用され、次のように表示されます。


次に、次のように入力します (改行なし):

docker run -ti --rm -v /data/mysql-data:/var/lib/mysql --entrypoint="/bin/bash" percona -c "ls -la /var/lib/mysql"

このコマンドは、ローカル データ ボリュームをマッピングするときに、このディレクトリの所有者を表示するために使用されます。


これが理由です。mysql ユーザーが docker 内のディレクトリにアクセスすると、権限エラーが報告されるのはそのためです。ローカル マッピング ディレクトリの所有者は root ユーザーであり、docker コンテナ内の /var/lib/mysql ディレクトリの所有者は uid が 999 の mysql ユーザーであるためです。
解決策としては、現在のディレクトリの所有者を uid 999、mysql ユーザーに割り当て、コンテナを再起動することです。

問題は解決しました! 一晩中無駄にしました。Linux の権限制御に関する知識を深める必要があると言わざるを得ません!

Docker がコンテナを作成する際のディレクトリ権限の落とし穴についての記事はこれで終わりです。Docker がコンテナを作成する際のディレクトリ権限についての詳細は、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • Dockerコンテナ内のホストのホスト名が取得できない問題の解決方法
  • DockerでMySQLコンテナを作成する簡単な手順
  • DockerでMySQLコンテナを作成し、コマンドラインからコンテナに接続する方法の詳細な説明
  • DockerでMySQLコンテナを作成する方法
  • Dockerがコンテナを作成した後にホスト名を変更する詳細なプロセス

<<:  Centos6.6 で php7 + nginx 環境をインストールする方法

>>:  MySQL 8.0 の新機能: ハッシュ結合

推薦する

MySQLは遅いSQLを開始し、原因を分析します

ステップ1. MySQLスロークエリを有効にする方法1: 設定ファイルを変更するWindows: W...

mysql5.6 以前のデータベースで json をクエリする方法

MySQLにデータを保存するとき、乱雑であまり使用されないデータがJSONフィールドに投げ込まれるこ...

HTML の表のフレームとルール属性の詳細な説明

テーブル タグの frame 属性と rules 属性は境界線の表示を制御できます。フレーム プロパ...

選択ドロップダウンメニューのテキストを左右にスクロールするように設定する

marquee タグを使用してフォントのスクロールを設定したいです。コードは次のように記述しましたが...

CSS3で実装されたサムネイルホバー効果

成果を達成する実装コードhtml <ヘッダー> <h1><em>...

行の高さと垂直方向の配置についての深い理解

いくつかの概念行ボックス: インライン ボックスを囲むボックス。1 つ以上の行ボックスが積み重ねられ...

vscode で Prettier Code プラグインを使用する詳細なチュートリアル

なぜprettierを使うのですか?大企業では、フロントエンド開発コードに独自のコード標準がある場合...

Linux mysql-5.6 でルート パスワードをリセットする方法

1. MySQL サービスが起動しているかどうかを確認します。起動している場合は、MySQL サービ...

mysqlは2つ以上のフィールドがNULLであるレコードを見つける問題を解決します

コアコード /*-------------------------------- 2つ以上のフィール...

JavaScriptのアロー関数の特徴と通常の関数との違い

目次1. 矢印関数の使用1. 通常関数から矢印関数へ2. 中括弧を省略してリターンする3. 括弧を省...

HTML テーブルタグチュートリアル (32): セルの水平方向の配置属性 ALIGN

水平方向では、セルの配置を左、中央、右に設定できます。基本的な構文<TD ALIGN=&quo...

MYSQL ログとバックアップおよび復元の問題の詳細な説明

この記事では、参考までにMYSQLログとバックアップとリストアについて紹介します。具体的な内容は以下...

ランダムロールコールテーブルを実装するためのネイティブJavaScript

この記事では、JavaScriptのランダムロールコールテーブルの具体的なコードを参考までに紹介しま...

Linuxでファイルを削除してもスペースが解放されない問題の対処方法

問題の背景業務システムのサーバ監視システムからディスク使用率が90%に達したという早期警告通知が来た...

Nginxはリバースプロキシを使用して負荷分散プロセス分析を実装します

導入dockerコンテナとdocker-composeに基づいて、Linux環境でのdockerの基...