docker入門

-it
は、Docker コンテナを起動する際によく使われるオプションの組み合わせで、インタラクティブモードでターミナル(TTY)を割り当てるために使用されます。具体的には、以下の二つのオプションが組み合わさっています:
-
-i
または--interactive
:- このオプションはコンテナの標準入力(STDIN)を開いた状態に保ちます。つまり、ユーザーはコンテナに対してインタラクティブに入力を行うことができるようになります。
- 通常、Dockerコンテナは非対話型で実行され、コマンドが終了するとすぐにコンテナも終了します。しかし、このオプションを指定すると、コンテナ内で対話的にコマンドを実行できるようになります。
-
-t
または--tty
:- このオプションは仮想端末(TTY)をコンテナに割り当てます。これにより、コンテナ内でテキストベースのインターフェースを使用できるようになり、コンテナ内のシェルやコマンドラインツールをより使いやすくします。
- 例えば、Bashシェルやコマンドラインツールを使用する際に、コマンドプロンプト、カラーコーディング、テキストフォーマットなどが正しく表示されます。
-it
の組み合わせを使用することで、ユーザーはコンテナ内で対話的に操作を行い、コマンドラインツールやシェルを通常のターミナルウィンドウのように使用できます。これは、特にコンテナ内でデバッグや開発作業を行う際に非常に便利です。
例えば、docker run -it ubuntu:20.04
コマンドを実行すると、Ubuntu 20.04のコンテナが起動し、インタラクティブなBashシェルにアクセスできるようになります。ユーザーはこのシェルでコンテナ内部を探索し、各種コマンドを実行できます。

docker image inspect ubuntu:20.04
コマンドは、ubuntu:20.04
イメージに関する詳細な情報を取得するために使用されます。このコマンドは、指定されたDockerイメージのメタデータをJSON形式で表示します。
実行すると、以下のような情報が含まれることがあります:
- イメージID: イメージの一意識別子。
- リポジトリとタグ: イメージのリポジトリ名とタグ。
- 作成日時: イメージが作成された日時。
- 仮想サイズ: イメージの総サイズ。
- 環境変数: イメージ内で設定されている環境変数。
- コマンド: イメージが起動する際に実行するデフォルトコマンド。
- レイヤー情報: イメージを構成する各レイヤーの詳細。
- ネットワーキング設定: イメージに関連するネットワークの設定。
- ラベル: イメージに付与されている任意のラベル。
このコマンドは、イメージの内部構造、設定、履歴を理解するのに役立ちます。特に、イメージをカスタマイズする際や、特定のイメージに関する詳細情報が必要な場合に有用です。
実際にこのコマンドを実行するには、Dockerがインストールされている環境でコマンドラインを開き、上記のコマンドを入力します。出力される情報はかなり詳細であり、イメージに関するさまざまな技術的詳細を提供します。

docker container run -it ubuntu:20.04 pwd
コマンドは、Dockerを使用してUbuntu 20.04のコンテナを起動し、その中で pwd
(print working directory)コマンドを実行するために使われます。このコマンドは、コンテナ内の現在の作業ディレクトリを表示します。
コマンドの各部分は次のように機能します:
-
docker container run
: 新しいコンテナを作成して実行します。 -
-it
: このオプションはコンテナをインタラクティブモードで起動し、TTY(端末)を割り当てます。これにより、ユーザーはコンテナ内でコマンドを実行し、出力を見ることができます。 -
ubuntu:20.04
: 使用するDockerイメージを指定します。この例では、Ubuntu 20.04の公式イメージを指定しています。 -
pwd
: コンテナが起動した後に実行するコマンドです。pwd
コマンドは、コンテナ内の現在の作業ディレクトリを表示します。
このコマンドを実行すると、Dockerは以下の手順を踏みます:
-
指定されたイメージ(この場合は
ubuntu:20.04
)をベースに新しいコンテナを作成します。イメージがローカルにない場合は、Docker Hubから自動的にダウンロードします。 -
コンテナ内で
pwd
コマンドを実行します。このコマンドは、コンテナ内の現在のディレクトリ(通常はルートディレクトリ/
)を表示します。 -
コンテナ内の
pwd
コマンドの実行が完了すると、コンテナは終了します。
このコマンドは、特にDockerコンテナの内部構造を確認する際に役立ちます。また、コンテナのデフォルトの作業ディレクトリがどこになっているかを確認するのにも使われます。

echo "Hello World": echo は、引用符内のテキスト(この場合は "Hello World")を標準出力に出力するコマンドです。
>: この記号はリダイレクトオペレータです。echo コマンドの出力をファイルにリダイレクトし、その内容を指定されたファイルに書き込みます。
hello.txt: この部分はリダイレクトの対象となるファイル名です。このコマンドでは、出力される "Hello World" テキストが hello.txt という名前のファイルに書き込まれます。

docker container exec
コマンドは、Dockerで実行中のコンテナに対してコマンドを実行するために使用されます。このコマンドは、既に実行中のコンテナ内で追加のコマンドを実行する際に非常に便利です。
コマンドの基本的な使用法
コマンドの基本的な構文は次のとおりです:
docker container exec [オプション] コンテナ名 コマンド [引数...]
- コンテナ名: 実行したいコマンドを含む実行中のコンテナの名前またはIDです。
- コマンド: コンテナ内で実行したいコマンドです。
- 引数: コマンドに渡す任意の引数です。
よく使われるオプション
-
-it
: このオプションは、コンテナに対してインタラクティブなTTY(端末)を提供します。これにより、ユーザーはコンテナ内でシェルや他の対話型コマンドを使用できます。 -
-d
: 「デタッチモード」でコマンドを実行します。これにより、コマンドはバックグラウンドで実行され、コマンドプロンプトがすぐに戻ります。
使用例
例えば、既に実行中のUbuntuコンテナに対して、ls
コマンドを実行するには、以下のようにします:
docker container exec my-ubuntu-container ls
コンテナ内で対話式のBashシェルを起動するには、以下のようにします:
docker container exec -it my-ubuntu-container bash
このコマンドを使用すると、実行中のコンテナ内でBashシェルが起動し、コンテナ内でコマンドを実行できるようになります。
docker container exec
コマンドは、Dockerコンテナの管理やデバッグ、設定変更などに広く使用され、コンテナ化された環境での作業を大幅に簡素化します。

$docker container run -it {イメージ名} {実行してたいコマンド}
$docker container exec -it {コンテナ名} {実行してたいコマンド}

