コンテナを理解して触ってみた!

こんにちは、2024年度入社の秋葉です!

クラウドやアプリ開発の現場でよく聞く「コンテナ技術」。
「結局何なの?」と疑問を持っている方も多いのではないでしょうか?コンテナは、アプリを軽く素早く動かせる仮想化技術で、開発・運用のスピードや効率を大きく向上させます。この記事では、私が新人研修を通して実際にコンテナ技術に触れて感じた魅力や使い方、初心者でも理解しやすいポイントを解説します。

これからコンテナを試してみたい方、ぜひ一緒に一歩踏み出してみましょう!

コンテナとは

コンテナは、ホストOS上にアプリケーションの実行に必要な本体・ライブラリ・設定ファイルなどを一括管理し、「コンテナエンジン」を介して動かす技術です。分かりやすく例えると、アプリを動かすために必要なすべてを一つにまとめ、専用の小さな箱としてホストOS上で動かす技術です。

従来のハードウェア仮想化技術では、1つの仮想環境内にOSから必要な全ての要素を構築するため、異なるOSが求められるケースには便利でした。しかし、開発や運用の現場では「OSは共通で良い」という場合も多く、OSまで含めて用意するのはリソースの無駄になっていました。

その点、コンテナ技術では、OS部分は共有しつつ、アプリごとに必要なCPU・メモリ・ファイル・プロセスID名前空間を独立した「コンテナ」として管理します。その結果、軽量で高速に起動できる特長があります。ただし、コンテナはホストのLinuxカーネルに依存するため、どの環境でも必ずしも同じように動作するわけではありません。

仮想化と比較した際のメリット・デメリット

メリット デメリット
  • とにかく処理が軽量
  • 環境構築に要する時間の大幅な削減
  • リリースサイクルの高速化に関わる「DevOps」と相性が良い
  • 複数のホストでのコンテナ運用が煩雑になる
  • 新しい技術であり学習コストが比較的高い
  • コンテナ環境でベースとなるOSと異なるOSのシステムを動かすことはできない

各コンテナやコンテナサポートの特徴

  1. Docker
    コンテナ技術を広く普及させたオープンソースのプラットフォームで、アプリケーションとその依存関係を単一のコンテナイメージにまとめ、異なる環境でも一貫性のある動作を提供します。軽量で高速な起動が特徴です。
  2. Kubernetes
    コンテナ化されたアプリケーションをオーケストレーションするためのプラットフォームです。自動スケーリング、自己修復、および複雑なデプロイ戦略のサポートが可能です。
  3. OpenShift
    Kubernetesをベースにしたエンタープライズ向けのコンテナプラットフォームで、Red Hatが提供しています。セキュリティ機能や開発者向けツールが統合されています。
  4. Podman
    コンテナの運用と管理を行うためのオープンソースツールで、デーモンを必要としないアーキテクチャを採用しています。Docker CLIとの高い互換性があり、セキュリティリスクを低減するRootlessオペレーションをサポートしています。 

 

Dockerとは

Docker社が開発している、コンテナ型の仮想環境を作成、配布、実行するためのプラットフォームのことであり、コンテナのデファクトスタンダードとして広く使われている技術の1つです。

Dockerは、DockerイメージDockerコンテナという2つの主要な要素を使って動作します。

Dockerのメリット

  • コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。
  • 作成した環境を配布しやすい。
  • スクラップ&ビルドが容易にできる。

Dockerは、軽量で迅速にデプロイできるという利点から広く普及していますが、他のコンテナ技術と比較すると、用途や環境により異なる利点と欠点があります。

例えば、セキュリティ重視ならPodmanやrktが適しており、大規模オーケストレーションならKubernetesと組み合わせた利用が効果的です。目的に応じて技術を選定することで、効率的なシステム運用が実現できます。

 

Dockerイメージ作成からコンテナ起動までの流れ

Dokcerイメージ作成

