今回はDockerfileについて学習していきます。

前回の最後に中身を少しだけ見たやつだよね?

そうそう。

Dockerfileの概要をおさらいしてから、実際に中身を見て、Dockerfileからコンテナを作る流れまで、抑えていきましょう!

Dockerfileとは?

まずは簡単にDockerfileについておさらいしておきましょう。

コンテナを作るには、Dockerfileを作りdockerコマンドを実行する必要がありましたね。

そして、このDockerfileには、どんなコンテナを作るかの指示が書かれていました。

前回は詳しく内容を確認しませんでしたが、今回は、これらを1つづつ見ていきましょう!

FROM

まずはFROM命令です。

コンテナを作る際のベースイメージを指定します。

例えばここでは、nodeを動かすためのベースイメージを指定しており、こうすることであらかじめ必要なものが揃ったコンテナを簡単に用意することができます。

なお、Dockerfileは必ずFROM命令から書き始める必要があります。

指定するベースイメージってどこかに一覧が載っていたりするの?

いい質問だね。公式サイトに、公式が出しているDockerイメージ一覧のリンクがあったり、docker hub にも豊富なイメージが公開されているので、そちらから探してくることができます!

なるほど!

WORKDIR

続いて、WORKDIR命令はコンテナ内の作業ディレクトリを指定します。

ここで指定した場所で起動時などに実行されるコマンドが実行されます。

COPY

COPY命令はコンテナ内に、ホストマシン、つまり手元のコンピュータ内にあるファイル等をコピーして配置することができます。

例えばホストマシンのlocal-appというディレクトリの中にtestというディレクトリがあった場合、COPY local-app /app と記述しておけば、コンテナのappディレクトリの中にこのtestディレクトリが入った状態でコンテナが作成されます。

RUN

RUN命令はコンテナが生成されるとき、すなわちビルド時に実行するコマンドを指定できます。インストールコマンドなど、一番最初に実行しておきたいものを記述します。

EXPOSE

EXPOSE命令は、コンテナ側で使うポートを指定します。これにより、ホストマシン側からコンテナの3000番へアクセスすることができます。

実際には他の設定も必要ですがそれについては次回以降紹介する予定です。気になる方はコンテナのポート設定について調べてみてください!

CMD

CMD命令は、コンテナ実行時に実行するコマンドを指定します。

あれ?さっきのRUN命令と似てるね。

そうだね。RUNは、コンテナができた時に実行されますが、こちらは既にあるコンテナを再起動した際にも実行されます。

アプリ実行のコマンドなどを記述するのに適していますね。

また、これはデフォルトのコマンドを指定するためのものなのでこの後登場するdocker runコマンドのオプションなどで上書きすることもできます。

最初の””にコマンド、2つ目以降の””には引数やオプションを記述します。“”で囲まれた文字列をスペースで繋げたものが実行される、という認識でも大丈夫です。

この場合だと、npm start が実行されるんだね。

そうそう!

その他の命令

そのほかにも、環境変数を指定するENV命令、COPY命令とにているけれど圧縮ファイルの展開もしてくれるADD命令、CMDと似ているけれどデフォルトとは関係なく固定で実行してくれるENTRYPOINT命令、ホストマシン側にデータを持たせ消えないようにできるVOLUME命令などがあります。

Dockerfileからコンテナを作るには

続いては、Dockerfileをもとにコンテナを作成する流れをみてみましょう。

今回は、このようなDockerfileを用意してみました。

これは、Pythonファイルを実行するためのコンテナ...なのかな?

そうそう。

以前、別の動画で作成した、ターミナルでゲームを実行できるDungeonGame.pyというファイルをコンテナ内に配置し、コンテナ実行時にそれを実行し、ゲームを開始するという内容ですね。

なお、このイメージベースはPython3.11.2が既にインストール済みのものとなっています。

さて、コンテナを作るためにターミナルからコマンドを実行してみましょう。

docker build -t 作りたいイメージ名 .を実行することで、今開いているディレクトリ内のDockerfileにある命令をもとに、指定した名前でDockerイメージを作成します。

この-tって何?

これは、イメージ名やタグを指定するためのオプションだね。

今回はdungeon-gameというイメージ名をつけるために使用しています。

dockerイメージを作成したら、docker run -it dungeon-game コマンドで、コンテナを起動します。

-it オプションをつけることで起動後、コンテナの中に入ってターミナルをみているかのように操作することができます。

起動するとき...たしか、CMD命令でDungeonGame.pyを実行するように指定していたよね?

その通り。つまり、起動すると...

自動的に作成したゲームが始まります。

なお、今回はゲームが終了するとpythonスクリプトが終了するのでコンテナも自動的に終了します。

なるほど〜、こうやってDockerfileから、実際にコンテナを起動するんだね!

お疲れ様でした!

もしよければぜひ、Youtubeのチャンネル登録もよろしくお願いします!