コンテナに名前を付ける方法は、コンテナを作成する際に docker run
コマンドを使用して行います。コンテナに名前を付けるには、--name
オプションをコマンドに追加し、その後に希望するコンテナ名を指定します。
コンテナに名前を付ける
基本的な構文は次のとおりです:
docker run --name [コンテナ名] [その他のオプション] イメージ名 [コマンド]
ここで、[コンテナ名]
は、作成するコンテナに割り当てたい名前です。この名前は、Dockerホスト内でユニークである必要があります。
例
例えば、Ubuntuイメージを使用して my-ubuntu-container
という名前のコンテナを作成し、対話型シェルを起動する場合、以下のコマンドを使用します:
docker run --name my-ubuntu-container -it ubuntu bash
このコマンドは、my-ubuntu-container
という名前で新しいUbuntuコンテナを作成し、対話型のBashシェルにアクセスします。
名前付きコンテナの利点
-
識別しやすい: コンテナに名前を付けると、そのコンテナを容易に識別でき、
docker ps
やdocker stop
などのコマンドで名前を使ってコンテナを指定できます。 - 管理が容易: 名前を使用することで、コンテナの管理がより簡単かつ直感的になります。
注意点
- コンテナ名はDockerホスト内で一意でなければなりません。同じ名前を持つ複数のコンテナを同時に実行することはできません。
- 一度削除されたコンテナの名前は再利用できます。また、既存のコンテナから名前を変更することはできません。名前を変更するには、コンテナを削除して新しい名前で再作成する必要があります。

Dockerコンテナの整理にはいくつかの便利なコマンドがあります。これらのコマンドを使用することで、不要なコンテナ、イメージ、ボリューム、ネットワークを効率的に削除し、システムを整理することができます。
1. 停止中のコンテナの一括削除
docker container prune
- このコマンドは、すべての停止中のコンテナを削除します。
2. 未使用イメージの削除
docker image prune
- これは、未使用のDockerイメージを削除します。タグがない(<none>と表示される)イメージがこのカテゴリに含まれます。
3. 未使用イメージ、コンテナ、ボリューム、ネットワークの削除
docker system prune
- このコマンドは、停止しているコンテナ、未使用のネットワーク、未使用のイメージ(デフォルトでは未タグのみ)、未使用のビルドキャッシュを削除します。
4. 未使用ボリュームの削除
docker volume prune
- Dockerで使用されていないボリュームを削除します。これにより、不要なデータが保存されたボリュームをクリアできます。
5. 未使用ネットワークの削除
docker network prune
- 未使用のDockerネットワークを削除します。
6. 全ての未使用オブジェクトの削除
docker system prune -a
- これは、使用されていないコンテナ、ネットワーク、イメージ(タグ付きおよびタグ無しのもの)、ビルドキャッシュを全て削除します。このコマンドは注意して使用する必要があり、特にタグ付きのイメージも削除される点に注意してください。
これらのコマンドを使用することで、Docker環境を効率的に整理し、ディスクスペースを節約し、システムのパフォーマンスを向上させることができます。ただし、これらのコマンドを使用する際には、削除するオブジェクトをよく確認し、重要なデータが失われないように注意してください。

docker container run --rm ubuntu:20.04 ls
コマンドは、新しいDockerコンテナを作成し、Ubuntu 20.04のイメージを使用して ls
コマンドを実行し、その後でコンテナを自動的に削除するために使用されます。このコマンドは主に一時的なタスクを実行する際に役立ちます。
コマンドの各部分は次のように機能します:
-
docker container run
: 新しいコンテナを作成して実行するコマンドです。 -
--rm
: このオプションは、コンテナが終了した後に自動的にコンテナを削除します。これにより、一時的なタスクに適したコンテナを作成でき、不要なコンテナがシステムに残らないようになります。 -
ubuntu:20.04
: 使用するDockerイメージです。この例ではUbuntu 20.04の公式イメージを使用します。 -
ls
: コンテナ内で実行されるコマンドです。この場合は、ls
コマンドが実行され、Ubuntu 20.04イメージのルートディレクトリの内容が表示されます。
このコマンドは、特にコンテナ内で単一のタスクを実行し、その結果をすぐに確認したい場合に有用です。コンテナの使用が完了すると、--rm
オプションによりコンテナが自動的にクリーンアップされます。これにより、一時的なファイルやデータがシステムに残らず、システムの整理が容易になります。

docker container rm -f priceless_euclid
コマンドは、Dockerで実行中のコンテナを強制的に削除するために使用されます。このコマンドは、特にコンテナが正常に停止しない場合や、何らかの理由で標準的な方法で削除できない場合に役立ちます。
コマンドの各部分は次のように機能します:
-
docker container rm
: この部分はDockerコンテナを削除するコマンドです。 -
-f
または--force
: このオプションは、コンテナを強制的に削除します。もしコンテナが実行中であれば、まずコンテナを停止し、その後削除します。通常、コンテナはdocker stop
コマンドで停止し、その後docker rm
コマンドで削除しますが、-f
オプションを使用するとこれらのステップが一つのコマンドで実行されます。 -
priceless_euclid
: これは削除したいコンテナの名前です。Dockerはコンテナにランダムな名前を割り当てます(この場合はpriceless_euclid
)が、コンテナ作成時に--name
オプションでカスタム名を設定することもできます。
このコマンドを使用すると、priceless_euclid
という名前のコンテナが強制的に停止し、その後削除されます。この操作は、コンテナが使用中のリソースを解放し、システムの整理を助けますが、強制削除は実行中のプロセスに影響を与える可能性があるため、慎重に使用する必要があります。

Dockerでコンテナを実行する際には、主に「デタッチドモード」と「フォアグラウンドモード」という二つのモードがあります。これらのモードは、コンテナの実行方法とユーザーとの対話の仕方を決定します。
デタッチドモード (Detached Mode)
- デタッチドモードでコンテナを実行すると、コンテナはバックグラウンドで実行され、コマンドラインまたはターミナルから即座に制御が戻ります。
- このモードは、コンテナを長期間実行するサーバーアプリケーションやバックグラウンドタスクに適しています。
- デタッチドモードでコンテナを実行するには、
docker run
コマンドに-d
または--detach
オプションを使用します。 - 例:
docker run -d nginx
フォアグラウンドモード
- フォアグラウンドモードでコンテナを実行すると、コンテナはターミナルやコマンドラインと直接結びつき、コンテナの標準出力がターミナルに表示されます。
- このモードは、アプリケーションのログを直接見たい場合や、コンテナ内で対話型アプリケーションを実行する場合に適しています。
- フォアグラウンドモードで実行するには、
docker run
コマンドに-it
オプション(インタラクティブモードとTTYを組み合わせたもの)を使用します。 - 例:
docker run -it ubuntu bash
モードの選択
- コンテナを実行する際には、その目的と必要性に応じて適切なモードを選択することが重要です。
- デタッチドモードは、バックグラウンドで継続的にサービスを提供するアプリケーションやプロセスに適しています。
- フォアグラウンドモードは、コンテナの動作を直接観察したり、コンテナ内で対話式の作業を行いたい場合に適しています。
どちらのモードも、Dockerコンテナの柔軟性と利便性を提供し、さまざまな用途や状況に対応するための重要な機能です。
bashをデタッチドで使う必要はほとんどない
nginxはHTTPサーバーを実行してログを出すだけになったりするので不便なので-bをつける

