web-dev-qa-db-ja.com

変更を失わずにDockerコンテナを停止/再起動するにはどうすればよいですか?

私は次のことを行い、Dockerコンテナー内のすべての変更されたデータを失いました。

  1. docker build -t <name:tag> .
  2. docker run *-p 8080:80* --name <container_name> <name:tag>
  3. docker exec(一部のファイルをインポートして処理し、サーバーを起動してそれらをホストします)

次に、別のポートで実行したいと思いました。 docker stopdocker run 動作しません。代わりに私はやった

  1. docker stop
  2. docker rm <container_name>
  3. docker run(以前と同じパラメーター)

再起動後、1〜3の時点でコンテナで発生した変更が消え、インポートを再実行する必要があることがわかりました。

次回、これを正しく行うにはどうすればよいですか?

10
culebrón

あなたがしなければならないことは、変更を行った後に停止したコンテナからイメージをビルドすることです。古いコマンドはまだ新しい変更のない古いイメージを使用しているため(イメージではなく停止したコンテナに変更を加えました)

docker commit --help

Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

docker commit -a me new_nginx myrepo/nginx:latest次に、作成した新しいイメージでコンテナを開始できます

ただし、行った変更を使用してイメージを作成したくない場合は(たとえば、パスワードを含む構成をイメージに配置しないでください)、ボリュームマウントを使用できます。

docker run -d -P --name web -v /src/webapp:/webapp training/webapp python app.py

このコマンドは、ホストディレクトリ/ src/webappを/ webappのコンテナーにマウントします。パス/ webappがコンテナのイメージ内にすでに存在する場合、/ src/webappマウントはオーバーレイしますが、既存のコンテンツを削除しません。マウントを削除すると、コンテンツに再びアクセスできるようになります。これは、mountコマンドの予想される動作と一致しています。

コンテナ内のデータを管理

6
Deepak

docker runを実行するたびに、画像に基づいて新しいコンテナが起動します。また、コンテナが起動すると、Dockerでdocker updateを使用して変更できることがほとんどありません。したがって、代わりに、コンテナーのインスタンス間で持続する必要がある外部ボリュームにデータを保存する必要があります。例えば。

docker run -p 8080:80 -v app-data:/data --name <container_name> <name:tag>

コンテナー内のボリューム名(app-data)とマウントポイント(/ data)は、独自の要件に合わせて変更できます。その後、新しいコンテナを破棄して再起動すると、同じコンテナに同じボリュームをマウントできます。

1
BMitch