GNU/Linux >> Linux の 問題 >  >> Panels >> Docker

既存のDockerコンテナにボリュームを追加する方法

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

Docker
  1. DockerコンテナでMySQLを実行する方法

  2. 実行中のDockerコンテナでコマンドを実行する方法

  3. Dockerコンテナに静的IPを割り当てる方法

  1. Dockerを使用してWordPressをインストールする方法

  2. DockerコンテナにSSHで接続する方法

  3. ユーザーを Docker コンテナに追加するにはどうすればよいですか?

  1. Dockerコンテナ内でプログラムを実行する方法は?

  2. シェル:Dockerコンテナが存在するかどうかを確認しますか?

  3. DockerコンテナにVimをインストールする方法