docker container attach
コマンドは、実行中のDockerコンテナの標準入出力とエラー出力に接続するために使用されます。このコマンドは、特にデタッチドモード(バックグラウンドモード)で実行されているコンテナに対して、対話的な操作を行いたい場合に便利です。
コマンド docker container attach 4cea9b1746c1
の構文を解説します:
-
docker container attach
: 実行中のコンテナに接続するためのコマンドです。 -
4cea9b1746c1
: 接続したいコンテナのIDまたは名前です。この例では、4cea9b1746c1
がコンテナIDになります。
コマンドの使用
このコマンドを実行すると、指定されたコンテナの標準入出力(STDOUT、STDIN)および標準エラー出力(STDERR)に接続されます。これにより、コンテナの現在の出力を見たり、コンテナ内で対話的な操作を行うことができます。
注意点
-
attach
コマンドを使用すると、コンテナの出力がターミナルに直接表示され、ターミナルの入力がコンテナに送信されます。 - コンテナから「デタッチ」するには、通常
Ctrl-p
、Ctrl-q
のキーシーケンスを使用します。これにより、コンテナを停止せずにターミナルから離れることができます。 - コンテナがフォアグラウンドモードで実行されている場合、
attach
コマンドを使用すると、コンテナの出力が表示されますが、コンテナがデタッチドモードで実行されている場合は、コンテナの出力が表示されないことがあります。
このコマンドは、Dockerコンテナのデバッグや対話的な作業を行う際に特に有用です。ただし、複数のターミナルから同じコンテナに attach
すると、各ターミナルの入力がコンテナ内で衝突する可能性があるため、注意が必要です。

実務では
Dockerfile(設計書)をコーディングしてオリジナルのDockerイメージを作っていく
hubにあるイメージは最低限の機能しかないのでカスタムする
コンテナのテンプレートであるイメージだけが持ち出せる
コンテナをカスタマイズしてもDockerのメリットをいかせない

docker image build {ディレクトリパス}
dockerfileのビルド

イメージにリポジトリ、タグに名前をつける
docker image build -t my-image:v1 .

Dockerfile内で apt update
を使用する理由や RUN
コマンドについてのご質問に対して、以下のように説明できます。
apt update
が必要なのか?
なぜ -
パッケージリストの更新:
apt update
コマンドは、Ubuntuのパッケージリストを更新します。これにより、利用可能なパッケージの最新情報が取得されます。Dockerイメージは、作成時点のパッケージリスト情報を持っていますが、時間が経過すると古くなるため、最新のパッケージ情報を取得するためにこのコマンドが必要になります。 -
パッケージのインストール:
apt install
コマンドを使用して特定のパッケージをインストールする前に、apt update
を実行することで、インストールされるパッケージが最新のものであることを保証できます。 -
依存関係の解決:
apt update
を実行することで、依存関係を持つパッケージも正しく更新され、インストール時のエラーを防げます。
RUN
コマンド
Dockerfile内の -
共通のLinuxコマンド:
RUN
コマンドは、Dockerイメージのビルド時にコマンドを実行するために使用されます。Dockerfile内のRUN
コマンドに指定するコマンドは、ベースとなるイメージのOSに依存します。この場合、Ubuntuイメージを使用しているため、Ubuntu(Debianベースのシステム)で使用されるapt
パッケージマネージャーのコマンドを使用しています。 -
カスタマイズとインストール:
RUN
コマンドを使用して、イメージ内でソフトウェアのインストール、設定のカスタマイズ、ファイルのコピーなどの操作を行います。これにより、特定のニーズに合わせたカスタムDockerイメージを作成することができます。
補足
-
Dockerfile内で
RUN apt update
とRUN apt install
を別々の行で実行すると、イメージのレイヤーが増えてしまいます。より効率的なDockerfileを作成するためには、これらのコマンドを一つのRUN
ステートメントに組み合わせることが推奨されます。例えば:RUN apt update && apt install -y curl
これにより、イメージのサイズが小さくなり、ビルドプロセスが最適化されます。

-y は事前にY/nを回答している

COPY ./hello.txt /app/
階層を指定してコピーする
ディレクトリ指定して勝手に作られる

ビルドコンテキスト(Build Context)とは、Dockerイメージをビルドする際にDockerデーモンに送信されるファイルとディレクトリのセットのことを指します。具体的には、docker build
コマンドを実行するディレクトリとその中のファイルがビルドコンテキストに含まれます。
ビルドコンテキストの重要性
-
アクセス可能なファイル: Dockerfile内で使用されるファイルやディレクトリは、ビルドコンテキスト内に存在する必要があります。例えば、
COPY
やADD
といった命令でファイルをイメージ内にコピーする場合、それらのファイルはビルドコンテキスト内に存在している必要があります。 -
パフォーマンス: ビルドコンテキストのサイズが大きいと、ビルドプロセスが遅くなる可能性があります。これは、大きなビルドコンテキストをDockerデーモンに転送するのに時間がかかるためです。不要なファイル(ビルドに関係ないファイル)を
.dockerignore
ファイルを使用して除外することで、ビルドのパフォーマンスを向上させることができます。
使用方法
docker build
コマンドを実行する際に、ビルドコンテキストとして指定するディレクトリをコマンドの最後に配置します。例えば、現在のディレクトリ(.
)をビルドコンテキストとして使用する場合は、以下のようになります:
docker build -t my-image .
このコマンドは、現在のディレクトリ内のファイルとディレクトリ(ビルドコンテキスト)を使用して、my-image
という名前のDockerイメージをビルドします。
補足
- ビルドコンテキストは、Dockerデーモンがイメージをビルドする際に使用するファイル群を定義します。ビルドコンテキスト外のファイルは、Dockerfile内で直接参照することができません。
- ビルドプロセスを効率化するためには、ビルドコンテキストを最小限に保ち、必要なファイルのみを含めることが重要です。不要なファイルをビルドコンテキストから除外するために
.dockerignore
ファイルを活用します。

docker image build -f docker/Dockerfile .
コマンドでは、ビルドコンテキストとDockerfileの場所が指定されています。このコマンドを分解して説明します:
-
-f docker/Dockerfile
:- この部分は、Dockerfileの場所を指定します。
-f
オプションに続いて、Dockerfileが存在するパス(この場合はdocker/Dockerfile
)が指定されます。これにより、Dockerは指定されたパスにあるDockerfileを使用してイメージをビルドします。
- この部分は、Dockerfileの場所を指定します。
-
.
(ドット):- コマンドの最後にある
.
は、ビルドコンテキストを指定しています。ドット.
は現在のディレクトリを表し、このディレクトリとその中のすべてのファイルとサブディレクトリがビルドコンテキストとしてDockerデーモンに送られます。 - ビルドコンテキストは、Dockerfile内の命令(例えば
COPY
やADD
)で参照されるファイルやディレクトリにアクセスするために使用されます。
- コマンドの最後にある
ビルドコンテキストの意味
ビルドコンテキストは、Dockerイメージをビルドする際に必要なすべてのファイル(ソースコード、設定ファイル、依存関係ファイルなど)を含むディレクトリです。Dockerはこのコンテキスト内のファイルにアクセスしてイメージをビルドします。コンテキスト外のファイルにはアクセスできません。
コンテキストとして現在のディレクトリ(.
)を指定すると、そのディレクトリ内の全てがDockerデーモンに送信されます。不要なファイルを除外するためには .dockerignore
ファイルを使用します。これにより、ビルドプロセスの効率化とセキュリティの向上が図られます。

