Docker - 指令コマンド

こんにちは、未来のDocker魔法使いさんたち!私は、このDockerコマンドの世界をお手伝いするガイドとして、とても嬉しいです。コンピュータサイエンスを教えてきた経験から言えることですが、Dockerは開発者にとって魔法の杖のような存在です。私たちの生活を大幅に楽にしてくれます!それでは、腕をまくって、Dockerの指示コマンドの魅力的な領域に飛び込みましょう。

Docker - Commands

CMD 指令

CMD指令は、映画の主役のようなものです - Dockerコンテナに関して言えば、ショーのスターです。コンテナが起動する際に実行するコマンドをDockerに指示します。

基本構文

CMD ["実行ファイル", "パラメータ1", "パラメータ2"]

簡単な例で説明しましょう:

FROM ubuntu
CMD ["echo", "Hello, Docker World!"]

この場合、コンテナを実行すると「Hello, Docker World!」がコンソールに表示されます。コンテナが起動した瞬間にこんにちはを波状にするようなものです!

複数のCMD指令

ちょっとした質問です:Dockerfileに複数のCMD指令がある場合、どうなるのでしょう?

FROM ubuntu
CMD ["echo", "First command"]
CMD ["echo", "Second command"]

両方のコマンドが実行されると思ったかもしれませんが、それは間違いです!実際には、最後のCMD指令だけが実行されます。劇の最終幕が重要になるようなものです!

シェル形式とexec形式

CMDは以下の2つの形式で記述できます:

  1. シェル形式: CMD コマンド パラメータ1 パラメータ2
  2. exec形式: CMD ["実行ファイル", "パラメータ1", "パラメータ2"]

exec形式が推奨されます。これは、より明確でシェルのパースによる問題を避けるためです。

ENTRYPOINT

CMDが主役ならば、ENTRYPOINTは私たちのDocker映画の監督です。コンテナのメインコマンドを設定し、コンテナが起動した際にはオーバーライドできないものです。

基本構文

ENTRYPOINT ["実行ファイル", "パラメータ1", "パラメータ2"]

例を見てみましょう:

FROM ubuntu
ENTRYPOINT ["echo", "Hello from"]
CMD ["Docker"]

このコンテナを実行すると「Hello from Docker」と表示されます。しかし、ここでの興味深い点是、コンテナを実行時に追加の引数を指定すると、CMDはオーバーライドされるがENTRYPOINTは変わらないことです。

docker run myimage World

これは「Hello from World」と表示されます。ENTRYPOINTが舞台を設定し、CMD(またはランタイム引数)がそれを実行するようなものです!

ENV

ENVは私たちのDockerプロダクションの衣裳部門のようなものです。コンテナ全体で使用できる環境変数を設定します。

基本構文

ENV キー=値

実用的な例を見てみましょう:

FROM ubuntu
ENV MY_NAME="Docker Enthusiast"
CMD ["sh", "-c", "echo Hello, $MY_NAME!"]

これはコンテナが実行された際に「Hello, Docker Enthusiast!」と表示されます。コンテナに名札を渡すようなものです!

複数のENV指令

CMDとは異なり、複数のENV指令を設定することができ、すべてが有効になります:

FROM ubuntu
ENV MY_NAME="Docker Enthusiast"
ENV MY_DOG=Rex MY_CAT=Fluffy
CMD ["sh", "-c", "echo Hello, $MY_NAME! Your pets are $MY_DOG and $MY_CAT."]

このコンテナはあなたに挨拶し、ペットを紹介します!

WORKDIR

WORKDIRは私たちのDockerプロダクションのセットデザイナーのようなものです。Dockerfile内のそれに続くすべてのコマンドのための作業ディレクトリを設定します。

基本構文

WORKDIR /パス/まで/ディレクトリ

実際に見てみましょう:

FROM ubuntu
WORKDIR /app
COPY . .
CMD ["ls", "-l"]

このDockerfileは作業ディレクトリを/appに設定し、現在のディレクトリの内容をコピーし、コンテナが実行された際にその内容をリスト表示します。コンテナに「このディレクトリで気持ちよく過ごして」と言うようなものです!

複数のWORKDIR指令

WORKDIRは複数回使用してディレクトリを変更することができます:

FROM ubuntu
WORKDIR /app
WORKDIR src
WORKDIR scripts
RUN pwd

これは/app/src/scriptsを表示します。コンテナに新しい家のツアーをさせるようなものです!

すべてを組み合わせる

今までのDocker指令をすべて紹介しましたが、実際のシナリオでどのように組み合わせるか見てみましょう。シンプルなPythonウェブアプリケーションを作成しているとします:

FROM python:3.9-slim

# 環境変数を設定
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# 作業ディレクトリを設定
WORKDIR /app

# 依存関係をインストール
COPY requirements.txt .
RUN pip install -r requirements.txt

# プロジェクトをコピー
COPY . .

# アプリケーションを実行するコマンド
ENTRYPOINT ["python"]
CMD ["app.py"]

このDockerfileはPython環境を設定し、依存関係をインストールし、アプリケーションコードをコピーし、アプリケーションの実行方法を指定します。完璧な環境を作るためのレシピのようなものです!

コマンドの摘要

ここで紹介したコマンドの簡単な参照表を以下に示します:

コマンド 説明
CMD コンテナが起動時に実行するコマンドを指定 CMD ["python", "app.py"]
ENTRYPOINT コンテナのメインコマンドを設定 ENTRYPOINT ["python"]
ENV 環境変数を設定 ENV MY_VAR=値
WORKDIR 作業ディレクトリを設定 WORKDIR /app

これらのコマンドは、Dockerコンテナの構築ブロックのようなものです。これらを組み合わせて、アプリケーションに最適な環境を作成しましょう!

そして、ここまで、私達はDocker指令コマンドの土地を旅しました。CMDからENTRYPOINT、ENVやWORKDIRまで。このガイドがあなたのDocker冒険の道を照らしてくれたことを願っています。実践は熟達の鍵ですので、これらのコマンドを試してみてください。ハッピードッキング!

Credits: Image by storyset