Docker-Compose を使用して新しいイメージからコンテナーを再作成する

David Mbochi Njonge 2023年6月20日
  1. 新しいプロジェクトを作成する
  2. キャッシュを使用してイメージを再構築する
  3. キャッシュなしでイメージを再構築する
  4. まとめ
Docker-Compose を使用して新しいイメージからコンテナーを再作成する

アプリケーションを開発するときは、通常、アプリケーションを操作するさまざまなユーザーにとってアプリケーションをより効果的にするために、変更を加えたり機能を追加したりします。

Docker を使用する場合、イメージを再構築し、このイメージから新しいコンテナーを実行することにより、加えられた変更または機能がメイン アプリケーションに確実に更新されるようにする必要があります。 このチュートリアルでは、Docker Compose を使用して新しいイメージからコンテナーを再作成する方法を説明します。

新しいプロジェクトを作成する

WebStorm IDEA で、File > New > Project を選択して新しいプロジェクトを作成します。 次に、空のプロジェクトを選択し、プロジェクト名を無題からdocker-compose-no-cacheに変更するか、任意の名前を使用します。

Create というラベルの付いたボタンを押して、プロジェクトを生成します。 現在のフォルダーの下に index.html という名前のファイルを作成し、次のコードをコピーして貼り付けます。

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap demo</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css"
          rel="stylesheet"
          integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi"
          crossorigin="anonymous">
</head>
<body>
<div class="card">
    <div class="card-header">
        Featured
    </div>
    <div class="card-body">
        <h5 class="card-title">Special title treatment</h5>
        <p class="card-text">With supporting text below as a natural lead-in to additional content.</p>
        <a href="#" class="btn btn-primary">Go somewhere</a>
    </div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
        crossorigin="anonymous"></script>
</body>
</html>

このファイルは Bootstrap を使用して、アプリケーションのイメージからコンテナーを実行するときにカードを表示する Web ページを作成します。 このページを使用して、コンテナが実行されているかどうかを確認します。

イメージを定義する

現在のフォルダーの下にDockerfileという名前のファイルを作成し、次の手順をコピーしてファイルに貼り付けます。

FROM nginx:1.22.0-alpine
COPY . /usr/share/nginx/html

FROM - 後続の命令を使用してカスタム イメージを作成するベース イメージを設定します。 この場合、ベース イメージを Nginx として設定し、alpine を使用して Nginx の軽量バージョンをプルしました。
COPY - 現在のディレクトリ内のファイルとフォルダを、イメージ内のファイル システムの場所にコピーします。 この場合、現在のディレクトリ内のすべてのファイルを /src/share/nginx/html にコピーしました。

Compose ファイルを使用してコンテナーを定義する

現在のフォルダーの下に compose.yaml という名前のファイルを作成し、次の手順をコピーしてファイルに貼り付けます。

services:
  web-app:
    restart: on-failure
    build: ./
    hostname: web-app-service
    ports:
      - '80:80'

このファイルは、ホストのポート 80 を公開してコンテナのポート 80 でリッスンする web-app という名前のサービスを定義します。 このファイルは、ターミナル上のコンテナーよりも簡単にコンテナーを管理する方法を提供します。

イメージをビルドしてコンテナーを実行する

イメージを作成するのはこれが初めてなので、基本イメージがプルされ、Dockerfile で定義された手順を使用してカスタム イメージを作成するために使用されます。 compose.yaml ファイルで定義されたコンテナーも作成され、ネットワークに追加されます。

コンピューターでキーボード ショートカット ALT+F12 を使用して新しいターミナル ウィンドウを開き、以下のコマンドを実行してイメージをビルドし、そこからコンテナーを実行します。

~/WebstormProjects/docker-compose-no-cache$ docker compose up -d