dockerignore
イメージに含めたくないものを記述
重いファイルなど
↓500mbのファイルを作りコマンド
mkfile 500m largefile

CMD
CMD ["実行ファイル","パラメーター1","パラメーター2"]
コンテナ実行時のデフォルトコマンドを設定する
Dockerfileで1度しか使えない
複数のCMDがあれば、最後のCMDのみ有効
CMD ["ls", "-la"] でビルドしてrunさせるとls -a が実行される

Dockerイメージは、複数の「レイヤー」から構成されています。これらのレイヤーは、Dockerイメージをビルドする過程でそれぞれの命令(RUN
, COPY
, ADD
など)が実行されるたびに生成されます。イメージレイヤーの概念は、Dockerの効率的なストレージ管理とイメージの再利用を可能にします。
イメージレイヤーの特徴
-
イミュータブル (不変): 一度作成されたイメージレイヤーは変更されません。新しいレイヤーは既存のレイヤーの上に追加され、変更やアップデートがある場合は新しいレイヤーが作成されます。
-
キャッシュの再利用: ビルドプロセス中、Dockerは以前にビルドしたレイヤーをキャッシュとして保存します。同じ命令が再び実行された場合、Dockerはキャッシュから既存のレイヤーを再利用します。これによりビルド時間が短縮され、効率化が図られます。
-
共有と最適化: 異なるイメージが同じレイヤーを共有できるため、ディスクスペースが節約されます。例えば、複数のイメージが同じベースイメージ(例:
ubuntu
)を使用している場合、そのベースイメージのレイヤーは一度だけストレージに保存され、複数のイメージで共有されます。
レイヤーの生成
Dockerfile内の各命令は通常、新しいイメージレイヤーを生成します。例えば:
-
FROM ubuntu:20.04
- ベースイメージのレイヤー。 -
RUN apt-get update && apt-get install -y curl
-apt-get update
とapt-get install
の実行によるレイヤー。 -
COPY . /app
- ローカルファイルシステムからイメージへのファイルコピーによるレイヤー。
コンテナレイヤー
コンテナが実行されるとき、これらのイメージレイヤーの上に「書き込み可能なコンテナレイヤー」が追加されます。コンテナ内で行われるすべての書き込み操作(ファイルの作成、既存ファイルの変更など)は、この書き込み可能なレイヤーに保存されます。
結論
イメージレイヤーは、Dockerの効率的なイメージ管理と配布の基盤を提供します。レイヤーにより、イメージのビルド、共有、ストレージの使用が最適化され、Dockerイメージのサイズを小さく保ちながら迅速な配布が可能になります。

docker image history
コマンドは、指定したDockerイメージがどのように構築されたか、その履歴を表示するために使われます。このコマンドは、イメージを構成する各レイヤーが作成された過程と、それぞれのレイヤーのサイズを示します。
コマンドの使用法
基本的なコマンドの構文は以下の通りです:
docker image history [イメージ名]
-
[イメージ名]: 履歴を確認したいDockerイメージの名前です。タグを含めることもできます(例:
ubuntu:20.04
)。
出力される情報
docker image history
コマンドを実行すると、以下のような情報が表示されます:
- IMAGE ID: 各レイヤーを識別するためのID。
- CREATED: レイヤーが作成された時間。
-
BY: レイヤーを生成した命令。例えば、
RUN
コマンドやCOPY
コマンドなど、Dockerfileの各行がここに表示されます。 - SIZE: レイヤーのサイズ。
- COMMENT: コメントがある場合はここに表示されます。
使用例
例えば、ubuntu:20.04
イメージの履歴を確認するには、以下のコマンドを実行します:
docker image history ubuntu:20.04
このコマンドは、Ubuntu 20.04 イメージを作成する過程で生成された各レイヤーの情報を提供します。
用途
docker image history
コマンドは、イメージのサイズ最適化や問題解析に役立ちます。各レイヤーがどの命令によって生成されたかを知ることで、イメージのサイズが大きくなる原因を特定したり、ビルドプロセスをより効率的にする方法を見つけたりするのに有効です。また、イメージの構築プロセスを理解する上で重要な情報源となります。

イメージレイヤー 静的 後から変更できない
コンテナレイヤー 動的 あんまり意識することない

イメージの容量を小さくする
FROM ubuntu:20.04
RUN apt update
RUN apt install -y curl
RUN apt install -y vim
CMD ["bash"]
↓
FROM ubuntu:20.04
RUN apt update && apt install -y curl vim
CMD ["bash"]
RUNを多く書いたほうは1MB大きい
レイヤー構造意識することでサイズを小さくできる
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 40a0afc97690 56 seconds ago 176MB
<none> <none> 39274cd7e52d 3 minutes ago 177MB

レイヤー構造 キャッシュ
イメージレイヤー
イメージの変更差分が保存される
キャッシュがあり変更点の部分だけ実行される
開発状態のステータスによってRUNを小分けにした方がいい場合がある
初期段階ではRUNを小分けにしてビルド時間を短くする
RUNで追加する機能がほとんどきまっているときはRUNをまとめて容量を小さくする
なんでもかんでもRUNを少なくすればいいわけじゃない

ENV
ENV {キー1}={値1} {キー2}={値2}

ENV
命令はDockerfile内で環境変数を設定するために使用されます。これにより、イメージ内で実行されるアプリケーションやスクリプトに対して、重要な情報や設定を提供することができます。
ENV
の使い道
-
デフォルト環境変数の設定:
-
ENV
命令を使用して、コンテナ内で利用可能なデフォルトの環境変数を設定できます。例えば、アプリケーションの設定や実行時に必要なパラメーターを環境変数として指定します。
-
-
パス設定:
- ソフトウェアやツールのインストールパスを環境変数として設定することで、コンテナ内でこれらのツールを簡単に実行できるようになります。例えば、
ENV PATH /app/bin:$PATH
とすることで、/app/bin
ディレクトリにある実行可能ファイルをシステムパスに追加できます。
- ソフトウェアやツールのインストールパスを環境変数として設定することで、コンテナ内でこれらのツールを簡単に実行できるようになります。例えば、
-
ビルド時の設定:
- ビルドプロセス中に環境変数を設定して、ビルド行動をカスタマイズできます。例えば、ビルドの異なるステージで異なる設定を使用する場合などに便利です。
-
実行時の挙動の制御:
-
ENV
で設定された環境変数は、コンテナの実行時にアプリケーションの動作を制御するのに使われます。これにより、開発、ステージング、本番環境など、異なる環境でコンテナを実行する際の挙動を変更できます。
-
-
環境依存値の指定:
- アプリケーションが外部サービスやデータベースに接続する際の設定(例えば、データベースのホスト名やポート)を環境変数として設定します。
例
# Javaのホームディレクトリを設定
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk
# アプリケーションのデフォルトポートを設定
ENV PORT 8080
注意点
-
ENV
で設定された環境変数は、イメージ内で永続的に存在します。そのため、秘密情報やセキュリティに敏感なデータを含めることは避けるべきです。 -
docker run
コマンドの-e
オプションを使用して、実行時に環境変数をオーバーライドすることができます。
ENV
命令は、Dockerイメージとコンテナの挙動を柔軟に制御するための強力なツールです。

