Dockerはアプリケーションのパッケージ化と管理に役立つツールですが、保存されたデータの処理など、多くの固有の課題もあります。通常、作成スクリプトでボリュームをコンテナに追加しますが、新しいボリュームを作成する必要がある場合はどうなりますか?
実行中のDockerコンテナへのボリュームの追加
残念ながら、新しいボリュームを追加するほど簡単ではありません。コンテナは起動時にボリュームを設定する必要があります。つまり、新しいボリュームを追加するには、コンテナを再起動する必要があります。ハッキーな解決策がありますが(詳細は以下を参照)、とにかくコンテナの再起動を行うことを強くお勧めします。
これにはいくつかの理由があります。コンテナの再起動は非常に簡単で、ほとんどのコード更新ではとにかくサービスを再起動する必要があります。特にDockerComposeを使用している場合は、Gitで更新を追跡することも大きな要因であり、実行中のコンテナーにボリュームを手動で追加するよりも、起動スクリプトを編集する方がはるかに優れています。
サービスが十分に大きいため、コンテナーを再起動するためにスケジュールされたダウンタイムの数分(多くても)が心配な場合は、独立して更新できる複数のインスタンスを使用してスケーリング展開を実行する必要があります。コードのデプロイは頻繁に行われるため、最新の自動スケーリングシステムはそれを処理するように設計する必要があります。
ボリュームを追加する場合は、実行中のコンテナを停止する必要があります:
docker stop my_container
必要に応じて、新しいボリュームを作成します。
docker volume create nginx-config
次に、更新された起動コマンドを使用して実行し、--mount
を追加します フラグを使用して、ソースボリュームとターゲット宛先を構成します。
docker run -d --name devtest --mount source=nginx-config,target=/etc/nginx nginx:latest
Docker Composeを使用している場合、ボリューム構成は設定ファイルを介して処理されるため、このプロセスをより簡単に自動化および追跡できます。ボリュームをdocker-compose.yml
に追加する必要があります ファイル:
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - /docker/nginx-config/:/etc/nginx/
その後、DockerComposeのサービスを再起動できます。 Composeには「再起動」コマンドがありますが、実際には、構成を変更せずに実行中のサービスを更新するだけです。画像を更新する場合は、docker-compose up
を実行する必要があります --build
を使用 フラグ:
docker-compose up -d --build
docker-compose down
を手動で実行することもできます 事前にサービスを停止しますが、-v
で実行する場合を除いて、ほとんどの場合必要ありません。 既存のボリュームを破棄するフラグ。
関連: Docker Composeとは何ですか、またどのように使用しますか?
既存のコンテナからのクローン作成
ほとんどの場合、コンテナの現在の実行状態に依存するべきではありません。アプリケーションデータなど、気になるものはすべてボリュームに保存して、コンテナの再起動や再構築の間も永続化できるようにする必要があります。
この方法は、ほとんどの人にとっておそらく良い考えではありません。これを行うたびに新しいイメージを作成する必要があり、それでもダウンタイムが必要になるためです。ただし、実行中のコンテナーにボリュームを追加する必要がある場合は、docker commit
を使用できます。 そのコンテナに基づいて新しいイメージを作成し、それを新しいボリュームで複製します。
docker ps
からコンテナIDを取得します :
docker ps
次に、commit
でクローンを作成します :
docker commit f88f33c918d2 imagename
次に、新しいイメージを実行して、古いイメージをクローンされたイメージに置き換えます。
docker run -d --name devtest --mount source=nginx-config,target=/etc/nginx imagename
ハッキーソリューション
Dockerボリュームは、Dockerランタイムがホストディレクトリをコンテナーに公開するために使用するトリックであり、すべて構成によって異なります。このため、実際にその構成を直接変更し、システムのDockerデーモン全体を再起動して、まったく再起動せずにそれらの変更を適用できます。
もちろん、これは単にコンテナの再起動を処理するよりもはるかに複雑なので、1分間のダウンタイムを管理できる場合は、代わりにそれを実行することを強くお勧めします。
Dockerのストレージディレクトリに移動する必要があります:
cd /var/lib/docker/containers
ここには、DockerコンテナIDに対応する多くのフォルダがあります。これはdocker ps
で見つけることができます。 。変更するコンテナ用のものを開きます。
構成ファイルはconfig.v2.json
です。 、しかしそれはコンパクトなフォーマットであり、編集するのは難しいです。 jq
をインストールできます コマンドラインでJSONをきれいに印刷し、これを新しいファイルにパイプして編集します:
jq . config.v2.json > tmp.json
下にスクロールして、すべてのボリュームとバインドマウントの構成が含まれている「MountPoints」を見つける必要があります。ここに新しいものを追加できます。これは次の形式である必要があります:
"MountPoints": { "/home/container": { "Source": "/var/lib/pterodactyl/volumes/c7fb3a04-e540-48a7-9704-13987f52e933", "Destination": "/home/container", "RW": true, "Name": "", "Driver": "", "Type": "bind", "Propagation": "rprivate", "Spec": { "Type": "bind", "Source": "/var/lib/pterodactyl/volumes/c7fb3a04-e540-48a7-9704-13987f52e933", "Target": "/home/container" }, "SkipMountpointCreation": true } },
次に、完了したら、JSONを再度縮小して構成ファイルに戻すことができます。
jq -c . tmp.json > config.v2.json
jq
は強力なユーティリティなので、このプロセスを完全に自動化したい場合は、それを行うことができます。
関連: コマンドラインでJSONを操作する方法
次に、Dockerサービスを再起動して変更を適用します。
sudo service docker restart