一、Docker の用途#
Docker の登場により、アプリケーション環境の設定、配布、テストがより簡単になりました。
例えば、あなたが Web アプリケーションを作成し、ローカルでデバッグに問題がなかった場合、友人に見せたり、サーバーにデプロイしたりしたいと思ったとき、
まず、同じソフトウェアと環境を設定する必要があります。例えば、データベース、Web サーバー、必要なプラグインやライブラリなどです。
また、ソフトウェアが正常に動作することを保証することはできません。
なぜなら、まったく異なるオペレーティングシステムを使用している可能性があるからです。同じ Linux を使用していても、各ディストリビューションには微小な違いがあります。
そのため、完全に同じローカル開発環境をシミュレートするために、仮想マシンを考えることになります。
しかし、仮想マシンはハードウェア全体をシミュレートし、オペレーティングシステム全体を実行する必要があるため、サイズが大きく、メモリの使用量が高く、プログラムのパフォーマンスにも影響を与えます。
そこで Docker を使用する必要があります。
二、Docker の紹介#
Docker は仮想マシンに似ていますが、はるかに軽量です。
Docker は基盤となるハードウェアをシミュレートすることはなく、各アプリケーションに完全に隔離された実行環境を提供します。
環境内で異なるツールソフトウェアを設定でき、異なる環境間で影響を受けることはありません。
この環境は Docker 内で **Container(コンテナ)** と呼ばれます。
この時、Docker 内の 3 つの重要な概念について触れざるを得ません。
1、Image / イメージ#
イメージは仮想マシンのスナップショットと理解できます。
そこにはデプロイするアプリケーションとそれに関連するすべてのライブラリ、ソフトウェアが含まれています。
イメージを通じて、異なるContainerを複数作成できます。
2、Container / コンテナ#
ここでの Container は仮想マシンのようなものです。
その中でデプロイされたアプリケーションが実行されています。
各 Container は独立して実行されており、互いに影響を与えません。
3、Dockerfile#
これは主に Image イメージを作成するために使用されます。
仮想マシンにオペレーティングシステムと実行環境をインストールするのと同じように理解できます。
ただし、Dockerfile という自動化スクリプトを使用して実行されます。
三、Docker のインストール#
詳細はノートを参照してください。
四、Dockerfile の設定#
プロジェクト内に dockerfile ファイルを作成します。
FROM node:latest
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000
CMD ["npm", "start"]
1、まず FROM コマンドで基本イメージ(Base Image)を指定する必要があります。#
Docker Hub には多くの高品質なオペレーティングシステムイメージが提供されており、異なるオペレーティングシステムは異なるパッケージ管理ツールを提供します。例えば、Ubuntu の apt などです。
また、特定の言語やフレームワーク用に開発されたイメージもあります。例えば、Python、Nginx、Node、Tomcat などです。
FROM Node:Latest
の後にはバージョンまたはタグが続きます。
2、Docker コマンドの作業パス(work directory)を指定します。#
WORKDIR /app
このコマンドは、このコマンド以降のすべての Docker コマンドの作業パスを指定します。
このパスが存在しない場合、Docker は自動的に作成します。これにより、絶対パスを使用したり、手動で cd コマンドを使用してパスを切り替えたりする必要がなくなり、プログラムの可読性が向上します。
3、プログラムを Docker イメージにコピーします。#
COPY . .
COPY <ローカルパス> < ターゲットパス >
最初のパラメータはローカルパスで、**“.”** はプログラムのルートディレクトリ内のすべてのファイルを表します。
2 番目のパラメータは Docker イメージ内のパスで、ここでの **“.”** は現在の作業パスを表します。
.dockerignoreで除外されたパスを除いて、すべてコピーされます。
4、コマンドを実行します。#
イメージを作成する際に任意の Shell コマンドを実行します。
ここでは node を使用しているため、npm install を使用してこのプログラムに関連するすべてをインストールします。
RUN npm install
5、ポートを公開します。#
EXPOSE 3000
コンテナの 3000 ポートを公開し、外部からこのポートに接続できるようにします。
6、Docker コンテナが実行された後にコマンドを実行します。#
最後に CMD を使用して、Docker コンテナが実行されたときに実行するコマンドを指定します。
CMD ["npm", "start"]
ここでのコンテナ ≠ イメージに注意が必要です。
さらに、RUN とは異なり、RUN はイメージを作成する際に使用され、CMD はコンテナを実行する際に使用されます。
これで自動化スクリプト dockerfile が完成しました。
五、イメージの作成#
docker build コマンドを実行してイメージを作成します。
docker build -t my-blog .
-tはイメージの名前を指定します。
最後の **.** は、Docker に現在のディレクトリで dockerfile を探すように指示します。
初めて実行すると、少し時間がかかります。
Docker は必要なイメージファイルをダウンロードするためです。
その後、再実行すると、以前のすべての操作がキャッシュされるため、はるかに速くなります。
これは Docker 内で ** レイヤー(Layers)** と呼ばれています。
六、コンテナの起動#
イメージができたら、docker run を使用してコンテナを起動できます。
docker run -p 3000:3000 -d my-blog
ここでの **-p** は、コンテナの特定のポートをローカルホストにマッピングします。
これにより、ホストからコンテナ内の Web アプリケーションにアクセスできるようになります。
前の 3000 はローカルホストのポートで、後の 3000 はコンテナのポートです。
後の **-d** は、コンテナをバックグラウンドで実行させ、コンテナの出力がコンソールに直接表示されないようにします。
この時、ローカルの localhost:3000 を開くとアクセスできます。
七、Docker Desktop の操作#
Docker Desktop でこのアプリケーションのバックグラウンドでのすべての出力を見ることができます。
Container パネル#
Containerパネルには、現在実行中のすべてのコンテナが表示され、**停止、再起動、または削除**を選択できます。
また、Shell を通じてこのコンテナをリモートデバッグすることもできます。
以下はそれに対応するコマンドライン指令です。
ただし、このコンテナを削除すると、以前に行った変更や新しく追加したデータはすべて失われます。
まるで仮想マシンを削除したかのように、内部のデータもすべて消去されます。
コンテナ内のデータを保持する必要がある場合は、Docker が提供するボリューム(volume)データボリュームを使用できます。
八、Volume データボリューム#
これを**ローカルホストと異なるコンテナ間で共有されるフォルダ**と考えることができます。
例えば、あるコンテナ内で特定のボリュームのデータを変更すると、他のコンテナにも同時に反映されます。
1、データボリュームを作成します。#
docker volume create my-blog-data
上記のコマンドを使用してデータボリュームを作成できます。
2、データボリュームを指定します。#
コンテナを起動する際に、-vパラメータを使用してデータボリュームを指定します。
このデータボリュームをコンテナ内のどのパスにマウント(mount)するかを指定します。
docker run -p 3000:3000 -v my-blog-data:/etc/blogData my-blog
ここでは my-blog-data を /etc/blogData というパスにマウントしています。
このパスに書き込まれたデータはすべて、このデータボリュームに永続的に保存されます。
九、複数のコンテナの協力#
実際の使用では、複数のコンテナを使用することがよくあります。
例えば、1 つのコンテナで Web アプリケーションを実行し、別のコンテナでデータベースを実行します。
これにより、データとアプリケーションロジックの効果的な分離が実現できます。
Web プログラムがダウンしても、データベースは引き続き正常に動作します。この場合、Web コンテナを修正するだけで済みます。
そしてdocker composeはこれを実現できます。
十、Docker Compose#
1、docker-compose.yml ファイルを作成します。#
version: '3'
services:
web:
build:
ports:
- "3000:3000"
db:
image: "mysql"
environment:
MYSQL_DATABASE: blog
MYSQL_ROOT_PASSWORD: password
volumes:
- my-blog-data:/var/lib/mysql
volumes:
my-blog-data:
このファイル内で、services を使用して複数のコンテナを定義します。
例えば、web コンテナで Web アプリケーションを実行し、mysql コンテナでデータベースを実行します。
データベースのコンテナ内で、環境変数としてデータベース名と接続パスワードを追加できます。
また、データを永続的に保存するためのデータボリュームを指定することもできます。
2、docker compose を実行します。#
docker compose up -d
コマンドを使用して、すべてのコンテナを実行します。
ここでの **-d** も、すべてのコンテナをバックグラウンドで実行することを示します。
3、すべてのコンテナを停止して削除します。#
docker compose down
ただし、新しく作成されたデータボリュームは手動で Docker Desktop で削除する必要があります。
または、コマンドの後に--volumes
パラメータを追加します。
上記の操作はすべて Docker Desktop でも実行できます。