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 の新機能: ハッシュ結合

推薦する

データベース内のSQL整合性制約ステートメントの分析

整合性制約整合性制約はテーブル データの正確性を保つためのものです。データが正しくない場合は、そもそ...

SQL Server での exists と except の使用法の概要

目次1. 存在する1.1 説明1.2 例1.3 交差/2017-07-21 2. 除く2.1 説明2...

Nginx リバース プロキシを使用して go-fastdfs を実行する例

背景go-fastdfs は、http プロトコルをサポートする分散ファイルシステムです。一般的なプ...

JavaScript でサウンド効果付きの花火効果を実装する

コードを書くのに 30 分かかりましたが、この HTML5 Canvas New Year Fire...

MySQL のスローログオンラインの問題と最適化ソリューション

MySQL スロー ログは、MySQL DBA やその他の開発および運用担当者が細心の注意を払う必要...

MySQLプロセスを安全かつ適切にシャットダウンする方法

序文この記事では、mysqld プロセスをシャットダウンするプロセスと、MySQL インスタンスを安...

ファイルアップロードスタイルの詳細を実装するjs

目次1. 概要2. オブジェクト作成のパラメータ3. 監視例4. 使用方法5. ソースコード1. 概...

vscodeを使用してuniappを開発する方法

私はフロントエンド プロジェクトの開発に常に vscode を使用してきたため、現在ではいくつかの小...

TypeScript 学習ノート: 型の絞り込み

目次序文型推論真理値の絞り込み平等の縮小演算子の絞り込みインスタンスの絞り込み狭まりの本質ユニオン型...

レスポンシブWebデザイン学習(3) - モバイルデバイスでのWebページのパフォーマンスを向上させる方法

序文モバイル デバイスでは、帯域幅とプロセッサ速度の制限により、Web ページのパフォーマンスに対す...

MySQL 5.6.36 Windows x64 バージョンのインストールチュートリアルの詳細

1. 対象環境Windows 7 64ビット2. 材料(1)VC++2010リリースパッケージ(64...

JSブラウザストレージの詳しい説明

目次導入クッキークッキーとはクッキー生成方法クッキーの適用シナリオクッキーのデメリット回避策ローカル...

MySQL の 4 つのトランザクション分離レベルの詳細な説明

この実験のテスト環境: Windows 10+cmd+MySQL5.6.36+InnoDB 1. ト...

Docker のコンテナ データ ボリュームの概要

目次Dockerコンテナのデータ量データボリュームの使用方法1: コマンド-vを使用して直接マウント...

Linuxコマンドのファイル上書きとファイル追加の詳細な説明

1. コマンド > と >> の違いコマンド>: ファイルが存在する場合は、...