Dockerのコンテナとイメージとは
Dockerのイメージは、Dockerコンテナの構築ブロックです。イメージは軽量でスタンドアロンな実行可能パッケージであり、コード、ランタイム、システムツール、ライブラリ、設定を含む、ソフトウェアの実行に必要な全てが含まれています。Dockerコンテナは、Dockerイメージのランタイムインスタンスであり、アプリケーションが実行される隔離された一貫した環境を提供します。
Dockerイメージとコンテナには、次のようないくつかの利点があります。
-
ポータビリティ
アプリケーションは、さまざまなプラットフォーム上で一貫して実行され、スムーズな展開プロセスを確保します。 -
リソース効率
コンテナは軽量で、ホストシステムのリソースを共有するため、インフラストラクチャコストが削減されます。 -
スケーラビリティ
アプリケーションは、需要に応じて迅速にスケールアップまたはスケールダウンできます。 -
バージョン管理
イメージはバージョン管理され、必要に応じて以前のバージョンにロールバックできます。 -
コラボレーション
チームは、Docker Hubのようなレジストリを使用してDockerイメージを共有し、共同作業できます。
主要な用語
-
Dockerfile
Dockerイメージを作成するための命令を含むスクリプト -
Dockerイメージ
コード、ランタイム、システムツール、ライブラリ、設定を含む、軽量でスタンドアロンな実行可能パッケージ -
Dockerコンテナ
Dockerイメージのランタイムインスタンスであり、アプリケーションが実行される隔離された環境を提供 -
Dockerレジストリ
Dockerイメージを共有および配布するための中央サービス -
Docker Hub
Docker Incが維持するデフォルトのパブリックレジストリ -
データボリューム
Dockerコンテナによって生成され、使用されるデータを永続化するための仕組み
Dockerイメージ
DockerイメージはDockerコンテナの基盤となります。この章では、Dockerイメージの作成、管理、およびDockerイメージレジストリでの作業について掘り下げます。
Dockerイメージの作成
Dockerイメージを作成するには、Dockerfileを定義し、Dockerコマンドを使用してイメージをビルドする必要があります。
Dockerfile
Dockerfileは、Dockerイメージを構築するための命令を含むスクリプトです。ベースイメージで始まり、環境を構成するためのさまざまなコマンド、依存関係のインストール、およびアプリケーションファイルのコピーが続きます。以下は、単純なDockerfileの例です。
# 公式のPythonベースイメージを使用
FROM python:3.8
# ワーキングディレクトリを設定
WORKDIR /app
# 要件ファイルをコピーし、依存関係をインストールする
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# アプリケーションコードをコピー
COPY . .
# アプリケーションポートを公開
EXPOSE 8080
# アプリケーションを実行
CMD ["python", "app.py"]
Dockerイメージのビルド
Dockerfileを作成したら、同じディレクトリ内で次のコマンドを実行してDockerイメージをビルドできます。
$ docker build -t my_app:1.0 .
このコマンドにより、my_app
という名前のDockerイメージが1.0
のタグで作成されます。
Dockerイメージの管理
Dockerイメージをビルドした後は、それらを管理する必要があります。一般的なタスクには、イメージのリスト表示、削除、およびタグ付けがあります。
イメージのリスト表示
システム上で利用可能な全てのDockerイメージをリスト表示するには、次のコマンドを実行します。
$ docker images
イメージの削除
Dockerイメージを削除するには、次のコマンドを使用します。
$ docker rmi <IMAGE_ID>
<IMAGE_ID>
を削除するイメージの実際のIDに置き換えてください。
Dockerイメージレジストリ
Dockerイメージレジストリは、Dockerイメージを共有および配布するための中央サービスです。パブリックおよびプライベートレジストリがあります。
Docker Hub
Docker Hubは、Docker Incが維持するデフォルトのパブリックレジストリです。Docker Hubを使用して既存のイメージを検索し、自分自身のイメージを保存し、他の開発者と共同作業することができます。Docker Hubにイメージをプッシュするには、まずログインする必要があります。
$ docker login
次に、イメージをDocker Hubのユーザー名と希望するリポジトリ名でタグ付けします。
$ docker tag my_app:1.0 <USERNAME>/my_app:1.0
最後に、イメージをDocker Hubにプッシュします。
$ docker push <USERNAME>/my_app:1.0
プライベートレジストリ
Docker Hub以外にも、プライベートレジストリを使用してDockerイメージを保存および配布できます。プライベートレジストリは、オンプレミスまたはクラウドでホストされる場合があり、追加のセキュリティおよびアクセス制御オプションを提供します。一般的なプライベートレジストリサービスには、Google Container Registry、Amazon Elastic Container Registry、およびAzure Container Registryがあります。
プライベートレジストリにイメージをプッシュするには、まずイメージをレジストリのURLでタグ付けします。
$ docker tag my_app:1.0 <REGISTRY_URL>/my_app:1.0
次に、プライベートレジストリにログイン(必要に応じて)し、イメージをプッシュします。
$ docker login <REGISTRY_URL>
$ docker push <REGISTRY_URL>/my_app:1.0
Dockerコンテナ
Dockerコンテナは、Dockerイメージのランタイムインスタンスです。この章では、Dockerコンテナの作成、管理、およびネットワーキングとデータストレージングの操作について説明します。
Dockerコンテナの作成
Dockerコンテナは、docker run
コマンドを使用して作成できます。さまざまなオプションを使用してコンテナの動作をカスタマイズできます。
コンテナの実行
イメージから新しいDockerコンテナを作成して開始するには、次のコマンドを使用します。
$ docker run -d --name my_container -p 8080:8080 my_app:1.0
このコマンドは、my_app:1.0
イメージをベースにしてmy_container
という名前のコンテナを作成します。-d
フラグは、コンテナをデタッチドモード(バックグラウンド)で実行し、-p
フラグは、ホストのポート8080をコンテナのポート8080にマップします。
インタラクティブコンテナ
インタラクティブモードでコンテナを実行するには(デバッグや探索に便利)、-it
フラグを使用します。
$ docker run -it --name my_container my_app:1.0 /bin/bash
このコマンドは、新しいコンテナを開始し、その中にBashシェルを開きます。これにより、コンテナのファイルシステムとプロセスにアクセスできます。
Dockerコンテナの管理
Dockerコンテナを作成した後は、管理する必要があります。一般的なタスクには、コンテナのリスト表示、停止、および削除が含まれます。
コンテナのリスト表示
全ての実行中のDockerコンテナをリスト表示するには、次のコマンドを使用します。
$ docker ps
停止したコンテナを含めるには、-a
フラグを追加します。
$ docker ps -a
コンテナの停止
実行中のDockerコンテナを停止するには、次のコマンドを使用します。
$ docker stop <CONTAINER_ID>
<CONTAINER_ID>
を停止するコンテナの実際のIDに置き換えてください。
コンテナの削除
停止したDockerコンテナを削除するには、次のコマンドを使用します。
$ docker rm <CONTAINER_ID>
<CONTAINER_ID>
を削除するコンテナの実際のIDに置き換えてください。
ネットワーキングとデータストレージ
Dockerコンテナは、さまざまなネットワーキングオプションを介してお互いやホストシステムと通信できます。さらに、コンテナで生成されたデータは、データボリュームを使用して永続化できます。
コンテナネットワーキング
Dockerは、ブリッジ、ホスト、オーバーレイ、Macvlanなど、いくつかのネットワーキングオプションを提供しています。
-
ブリッジ
同じホスト上のコンテナ間のプライベートネットワークを提供するデフォルトのネットワークタイプです。 -
ホスト
ネットワークの分離を解除し、コンテナがホストのネットワークを直接使用できるようにします。 -
オーバーレイ
Swarm内の複数のDockerホスト間でコンテナが通信できるようにします。 -
Macvlan
コンテナにMACアドレスを割り当て、ネットワーク上で別の物理デバイスのように表示させます。
カスタムネットワークを作成するには、次のコマンドを使用します。
$ docker network create --driver bridge my_network
カスタムネットワークにコンテナを接続するには、コンテナを実行するときに--net
フラグを使用します。
$ docker run -d --name my_container --net my_network my_app:1.0
データボリューム
データボリュームは、Dockerコンテナで生成されたデータを永続化するために使用されます。ボリュームはDockerによって管理され、コンテナ間で共有できます。
新しいデータボリュームを作成するには、次のコマンドを使用します。
$ docker volume create my_data
コンテナにデータボリュームをマウントするには、コンテナを実行するときに-v
フラグを使用します。
$ docker run -d --name my_container -v my_data:/data