はじめに
この実験では、Docker コンテナをすぐに起動せずに準備するためにdocker createコマンドを使用する方法を学びます。これにより、実行前にコンテナとボリュームを設定できます。まず Ubuntu イメージからコンテナを作成し、その作成ステータスを確認した後、作成したコンテナを起動してアタッチします。
さらに、docker createを使用してボリュームを初期化し、その後この初期化されたボリュームを別のコンテナで利用する方法を探求します。この実践的な経験を通じて、コンテナライフサイクルとデータ永続性を管理する際にdocker createコマンドが提供する柔軟性と制御性を実感できるでしょう。
起動せずにコンテナを作成
このステップでは、Docker コンテナをすぐに起動せずに作成する方法を学びます。これは、コンテナを実行する前に設定やボリュームを準備したい場合に便利です。
まず、Docker Hub からubuntuイメージをプルします。このイメージを使ってコンテナを作成します。
docker pull ubuntu:latest
イメージがダウンロードされていることを示す出力が表示されるはずです。ダウンロードが完了したら、以下のコマンドでローカルにイメージが存在することを確認できます。
docker images
次に、ubuntuイメージからmy-ubuntu-containerという名前のコンテナを作成します。このためにdocker createコマンドを使用します。-itフラグは通常インタラクティブなコンテナに使用されますが、docker createはコンテナをセットアップするだけで実行しません。ここでは、最終的にコンテナを実行する方法との一貫性を保つために含めています。
docker create -it --name my-ubuntu-container ubuntu:latest
docker createコマンドは、指定されたイメージの上に書き込み可能なコンテナレイヤーを作成し、指定されたコマンドを実行する準備をします。コンテナは起動しません。出力として長い文字列(コンテナ ID)が表示されるはずです。
コンテナが作成されたが実行されていないことを確認するには、停止中のコンテナも含めてすべてのコンテナをリスト表示します。
docker ps -a
出力結果に、my-ubuntu-containerという名前のコンテナがCreatedステータスで表示されているはずです。これでコンテナが正常に作成されたがまだ実行されていないことが確認できます。
作成したコンテナを起動して接続
前のステップでは、my-ubuntu-containerという名前の Docker コンテナを作成しましたが、起動はしませんでした。このステップでは、作成済みのコンテナを起動し、ターミナルをその標準入力・出力・エラーストリームにアタッチする方法を学びます。
コンテナを起動するには、docker startコマンドの後にコンテナ名を指定します。
docker start my-ubuntu-container
このコマンドはコンテナを起動しますが、デフォルトではバックグラウンドで実行されます。コンテナと対話するには、アタッチする必要があります。
実行中のコンテナにアタッチするには、docker attachコマンドの後にコンテナ名を指定します。
docker attach my-ubuntu-container
このコマンドを実行すると、ターミナルがコンテナのシェルに接続されます。Ubuntu コンテナ内のコマンドプロンプト(通常root@<container-id>:/#のような形式)が表示されるはずです。
コンテナ内に入ったら、コマンドを実行できます。例えば、オペレーティングシステムのバージョンを確認してみましょう。
lsb_release -a
コンテナ内で実行されている Ubuntu のバージョン情報が表示されるはずです。
コンテナを停止せずに抜けるには、Ctrl + Pを押した後にCtrl + Qを押します。これでターミナルがコンテナからデタッチされ、コンテナはバックグラウンドで実行されたままになります。
単純にexitと入力するか、アタッチ中にCtrl + Dを押すと、コンテナは停止します。
デタッチ後、実行中のコンテナをリスト表示して、コンテナがまだ実行中であることを確認できます。
docker ps
my-ubuntu-containerが実行中ステータスで表示されるはずです。
docker create コマンドでボリュームを初期化
このステップでは、docker create コマンドを使用して Docker ボリュームを初期化する方法を学びます。この方法では、コンテナイメージから初期データをボリュームに投入するために特別にコンテナを作成できます。
まず、ubuntu イメージから volume-initializer という名前の新しいコンテナを作成します。このコンテナは一時的にボリュームを初期化するために使用します。-v フラグを使用して初期化したいボリュームとコンテナ内のマウントポイントを指定します。ボリューム名を my-initialized-volume とし、コンテナ内の /app_data にマウントします。
docker create -v my-initialized-volume:/app_data --name volume-initializer ubuntu:latest
このコマンドはコンテナと、存在しない場合はボリュームも作成します。-v my-initialized-volume:/app_data の部分は、my-initialized-volume という名前のボリュームを作成し、コンテナ内の /app_data ディレクトリにマウントするよう Docker に指示します。
次に、このコンテナを起動します。ボリュームを持つコンテナが初めて起動されるとき、ボリュームが空の場合、Docker はマウントポイントで指定されたディレクトリの内容をイメージからボリュームにコピーします。
docker start volume-initializer
このコンテナは初期化専用で長時間実行されるプロセスを持たないため、起動後すぐに停止する可能性が高いです。
すべてのコンテナをリスト表示して、コンテナが停止したことを確認できます。
docker ps -a
volume-initializer が Exited ステータスで表示されるはずです。
my-initialized-volume ボリュームが作成されたことを確認するには、すべての Docker ボリュームをリスト表示します。
docker volume ls
ボリュームのリストに my-initialized-volume が表示されるはずです。
この時点で、my-initialized-volume ボリュームには ubuntu:latest イメージの /app_data ディレクトリにあった初期データが含まれています。
docker create で初期化したボリュームを別コンテナで使用
前のステップでは、一時的なコンテナを作成・起動することで my-initialized-volume という名前の Docker ボリュームを初期化しました。ここでは、この初期化済みボリュームを別のコンテナで使用する方法を学びます。これはボリュームがデータを永続化し、コンテナ間で共有できることを示しています。
まず、ubuntu イメージから data-consumer という名前の新しいコンテナを作成します。今回は既存の my-initialized-volume を新しいコンテナ内の /data ディレクトリに直接マウントして実行します。
docker run -it --name data-consumer -v my-initialized-volume:/data ubuntu:latest /bin/bash
このコマンドを分解してみましょう:
docker run: 新しいコンテナを作成して起動します-it: 擬似 TTY を割り当て、標準入力を開いたままにし、対話的な使用を可能にします--name data-consumer: 新しいコンテナにdata-consumerという名前を付けます-v my-initialized-volume:/data: 重要な部分です。既存のmy-initialized-volumeボリュームをdata-consumerコンテナ内の/dataディレクトリにマウントしますubuntu:latest: コンテナで使用するイメージを指定します/bin/bash: コンテナ内で実行するコマンドで、bash シェルを起動します
このコマンドを実行すると、data-consumer コンテナ内の bash シェルにアタッチされます。
data-consumer コンテナ内に入ったら、my-initialized-volume がマウントされている /data ディレクトリに移動します。
cd /data
このディレクトリの内容をリスト表示すると、前のステップで初期化されたデータを確認できます。具体的な内容は、ボリューム初期化時の ubuntu:latest イメージの /app_data ディレクトリにあった内容によります。
ls -l
Ubuntu イメージの /app_data ディレクトリから my-initialized-volume にコピーされたファイルやディレクトリが表示されるはずです。これにより、ボリュームが正常に初期化され、新しいコンテナで使用されていることが確認できます。
data-consumer コンテナから抜けるには、単に exit と入力します。
exit
これにより data-consumer コンテナが停止し、ホストマシンのターミナルに戻ります。
すべてのコンテナをリスト表示して、data-consumer コンテナが終了したことを確認できます。
docker ps -a
data-consumer が Exited ステータスで表示されるはずです。my-initialized-volume は依然として存在し、データを保持しています。
まとめ
この実験では、docker create コマンドを使用して Docker コンテナをすぐに起動せずに準備する方法を学びました。これにはイメージの取得、docker create を使用したイメージからのコンテナ作成、およびその「Created」ステータスの確認が含まれます。その後、作成したコンテナを起動してアタッチする方法を学び、コンテナの作成と実行が分離されていることを確認しました。
さらに、この実験では docker create を使用して Docker ボリュームを初期化し、その後この初期化済みボリュームを別のコンテナで使用する方法についても学びました。これにより、docker create が実行中のコンテナによってマウント・使用される前に、ボリュームなどのインフラストラクチャコンポーネントをセットアップするために使用できることが示されました。