ARG
docker Bildをする際に変数をわたす
イメージ作成時に利用する変数をわたす
docker image build --build-arg message="Hello Message" .

ARG
命令は、Dockerfileにおいてビルド時の変数を定義するために使用されます。これにより、Dockerイメージのビルド時に外部から値を渡し、その値に基づいてイメージをカスタマイズすることができます。
ARG
の基本的な使用法
-
ARG
命令はDockerfile内で変数を定義し、その後の命令でこれらの変数を使用できるようにします。 - 変数の値は、
docker build
コマンドの実行時に--build-arg
オプションを使って設定します。
例
# Dockerfile
ARG VERSION=latest
FROM ubuntu:${VERSION}
このDockerfileでは、VERSION
という変数が定義されており、デフォルト値は latest
です。この変数は FROM
命令で使用され、どのUbuntuイメージのバージョンを使用するかを指定しています。
ビルド時に特定のバージョンを指定するには、以下のように --build-arg
オプションを使用します:
docker build --build-arg VERSION=18.04 -t myimage .
このコマンドでは、VERSION
変数に 18.04
を渡し、それに基づいてUbuntu 18.04をベースにしたイメージがビルドされます。
ARG
の特徴と注意点
-
ビルド時のみ有効:
ARG
で定義された変数はビルド時にのみ有効であり、生成されたイメージ内には保持されません。実行時の環境変数として使用するにはENV
命令を使用します。 -
デフォルト値の設定:
ARG
命令ではデフォルト値を設定できますが、ビルド時に--build-arg
で値を指定すると、その値が使用されます。 -
ビルドのカスタマイズ:
ARG
を使用することで、異なる設定やバージョンのイメージを同じDockerfileからビルドすることが可能になります。
ARG
命令は、イメージのビルドプロセスをより柔軟にし、さまざまなニーズや環境に適応するためのカスタマイズを可能にします。

Dockerfileで生きていれば十分な変数はARG
コンテナのなかでも使う変数はENV

ENV
と ARG
はともにDockerfileにおいて重要な命令ですが、それぞれ異なる目的と使用方法を持っています。
ENV
-
用途:
ENV
は環境変数を設定するために使用されます。これらの環境変数は、イメージビルド時とコンテナ実行時の両方で利用可能です。 -
永続性:
ENV
で設定された環境変数は、イメージに永続的に保存されます。つまり、イメージから生成されたコンテナは、これらの環境変数を継承します。 - 使用例: アプリケーションの設定、デフォルトのパス、外部サービスの接続設定など、コンテナ内のアプリケーションが実行時に利用する環境変数を設定するのに使用されます。
ARG
-
用途:
ARG
はビルド時の変数を定義するために使用されます。これらの変数は、docker build
コマンドの実行時に--build-arg
フラグを使用して値を渡すことができます。 -
スコープ:
ARG
で定義された変数は、イメージビルド時にのみ使用されます。イメージがビルドされると、これらの変数の値は失われ、コンテナ内では利用できません。 - 使用例: イメージをビルドする際に異なるバージョンのパッケージをインストールする、ビルドするアプリケーションのバージョンを指定するなど、ビルドプロセスをカスタマイズするために使用されます。
違いの要点
-
スコープ:
ENV
はビルド時と実行時の両方で環境変数を設定しますが、ARG
はビルド時のみ有効です。 -
永続性:
ENV
で設定された変数はイメージとコンテナで永続的に使用されますが、ARG
はビルドが完了するとそのスコープが終了します。 -
利用シナリオ:
ENV
は実行時のアプリケーション設定用、ARG
はビルド時のカスタマイズ用に使われます。
ENV
と ARG
の適切な使用は、Dockerイメージの効率的な構築と管理において重要です。それぞれの命令を理解し、目的に応じて適切に使用することが求められます。

WORKDIR {ディレクトリパス}
RUNやCMDなど作業ディレクトリを指定する
WORKDIR
命令は、Dockerfile内で作業ディレクトリ(カレントディレクトリ)を設定するために使用されます。WORKDIR
に指定されたディレクトリは、その後の RUN
, CMD
, ENTRYPOINT
, COPY
, ADD
などの命令の実行コンテキストとして機能します。
WORKDIR の使用法
-
ディレクトリの作成と移動:
WORKDIR
で指定したディレクトリが存在しない場合、Dockerはそのディレクトリを自動的に作成します。そして、指定したディレクトリをカレントディレクトリとして設定します。 -
命令の基準パス:
WORKDIR
で設定されたディレクトリは、その後の命令(例えばRUN
コマンドで実行するスクリプトやアプリケーションのビルド、COPY
でファイルをコピーする際の基準パス)の実行場所として機能します。
メールサーバーの設定例
WORKDIR
を使ってDockerfile内でメールサーバーの設定を行う場合、以下のようなプロセスを想定できます:
-
設定ファイルの配置場所を指定: メールサーバーの設定ファイルやスクリプトを配置するディレクトリを
WORKDIR
で指定します。WORKDIR /path/to/config
-
設定ファイルのコピー: ホストマシンから設定ファイルをコンテナ内の作業ディレクトリにコピーします。
COPY ./my-mail-config.conf .
-
設定スクリプトの実行: メールサーバーを設定するスクリプトやコマンドを
RUN
命令で実行します。RUN setup-mail-server.sh
-
サーバーの実行:
CMD
またはENTRYPOINT
を使って、メールサーバーの実行を指定します。CMD ["mail-server", "start"]
注意点
-
WORKDIR
は相対パスも扱うことができますが、明確性のために絶対パスを使用することが一般的です。 - メールサーバーの設定を行う場合、特定のポートの公開や環境変数の設定など、他のDockerfile命令も必要に応じて使用することになります。
WORKDIR
命令を利用することで、Dockerfile内での操作をより明確にし、環境を整理しやすくすることができます。これにより、複雑なアプリケーションやサービスの構築を容易に行えるようになります。

