曖昧なままにしていたDockerの基礎をまとめてみた

曖昧なままにしていたDockerの基礎をまとめてみた

こんにちは!TechJourney運営者の今井宏輔と申します!

本記事では、今まで曖昧なままにしてしまっていたDockerについて、理解を深めていきたいと思います。

Dockerを用いた仮想化技術の概念から、開発に必要な様々なコマンドを本記事で扱っていきたいと思います!

Dockerとは

コンテナのイメージ画像

Dockerとは、コンテナ仮想化技術を使って、アプリケーションを開発・配置・実行するための隔離された環境を提供するツールのことです。

と言っても想像しにくいですよね。「コンテナ」「仮想化」についてもっと具体的に深掘りします。

一般的にコンテナは、船の貨物船で荷物を運ぶときに使われる箱のことですよね。たくさん船に積み重ねられて、他の船に移したり、海外に荷物を送ったりに使われています。そしてこの箱は、非常に頑丈で外部の影響を受けにくいです。

このコンテナのように、ソフトウェア開発でのコンテナっていうのもPCやサーバーなどのマシン上で、独立して干渉されない仮想的な環境を持っています。

よって、周りの環境に依存しないため、macOSやWindows、Linuxでも基本的に同じ動作を行うことが可能です。

また、ホストOSの中でコンテナは複数起動できるので、フロントエンドのためのコンテナ、バックエンドのためのコンテナというように用意することができます。

しかし、コンテナ単体では動作することはできず、ホストOSの上で動作している必要があります。

Docker Desktopをインストール

Docker公式のDocker Desktopのインストール画面

以下のリンクにアクセスして、macOS、Windows、LinuxのOSに合わせて、インストールすることでDockerのコマンドが使えるようになります。

Dockerのイメージについて

Dockerを学ぶために、イメージという言葉はとても重要なキーワードになってきます。

Dockerのイメージとは

Dockerのイメージとは、Dockerのコンテナの設計書やレシピのようなものです。

イメージには、アプリケーションが動作するために必要なすべてのファイル、ライブラリ、依存関係、および実行時の設定が含まれています。

イメージは読み取り専用で、それ自体は不変ですが、コンテナを起動する際にはこのイメージに基づいて書き込み可能なコンテナレイヤーが追加されます。

これにより、元のイメージは変更されずに、複数のコンテナが同じイメージから独立して実行されることが可能になります。

イメージのダウンロード

イメージを取得する一般的な方法は、Docker Hubからのダウンロードです。Docker HubはDocker公式サイトであり、数多くの公開イメージが無料で提供されています。

イメージをダウンロードするには、ターミナルを開き、次のコマンドを実行します。

docker pull <イメージ名>

例えば、Webサーバーとしてよく使用されるnginxの最新イメージを取得するには、以下を実行します。

docker pull nginx

Ubuntuのような一般的なLinuxディストリビューションも同様に、最新のイメージをローカルにダウンロードできます。

docker pull ubuntu

ローカルマシンに存在するイメージ一覧を表示するコマンド

docker image ls

ローカルマシンに存在するイメージを削除するコマンド

docker image rm <イメージ名>

Docker Hubは誰でもイメージを公開できるため、マイナーなものやダウンロード数が低いものは、危険な可能性があるので気をつけける必要があります

コンテナのライフサイクル

コンテナのライフサイクルの概念から、実際のコマンドによる操作についてまとめていきます。

コンテナのライフサイクルについて

Dockerのコンテナのライフサイクル

Dockerコンテナのライフサイクルは、一連の段階を経て進行します。

まず、コンテナのライフサイクルはイメージから始まります。先ほど説明したように、イメージをもとにコンテナを作成します。イメージがローカルまたはリモートのレジストリから取得された後、それをもとにコンテナが初めて実行されます。

コンテナを実行する際には、Dockerがイメージをベースに新しい書き込み可能なコンテナレイヤーを作成し、このレイヤの上でアプリケーションが実行されます。実行が開始されると、コンテナは起動し、指定されたアプリケーションを開始します。

コンテナの状態は「実行中」となり、コンテナ内でプロセスがアクティブに動作しています。

コンテナの停止は、通常、コンテナ内で動作しているアプリケーションの終了またはユーザーが明示的に停止命令を送ることで発生します。停止命令を受け取ると、Dockerはコンテナ内のプロセスを適切に終了させ、その状態を「停止済み」とします。