このコマンドは、compose.yaml ファイルを実行して docker-compose-no-cache_web-app という名前のイメージを構築し、docker-compose-no-cache-web-app-1 という名前のコンテナーも実行します。 以下に示すように。

 => CACHED [1/2] FROM docker.io/library/nginx:1.22.0-alpine@sha256:addd3bf05ec3c69ef3e8f0021ce1ca98e0eb21117b97ab8b64127e  0.0s
 => [2/2] COPY . /usr/share/nginx/html                                                                                     0.6s
 => exporting to image                                                                                                     0.8s
 => => exporting layers                                                                                                    0.6s
 => => writing image sha256:d72675b7a3e3a52dd27fe46f298dc30757382d837a5fbf36d8e36d646b5902d6                               0.1s
 => => naming to docker.io/library/docker-compose-no-cache_web-app                                                         0.1s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
[+] Running 2/2
 ⠿ Network docker-compose-no-cache_default      Created                                                                    0.3s
 ⠿ Container docker-compose-no-cache-web-app-1  Started

コンテナーが実行されているかどうかを確認するには、ブラウザーを開き、localhost:80 (http://localhost/#) にリクエストを発行します。 index.html ページで定義したカードがブラウザに表示されます。

同じターミナル ウィンドウを使用して、以下のコマンドを実行して、カスタム イメージが作成されたことを確認します。

~/WebstormProjects/docker-compose-no-cache$ docker image ls

出力:

REPOSITORY                        TAG       IMAGE ID       CREATED         SIZE
docker-compose-no-cache_web-app   latest    d72675b7a3e3   8 minutes ago   23.5MB

キャッシュを使用してイメージを再構築する

キャッシュを使用して既存のイメージを再構築し、コンテナーを実行するには、まずコマンド docker compose down を使用して既存のコンテナーを停止および削除する必要があります。

キャッシュを使用して docker イメージを再構築すると、現在のコンテナーが再利用されて新しいコンテナーが作成されます。 同じターミナル ウィンドウを使用して、次のコマンドを実行し、キャッシュを使用して既存のイメージを再構築します。

~/WebstormProjects/docker-compose-no-cache$ docker compose build

このコマンドは、既存のイメージを使用して新しいイメージを再構築し、docker compose up -d を使用してそこからコンテナーを実行できます。

既存のイメージが再利用されて新しいコンテナーが作成されていることを確認するには、次のコマンドを実行します。前のセクションで作成したイメージ以外にイメージがないことに注意してください。

~/WebstormProjects/docker-compose-no-cache$ docker image ls

出力:

REPOSITORY                        TAG       IMAGE ID       CREATED         SIZE
docker-compose-no-cache_web-app   latest    d72675b7a3e3   8 minutes ago   23.5MB

キャッシュなしでイメージを再構築する

キャッシュなしでイメージを再構築するということは、以前のイメージを再利用せずに新しいイメージを作成することを意味します。 これは、docker build コマンドを使用してイメージをビルドするときに --no-cache コマンドを追加することで実現できます。

同じターミナル ウィンドウを使用して、次のコマンドを実行し、キャッシュなしでイメージを再構築します。 docker compose down コマンドを使用して、実行中のコンテナーが削除されていることを確認します。

~/WebstormProjects/docker-compose-no-cache$ docker compose build --no-cache

このコマンドは、キャッシュなしで新しいイメージを再構築します。つまり、以前のイメージは再利用されません。 以前のイメージが現在のイメージを作成するために再利用されていないことを確認するには、次のコマンドを実行します。以前のイメージには <none> で示されている名前がないことに注意してください。

新しいイメージは、前のイメージの名前を使用します。

~/WebstormProjects/docker-compose-no-cache$ docker image ls

出力:

docker-compose-no-cache_web-app   latest    f111dde0e704   3 seconds ago    23.5MB
<none>                            <none>    1c05a46fe049   13 minutes ago   23.5MB

前の画像と新しい画像に同じ名前を付けることはできないため、現在の画像は前の画像の名前を使用し、前の画像には名前がないことを示すために none を取得します。

まとめ

Docker Compose を使用して新しいイメージからコンテナーを再作成する方法を学びました。 これを実装するために、キャッシュを使用してイメージを再構築する方法と、キャッシュを使用せずにイメージを再構築する方法を学習しました。

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

関連記事 - Docker Compose