マルチステージビルドは、Dockerイメージを効率的に構築するためのテクニックです。これにより、最終的なイメージのサイズを小さく保ちながら、ビルドプロセスに必要なツールや依存関係を使用できます。マルチステージビルドの一般的な実例として、Go言語で書かれたアプリケーションのビルドプロセスを例に説明します。
マルチステージビルドの基本構造
マルチステージビルドでは、最初のステージでビルドに必要なツールやライブラリを含め、アプリケーションのコンパイルやビルドを行います。その後、別のステージで最終的な実行イメージを作成し、最初のステージでビルドした実行可能ファイルのみを最終イメージにコピーします。
Go言語アプリケーションの例
以下は、Go言語で書かれたアプリケーションをビルドするためのDockerfileの例です。
# 第一ステージ: ビルド環境
FROM golang:1.16 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .
# 第二ステージ: 実行環境
FROM alpine:latest
WORKDIR /root/
# 第一ステージでビルドした実行ファイルをコピー
COPY /app/myapp .
CMD ["./myapp"]
このDockerfileは、次のステップで構成されています:
-
ビルドステージ:
-
golang:1.16
イメージをベースに使用してビルド環境を作成します。これはGoのコンパイルに必要なすべてを含んでいます。 - アプリケーションのソースコードをコンテナにコピーし、
go build
コマンドでアプリケーションをビルドします。 - このステージのエイリアスは
builder
として設定されます。
-
-
実行ステージ:
- 軽量な
alpine:latest
イメージをベースに新しいステージを始めます。 -
COPY --from=builder
命令を使って、ビルドステージで作成された実行可能ファイルmyapp
を新しいステージにコピーします。 - 実行コマンド
CMD ["./myapp"]
を設定します。
- 軽量な
マルチステージビルドの利点
- イメージサイズの削減: 最終イメージには必要最小限のファイルのみが含まれるため、イメージサイズが小さくなります。
- セキュリティの向上: ビルドに必要なツールや依存関係が最終イメージに含まれないため、攻撃面が減少します。
- 効率的なキャッシュ利用: ビルドステージが変更されない限り、実行ステージのキャッシュは再利用され、ビルド時間が短縮されます。
マルチステージビルドは、Dockerイメージの効率的な管理と最適化に非常に有効な方法です。

COPY --from=0
0番目のFROMからコピーする
FROM gcc:12.2.0
WORKDIR /app
COPY ./hello.c .
RUN gcc hello.c
FROM ubuntu20.04
WORKDIR /app
COPY --from=0 /app/a.out .
CMD [ "./a.out" ]
FROMが2つあるのがマルチステージビルドの特徴

FROM gcc:12.2.0 AS compiler
WORKDIR /app
COPY ./hello.c .
RUN gcc hello.c
FROM ubuntu20.04
WORKDIR /app
COPY --from=compiler /app/a.out .
CMD [ "./a.out" ]
FROMにASで名前をつける

マルチステージビルドで複数環境向けイメージの管理
処理はこのベースのところに書きながら異なる差分の部分だけをそれぞれのプロダクションだったり、デベロップメントっていうステージに分けて書くことで、
共通部分を1カ所でまとめながら、さらに差分を別々でスイッチしたり、あとは複数のDOCKERファイルを書く必要がなくなるっていうのがマルチステージビルドで実現することができる
FROM ubuntu:20.04 AS base
RUN apt update
CMD [ "sh", "-c", "echo My name is $my_name" ]
FROM base AS development
ENV my_name=TEST
FROM base AS production
ENV my_name=Bob
docker image build --target development .
docker image build --target production .

Dockerストレージ
コンテナの中のデーターを永続化する方法っていうのは2種類あります。
ボリュームマウント
バインドマウント
というやり方です。
ボリューム領域
ボリューム領域っていうのはDOCKERが管理しつつ、独立した領域になっていて、複数のコンテナから接続することが可能です。
このボリューム領域っていうのは例えるならば、PCに接続された外付けハードディスクのようなイメージが適切かなと思います。

Dockerにおけるボリュームを扱うための主要なコマンドをいくつか紹介します。これらのコマンドは、ボリュームの作成、管理、削除などに使われます。
ボリュームの作成
-
新しいボリュームの作成:
docker volume create [ボリューム名]
ボリュームの一覧表示
-
全てのボリュームの一覧表示:
docker volume ls
ボリュームの詳細情報表示
-
特定のボリュームの詳細情報表示:
docker volume inspect [ボリューム名]
ボリュームの削除
-
特定のボリュームの削除:
docker volume rm [ボリューム名]
-
未使用の全てのボリュームの削除:
docker volume prune
ボリュームを使用したコンテナの起動
-
ボリュームをマウントしてコンテナを起動:
docker run -v [ボリューム名]:[コンテナ内のパス] [イメージ名]
例:
docker run -v myvolume:/data myimage
注意点
- ボリュームはDockerコンテナ間でデータを永続化し、共有するためのメカニズムです。
- ボリュームを削除する前には、重要なデータが失われないように注意が必要です。
-
docker volume prune
コマンドは、使用されていない全てのボリュームを削除するので、実行する際には特に注意が必要です。
これらのコマンドを使用することで、Dockerボリュームの効果的な管理が可能となります。ボリュームを使うことで、コンテナのデータを永続化し、コンテナが削除されてもデータを保持できます。

docker volume inspect my-volume
[
{
"CreatedAt": "2023-12-03T14:34:59Z",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/my-volume/_data",
"Name": "my-volume",
"Options": null,
"Scope": "local"
}
]
このvolumeがあるパスにはHOSTからはアクセスできない

docker run -v [ボリューム名]:[コンテナ内のパス] [イメージ名]
ボリューム領域とこのコンテナ内の絶対パスを同期

このボリューム領域っていうのは
それぞれのコンテナとは独立した領域なので、例えばコンテナ1だったり、コンテナ2あるいは両方を削除してしまっても、このマイボリュームの中に保存されたデータっていうのは残ったままになってます。

バインドマウント
Dockerでバインドマウントを扱う際に使用する主要なコマンドは、主にコンテナ起動時に docker run
コマンドで指定されます。バインドマウントを使用すると、ホストマシンのファイルシステム上のファイルやディレクトリをコンテナ内に直接マウントできます。
バインドマウントを使用したコンテナの起動
-
基本形式:
docker run -v [ホストのパス]:[コンテナのパス] [イメージ名]
例: ホストマシンの
/path/to/data
ディレクトリをコンテナの/app/data
にマウントする場合docker run -v /path/to/data:/app/data myimage
-
読み取り専用マウント:
マウントを読み取り専用に設定する場合は、:ro
を追加します。docker run -v /path/to/data:/app/data:ro myimage
注意点
- バインドマウントは、ホストのファイルシステムの特定のファイルやディレクトリをコンテナに直接マウントするため、コンテナからホストのファイルシステムへの直接的なアクセスが可能になります。
- このため、セキュリティ上のリスクを適切に理解し、信頼できるアプリケーションでのみ使用することが重要です。
- バインドマウントを使用すると、コンテナが削除されてもマウントされたデータはホストマシン上に残ります。
- バインドマウントのパスは、Dockerを実行しているホストマシン上の絶対パスを指定する必要があります。
バインドマウントは、開発環境での使用や、ホストマシン上のデータをコンテナで直接利用する場合に特に便利です。また、ログファイルや設定ファイルなど、コンテナ外部で編集が必要なファイルの管理にも使用されます。