最終的に、コンテナを削除することができます。削除プロセスでは、コンテナに関連するデータとともに、書き込み可能なコンテナレイヤーが破棄されます。これにより、システムからコンテナが完全に除去され、リソースが解放されます。

このように、Dockerコンテナは作成から実行、停止、そして削除というプロセスを経てライフサイクルが完了します。この一連の流れによって、アプリケーションのデプロイメントが効率的かつ迅速に行えるようになります。

コンテナの作成・停止・削除

イメージからコンテナを作成して起動する

docker container run <イメージ名>

ローカルマシンに存在するコンテナ一覧を表示するコマンド(-aオプションを加えることで起動していないコンテナも表示する)

docker container ls -a

起動中のコンテナを停止させるコマンド

docker container stop <コンテナ名>

コンテナを再起動するコマンド

docker container restart <コンテナ名>

コンテナのログを閲覧する

docker container logs <コンテナ名>

コンテナを削除するコマンド(Exitedの状態になっているコンテナしか削除できない)

docker container rm <コンテナ名>

コンテナの様々な操作

Dockerのコマンドやオプションは数多くあり、効率的に開発を進めることができます。

コンテナ操作の便利なコマンド

Ubuntuをベースとしたイメージをダウンロードして実行する

docker container run -i -t ubuntu
  • -i or –interactive
    コンテナの標準入力を開いた状態に保持する。これにより、ユーザーはコンテナ内部のシェルシェルに対して入力を行うことができるようになります。
  • -t or –tty
    仮想ターミナル(tty)をコンテナに割り当てます。これはコンテナに擬似ターミナルを提供し、コンテナがターミナルエミュレータとして機能することを可能にします。これにより、コンテナのセッションはターミナルウィンドウのように扱われ、コマンドラインの操作がより直感的で使いやすくなります。

イメージの詳細情報を表示するコマンド

docker image inspect <イメージ名>

コンテナを起動して任意のコマンドを実行させるコマンド

docker container run <イメージ名> <実行したいコマンド>

Up状態のコンテナのコマンドを実行させるコマンド

docker container exec <コンテナ名> <実行したいコマンド>

runとexecのコマンドは似ていますが、runはイメージからコンテナを新規で作成するのに対して、execは既存のコンテナを使用します。

コンテナ名を指定して、新規作成するコマンド

docker container run --name <任意のコンテナ名> <イメージ名>

Dockerを扱っていると、コンテナが多く残ってしまうことがあります。

以下のコマンドを使うと、コンテナの整理が便利になります。

停止済みのコンテナを一括で削除するコマンド

docker container prune

コンテナが起動して指定のコマンドが実行されたらすぐに削除するコマンド

docker container run --rm ubuntu ls

Upの状態になっているコンテナも強制的に削除するコマンド

docker container rm -f <コンテナ名>

フォアグラウンドモードとデタッチモード

Dockerでコンテナを実行する際には、フォアグラウンドモートとデタッチモードの2つの実行モードがあります。それぞれのモードの違いと実際のコマンド例を以下に示します。

フォアグラウンドモードでコンテナを実行すると、コンテナのプロセスが現在のターミナルセッションにアタッチされ、コンテナの標準出力と標準エラーがターミナルに直接表示されます。

コンテナはターミナルセッションと直接結びついており、コンテナが停止するとコントロールがターミナルに戻ります。このモードはコンテナの出力をリアルタイムで見たい場合や、コンテナ内で対話的なアプリケーションを実行したい場合に適しています。

以下はUbuntuコンテナをフォアグラウンドモードで実行するコマンドの例です:

docker container run -it ubuntu

このコマンドでは、-i(インタラクティブモード)と-t(仮想ターミナル割り当て)オプションが組み合わされています。

デタッチモードでコンテナを実行すると、コンテナはバックグラウンドで起動し、ターミナルからは切り離されます。コンテナは独立して実行され続け、ターミナルは他のコマンド入力のためにすぐに解放されます。

このモードは、サービスやバックグラウンドで実行させるプロセスに最適です。コンテナのログはdocker logsコマンドを使用して後から確認することができます。

以下はNginxコンテナをデタッチモードで実行するコマンドの例です:

docker container run -d nginx

このコマンドでは、-dオプションが使用されており、これによってコンテナがバックグラウンドで実行されます。

これらのコマンドを適切に使用することで、Dockerコンテナの管理が柔軟になり、開発や運用のニーズに応じた方法でコンテナを制御することができます。