DockerComposeを使ってVolumeを指定してコンテナを起動する
Dockerimageをつくるで、コンテナを作るための土台となる
イメージをつくることができました。
しかし、前回のようにコンテナ内に直接コードを置いたり
出力ファイルを書いたりすると、コンテナを削除して作り直したりするたびに
データが消えてしまいます。
Dockerは、 コンテナを起動・削除を繰り返し、シンプルで再現可能な環境を
利用するのが一般的です。
なので、コンテナ内でなにかしたい(コンテナ内でコマンドを実行したり、テストしたり)
したい場合は、Volumeを作成して、それをコンテナ内にマウントするようにします。
これは、PCの環境にNASの共有ドライブを接続したり、ドライブレターにマウントする
のと同じような感じです。
このあたりの処理をする場合、コマンドでやってもよいのですが
非常にめんどくさいので Docker Compose という機能を利用して
指定のイメージを起動できるようにします。
docker-compose.yml を準備する¶
まず、フォルダ構成。
Dockerのイメージを構築するのに必要なファイル(Dockerfile)と
コンテナ起動の設定ファイルとも言える docker-compose.yml をまとめたフォルダと
Dockerのコンテナでマウントするための src フォルダを用意します。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
docker-compose.yml はこんなかんじ。
version: "3" は、この compose の書式のバージョンのことで、お約束として書いておきます。
次に、起動したいコンテナの情報を services 以下に書きます。
今回は1つだけですが、この下に複数のコンテナを書いておいて
それを連携させるようなことも可能です。
起動したいコンテナは、 Dockerfile をベースにしてビルドする必要があります。
事前にビルド結果をDockerHubにあげておくとかもできますが
上の例のように、 build: 以下に dockerfile を指定することで、
Dockerfileからイメージをビルドして、そのイメージからコンテナを起動する...というように
一連の処理を自動化することができます。
そして volumes の指定。
書き方は ローカル環境のディレクトリ:マウント先
のように書きます。
なので、ここでは src ディレクトリを、コンテナ内から参照するという意味になります。
working_dir は、コンテナを起動したときのデフォルトディレクトリです。
今回はマウントしたディレクトリがワークディレクトリになるようにしました。
stdin_open: true は、コマンドラインからコンテナを起動した場合、
エラーになってしまうのの対策です。
準備ができたら、VSCodeから起動します。
Docker Compose Up を実行すると、
イメージのビルドが走り、コンテナを起動することができます。
起動できたら、Dockerの CONTAINERSからAttach Visual Studio Code
をクリックして、コンテナのにアタッチします。
アタッチしたら、フォルダーをワークスペースに追加を選び、
/work_dir を選択します。
コンテナにアタッチした状態でも、Volumeで指定したローカルPCの
ディレクトリがマウントできているのがわかります。
これで、コンテナを削除→起動し直した場合も
コンテナはリセットされますが、各種データは残った状態になります。