バインドマウントする際フルパスを省略する方法
docker container run -it -v /Users/koalapanda/Desktop/Docker/my-dir/:/app ubuntu:20.04
docker container run -it -v $(pwd)/my-dir/:/app ubuntu:20.04

Dockerにおけるボリュームとバインドマウントの使い分けについて、以下に要点をまとめます。
ボリュームとバインドマウントの共通点と相違点
-
共通点: 両方ともコンテナ間でデータを共有するために使用され、データの永続化を可能にします。
-
相違点:
- ホスト側からのアクセス可能性: バインドマウントはホスト側のディレクトリに直接アクセス可能ですが、ボリュームは通常、ホスト側から直接アクセスすることはありません。
- ホスト環境への依存性: バインドマウントはホストの環境に依存しますが、ボリュームはホスト環境から独立しています。
ボリュームの使用シナリオ
- 推奨使用: Docker公式ドキュメントでは、データの永続化にボリュームの使用を推奨しています。これは、ホスト側からの外乱による副作用を減らすためです。
- 特定の使用例: データベースのコンテナなど、ホスト側からデータに直接アクセスする必要がない場合に適しています。
バインドマウントの使用シナリオ
- 開発環境: ホスト側のファイルに直接アクセスして、開発中のコードをコンテナ内で実行したい場合に適しています。
- ホスト側のデータ共有: ホストのディレクトリにアクセスし、複数のコンテナ間でデータを共有する必要がある場合に有効です。
まとめ
- ボリュームの使用: ホスト側の環境から独立したデータの永続化が必要な場合や、ホスト側からのアクセスが不要な場合に使用します。特にデータベースのようなデータ保持が重要なアプリケーションに適しています。
- バインドマウントの使用: 開発環境でのコードの実行や、ホスト側のデータに容易にアクセスしたい場合に使用します。ホストの環境に依存するため、使用時にはセキュリティや依存関係に注意が必要です。
ボリュームとバインドマウントを適切に使い分けることで、Dockerのデータ永続化のニーズに応じた効果的な環境を構築できます。

コンテナのポート制御
コンテナのネットワーク制御
ポートとは TCP/IPプロトコルで使われている用語
IPアドレスでサーバーを指定、そのサーバーでアプリが複数動いているかもしれない。
IPアドレスだけではどちらのアプリにアクセスしていいかわからないので、ポート番号も指定する。
Dockerのコンテナの場合はブラウザがホストマシンが外部に公開しているポート番号からコンテナのポート番号にアクセスできるよう設定する

Dockerでホストとコンテナのポートを紐づける(ポートフォワーディングを設定する)場合、docker run
コマンドの -p
オプションを使用します。このオプションを使うことで、コンテナのポートをホストの特定のポートにマッピングできます。
ポートマッピングの基本形式
docker run -p [ホストのポート]:[コンテナのポート] [イメージ名]
ここで、
- [ホストのポート]: ホストマシン上でアクセスするポート番号。
- [コンテナのポート]: コンテナ内で開かれているポート番号。
- [イメージ名]: 使用するDockerイメージの名前。
使用例
-
単一のポートをマッピングする例:
docker run -p 8080:80 nginx
この例では、ホストマシンのポート
8080
をコンテナのポート80
(nginxのデフォルトポート)にマッピングしています。 -
複数のポートをマッピングする例:
docker run -p 8080:80 -p 443:443 nginx
この例では、ホストのポート
8080
と443
を、それぞれコンテナのポート80
と443
にマッピングしています。
注意点
- ポートマッピングを設定する際には、ホスト側のポートが他のアプリケーションによって使用されていないことを確認する必要があります。
- セキュリティ上の理由から、不要なポートの露出は避けるべきです。必要なポートのみを公開してください。
- ポートマッピングは、コンテナが提供するサービスを外部に公開するために重要な機能です。特にウェブサーバーやデータベースサーバーなど、ネットワークを介してアクセスする必要のあるアプリケーションで使用されます。
このように、-p
オプションを使ったポートマッピングを通じて、Dockerコンテナ内のアプリケーションへのアクセスを容易にすることができます。

Dockerネットワーク
コンテナ同士の通信を簡単にしたり、不要なコンテナ同士の通信を防ぐために隔離する
docker network ls