Dockerイメージは、Dockerfileと呼ばれる設定ファイルから作成されます。Dockerfileには、イメージに含めるアプリケーションや依存関係、設定が記述されています。例えば、どのベースOSを使用するか、アプリケーションのインストール方法、環境変数の設定などが記載されます。(下記コードはDockerfileの例)

FROM ubuntu:18.04
COPY . /app
RUN cd /app
CMD python /app/app.py

Dockerfileが準備できたら、以下のコマンドを実行してDockerイメージを作成します。

$ docker build -t イメージ名:タグ Dockerfileのあるディレクトリ

Dockerイメージの共有

作成したDockerイメージは、自分のローカル環境だけでなく、他の開発者やチームメンバーとも共有できます。一般的には、Dockerイメージの共有にはDocker Hubというパブリックリポジトリが利用されます。Docker Hubは、他のユーザーがイメージをダウンロードできるプラットフォームです。(※研修ではECRへイメージを共有しました)

Docker Hubのアカウントを作成し、ログインした後に以下のコマンドを実行することでイメージを共有します。

$ docker push ユーザー名/イメージ名:タグ

Dockerコンテナの起動

以下のコマンドを使用することでDockerコンテナを起動します。

$ docker run [オプション] イメージ [コマンド] [引数]

 

Dockerに触れてみた

初めてDockerとAWSのECRを使って、自分の作成したDockerイメージをクラウド上にデプロイしてみました!
ここでは、Dockerイメージの作成から、AWS ECRを利用してコンテナを起動するまでのステップを紹介します。

Dokcerイメージ作成

FROM amazoncorretto:17
COPY target/web-ui-teamG-0.0.1-SNAPSHOT.jar /web_app/
COPY src/main/resources/application-d0.yml /web_app/
WORKDIR /web_app
ENTRYPOINT ["java", "-jar"]
CMD ["-Dspring.profiles.active=local", "/web_app/web-ui-teamG-0.0.1-SNAPSHOT.jar"]

前節で紹介したコード例を参考に上記のようなDockerfileを作成しました。ベースイメージはDockerhubでなく、Amazon ECR Public Gallery のamazoncorretto を使用しています。JARファイルを起動するようにDockerfileを記述し、下記コマンドでContainer ImageをBuildします。(※今回はtest)

$ docker build -t test .

Dockerイメージの共有

ECRへイメージをプッシュする前にAWS CLIコマンドを使用してECRにログインします。この際に、開発環境であるCloud9にAmazonEC2ContainerRegistryFullAccessなどのポリシーをアタッチしないとエラーになるので注意です!

$ sudo aws ecr get-login-password --region <your-region> | docker login --username AWS --password-stdin <your-account-id>.dkr.ecr.<your-region>.amazonaws.com

ECRにログイン出来たら下記コマンドを実行してイメージをECRリポジトリ向けにタグ付けします。

$ docker tag <repository-name>:<tag> <your-account-id>.dkr.ecr.<your-region>.amazonaws.com/<repository-name>:<tag>

タグ付けが完了したら下記コマンドを実行してECRへイメージをプッシュします。

$ docker push <your-account-id>.dkr.ecr.<your-region>.amazonaws.com/<repository-name>:<tag>

Dockerコンテナの起動

最後に前節のコンテナ起動のコマンドを実行してコンテナを起動できたら終了となります。
コンテナが起動したら下写真のようにDockerファイル内で指定しているjavaアプリケーションが実行されます。

 

終わりに ~Dockerに触れてみた感想~

Dockerを使用した最初の印象は、「シンプルで強力なツール」というものでした。コンテナ技術により、アプリケーションの設定や依存関係が一つのイメージにまとめられ、どの環境でも同じように動作することに驚きました。

初めて触れる際には学びのハードルも感じるかもしれませんが、その魅力を理解し、実際に触れてみることで多くの可能性を感じることができましたので今後もコンテナについて学び続けたいと思います!!

タイトルとURLをコピーしました