docker container exec
コマンドは、実行中のDockerコンテナ内で新しいコマンドを実行するために使用されます。このコマンドは、既に起動しているコンテナ内で追加のプロセスを開始する際に非常に便利です。
docker container exec
の使用法
-
基本的な形式:
docker container exec [オプション] [コンテナ名] [コマンド]
ここで、
-
[オプション]: コマンドの実行方法を制御するオプション(例:
-it
)。 - [コンテナ名]: コマンドを実行するコンテナの名前またはID。
- [コマンド]: コンテナ内で実行するコマンド。
-
[オプション]: コマンドの実行方法を制御するオプション(例:
-
オプションの例:
-
-i
(または--interactive
): コンテナの標準入力を開いて対話式に保持します。 -
-t
(または--tty
): 疑似ターミナル(TTY)を割り当てます。
-
使用例
- コンテナ内で
bash
シェルを開始する例:このコマンドは、docker container exec -it my-ubuntu-1 bash
my-ubuntu-1
という名前のコンテナ内で対話型のbash
シェルを開始します。-it
オプションにより、ユーザーはこのシェルで直接コマンドを入力できるようになります。
exec
コマンドの利用シナリオ
- デバッグやトラブルシューティング: コンテナ内で直接コマンドを実行して、問題の診断やデバッグを行うことができます。
- コンテナ内でのタスク実行: データのバックアップ、設定の変更、ソフトウェアのインストールなど、実行中のコンテナで一時的なタスクを実行する際に使用します。
- 自動化スクリプト: コンテナ内でスクリプトやプログラムを実行するために、自動化スクリプトやCI/CDパイプラインから使用されることがあります。
docker container exec
は、コンテナ内での作業を柔軟に行うための強力なツールです。ただし、セキュリティ上のリスクを考慮し、必要な場合にのみ使用することが推奨されます。

ブリッジネットワーク内通信(名前解決)
自分で作ったネットワークだけで使える
curl http://172.18.0.2
↓
curl http://my-nginx-2

dockerhubにどのポートが空いてるかな、どの環境変数を使えばいいかなど書いてある

depends_on
は、Docker Composeで使用されるオプションの一つで、コンテナの起動順序を制御するために使われます。これは、特定のサービスが他のサービスに依存している場合(例えば、ウェブアプリケーションがデータベースサーバーに依存している場合など)に有用です。
depends_on
の基本的な使い方
-
docker-compose.yml
ファイル内で、あるサービスが他のサービスの起動を待つように設定することができます。 -
depends_on
オプションは、依存関係を持つサービスの名前をリスト形式で指定します。
例
以下は、docker-compose.yml
ファイルでの depends_on
の使用例です。
version: '3'
services:
web:
build: ./web
depends_on:
- db
ports:
- "5000:5000"
db:
image: postgres
この例では:
-
web
サービスはdb
サービスに依存しています。これはweb
サービスがdb
サービスが起動するまで開始しないことを意味します。 -
db
サービスはPostgresデータベースのイメージを使用します。
注意点
-
depends_on
は、依存するサービスが「起動」したことのみを保証します。サービスが完全に「利用可能」になるまで待つわけではありません。たとえば、データベースのサービスが起動しても、データベースが接続を受け付ける準備が整うまでにはさらに時間がかかる場合があります。 - 完全な起動準備が整うまで待つためには、追加のスクリプトやヘルスチェックを使用することが推奨されます。
-
depends_on
は、サービスの停止順序には影響しません。停止順序はDocker Composeによって制御されません。
depends_on
は、複数のサービスが相互に依存する複雑なアプリケーションの管理を容易にするために役立ちますが、依存するサービスの完全な起動を保証するものではないことを理解することが重要です。

cached
は、Dockerのバインドマウントにおいて使用されるオプションの一つです。これは、特にDocker for MacやDocker for Windowsなどの、Dockerがホストマシンのファイルシステムとの間でファイルを同期する必要がある環境で有用です。
cached
オプションの概要
-
パフォーマンスの改善:
cached
オプションは、ホストマシン上のファイルシステムとコンテナ間でのファイル同期を最適化します。このオプションは、特に読み込みが多い操作においてパフォーマンスを改善することを目的としています。 -
一貫性と遅延のトレードオフ:
cached
オプションを使用すると、ホスト上のファイルシステムの変更がコンテナに反映されるのに若干の遅延が生じる可能性があります。これは、パフォーマンスの向上と一貫性の維持の間のトレードオフです。
使用例
バインドマウントを定義する際に cached
オプションを使用する例:
services:
app:
volumes:
- ./api:/workspace:cached
この例では、ホストの ./api
ディレクトリがコンテナの /workspace
ディレクトリにマウントされています。cached
オプションにより、このマウントは読み込み操作を最適化するためにキャッシュされます。
注意点
-
cached
オプションは、特にファイルの読み込みが多い開発環境(例えば、ソースコードの編集やコンパイル)で有効です。 -
ファイルの書き込み操作に対しては、
delegated
オプションを検討することもできます。delegated
は、書き込み操作においてコンテナ側の変更がホストに反映されるのを遅延させることでパフォーマンスを改善します。 -
Docker for MacやDocker for Windowsなど、特定のプラットフォームでは、ファイルシステムのパフォーマンスに影響を与えるため、これらのオプションが特に重要になります。
cached
オプションは、ファイルシステムのパフォーマンスを向上させるための便利なツールですが、使用する際には一貫性とパフォーマンスのバランスを考慮することが重要です。

Visual Studio CodeのRemote Development Extensions
コンテナごとにVSCodeを動かす
デバッグをしやすくする
コンテナを使って隔離された空間で環境をつくる

vscodeで新しいウィンドウ
<をクリックしてドッカーコンテナを開くでディレクトリを選択
これでコンテナごとにVSCodeを動かす

ブラウザはなにも指定しなければ80番ポートを使う。
本番環境でも80番ポートを使う
リバースプロキシは、クライアントからのリクエストを受け取り、そのリクエストをサーバーの1つまたは複数に転送し、サーバーからの応答をクライアントに返す役割を果たすサーバーです。これは、サーバーの負荷分散、セキュリティ強化、キャッシング、SSL終端などの目的で広く利用されます。
リバースプロキシの必要性
-
セキュリティの強化: リバースプロキシはバックエンドサーバーを直接的な外部アクセスから隔離し、攻撃のリスクを低減します。
-
負荷分散: 複数のサーバー間でトラフィックを分散させ、システムのダウンタイムを防止します。
-
パフォーマンスの最適化: リクエストをキャッシュし、より速いレスポンスタイムを実現します。
-
SSL終端: SSL/TLSの処理をリバースプロキシで行い、バックエンドサーバーの負荷を軽減します。
開発環境と本番環境の例
-
開発環境:
- ブラウザからのリクエストは直接Webコンテナ(React)に送られ、UIのリソースが提供されます。
- JavaScriptがブラウザ上で実行され、APIリクエストはNode.jsが動作するAPIコンテナに直接送られます。
-
本番環境:
- ブラウザからの全てのリクエストはNGINXが動作するWebコンテナに送られます。
- NGINXは、APIリクエスト(例:
/api
へのリクエスト)をAPIコンテナに転送します。 - NGINXを使用することで、WebコンテナはAPIコンテナの具体的なIPアドレスを知る必要がなくなります。代わりに、ローカルホスト(またはDockerの名前解決機能を利用)でAPIコンテナにリクエストを転送できます。
結論
リバースプロキシの使用は、開発環境と本番環境でのアプリケーションの運用を最適化し、セキュリティ、パフォーマンス、可用性を向上させるために重要です。開発環境では、直接的なサーバーへのアクセスが行われますが、本番環境ではリバースプロキシを介してトラフィックを適切に管理し、セキュリティと効率性を確保します。

docker scan
コマンドが削除され、その代わりに docker scout
が導入されたようです。これは Docker のアップデートに伴う変更であり、セキュリティスキャンの機能が docker scout
コマンドに移行したことを示しています。
docker scout
の使用方法
docker scout
コマンドは、Docker イメージの脆弱性を分析するために使用されます。基本的な使用方法は以下の通りです。
docker scout <イメージ名>
このコマンドは、指定したDockerイメージの脆弱性スキャンを実行し、結果を表示します。
スキャンコマンドの更新
Docker のバージョンアップにより、古いコマンドが削除され、新しいコマンドが導入されることがあります。docker scan
コマンドが削除された場合、以下の手順で新しい docker scout
コマンドの使用を開始することができます。
-
Docker のドキュメントを確認: Docker の公式ドキュメント(Docker Documentation)を確認し、
docker scout
コマンドの詳細と使い方を理解します。 -
Docker のアップデート: Docker を最新バージョンにアップデートして、最新のコマンドと機能を利用できるようにします。
-
docker scout
コマンドの実行: 新しいコマンドを使ってイメージの脆弱性スキャンを実行します。docker scout getting-started
これにより、Docker イメージ getting-started
のセキュリティスキャンが実行され、その結果が表示されます。
注意点
- Docker のセキュリティスキャン: Docker のセキュリティスキャンは、イメージ内の既知の脆弱性を検出します。ただし、これはセキュリティの完全な保証ではなく、定期的なアップデートとセキュリティベストプラクティスの遵守が引き続き重要です。
- Docker のドキュメント: Docker は頻繁にアップデートされるため、最新の情報は常に公式ドキュメントで確認してください。