はじめに

初めまして。26卒新入社員の阿部裕太です。
この度、研修の一環として初めてブログを執筆しました。

本ブログでは、新卒入社時研修の「さわってわかるモダン開発入門 コンテナ活用編」にてコンテナ技術の概要とDockerの使い方について学んだので紹介いたします!

いきなりですが、私は学生時代の資格勉強や研修で講義を受けてきて1つ大きな不安が芽生えました。
それは「学んだ知識を実務でどう生かしたらいいのかわからない」ということです。

そこで今回は、この不安を解消するために、研修で学んだ知識と、それが実務のどのような場面で活かせるのかという私なりの予想を記事にまとめてみました。

目次

  1. 研修内容まとめ
  2. 実務でどう使うかの予想
  3. 最後に

1. 研修内容まとめ

・コンテナ技術の概要とメリット
・Dockerの基本概念
・演習

コンテナ技術の概要とメリット

コンテナとは一言で言うと、「アプリ本体と、それが動くために必要な環境(言語のバージョンやライブラリなど)を1つの『箱』に閉じ込める技術」です。

と言われても、この説明だと少しイメージしづらいと思います。
キッチンカーの例えがわかりやすかったのでキッチンカーに例えて説明していきます。

普通のレストラン(従来のサーバー)を開業しようとすると、物件を探して、ガスや水道を契約して、厨房機器を搬入して……と、その場所に応じた大がかりな準備が必要です。

一方コンテナは、食材や、レシピ、冷蔵庫もすべて車内に積み込んだキッチンカーと言えます。
キッチンカー(コンテナ)さえあれば、都会でも、地方でも、フェス会場でも、場所を選ばずに全く同じクオリティの料理(アプリ)を提供することができます。

コンテナのメリット
コンテナのメリットは以下の3つが挙げられます。

・環境差異の解消
・軽量かつ高速なスケーリング
・責任範囲の明確化

環境差異の解消
アプリケーションとその実行に必要な環境(言語のバージョンやライブラリなど)を1つの「箱(コンテナ)」に閉じ込めます。これにより、「開発者のPCでは動いたが、本番サーバーでは動かない」といった環境によるトラブルを解消できます。
個人的に一番魅力的なメリットだなと感じました。

軽量かつ高速なスケーリング
コンテナは仮想マシン(VM)と異なり、ゲストOSを含みません(ホストOSの機能を利用します)。そのため非常に軽量で、ストレージやメモリの消費が少なく済みます。

責任範囲の明確化
開発者目線ではコンテナイメージを作成するところまでを責任範囲とすることができ、インフラエンジニアとの分担が明確になります。

Dockerの基本概念

イメージとコンテナ

まず、コンテナには、「イメージ」と、「コンテナ」という2つの状態があります。

イメージ:アプリケーション本体と、それが動くために必要な実行環境(Pythonのバージョンやライブラリなど)を1つに固めたファイルです。

料理で例えると「レシピ」のような存在です。レシピがあれば、必要な材料や手順がすべてまとめられており、誰でも全く同じ味の料理を作ることができます。

コンテナ:イメージをメモリ上に展開し、実際に実行している状態のことです。

これも料理で例えると「レシピ通りに作られ、お皿に盛られた料理」です。レシピ(イメージ)を元に、実際に作ってテーブルに出した状態です。何人前でも同じ料理(コンテナ)を作ることができます。

Dockerfileによる自動化

一言で言うと、Dockerfileは「コンテナイメージの設計図」です。このDockerfileがあることで誰でも全く同じコンテナを作ることができるようになり環境構築にかかる時間とミスを減らすことができます。

Dockerfileを使うと以下の3つのメリットがあります。

手順書の廃止: テキストファイル1つがそのまま手順書になる
環境構築の速度上昇: コマンド1発で、数時間かかっていた構築が数秒で終わる
環境依存のエラー減少: 「自分の環境だけで動かない」という不毛なデバッグがなくなる

Docker Compose

Dockerfileが「コンテナイメージの設計図」なら、Docker Composeは「複数のコンテナをまとめて動かすための、チーム全体の指揮者」です。
Docker Composeファイルを用意しておくだけでコマンド1つで全てのコンテナを正しい順番、設定で立ち上げることができます。

Docker Composeを使うと以下3つのメリットがあります。

「起動手順」の自動化:コンテナ同士の依存関係をすべて自動でコントロールしてくれる
ローカル開発環境の構築:データベースの準備まで含め 、本番そっくりのコンテナ環境を作成できる
ネットワーク設定の自動化: コンテナ同士が通信するための専用の仮想ネットワークを自動で作ってくれる

演習

演習では「コンテナなしでのアプリケーションのデプロイ」と「Dockerコンテナを使用したアプリケーションのデプロイ」の2つの演習を行いました。

コンテナ技術なしでのアプリケーションのデプロイ

コンテナ技術を使わずに、アプリケーションをインフラ環境で動かすことが「どれほど大変か」を体感するための演習でした。

私は演習時間内にアプリケーションをインフラ環境で動かすことはできませんでした。

Dockerコンテナを使用したアプリケーションのデプロイ

こちらの演習では大きく分けて以下の2つの作業がありました。

1.Dockerのインストールと基本操作
DockerをAmazon EC2インスタンスにインストールします。コマンド1行で簡単にインストールできました。

2.Dockerfileからのイメージビルドと実行
アプリケーションの実行に必要な手順(Pythonベースイメージの取得、ライブラリのインストール、実行コマンドなど)を定義したDockerfileを作成しました。
その後、作成したDockerfileからコンテナイメージをビルド。
ビルドが完了したら、ビルドしたイメージを指定して docker run コマンドを実行し、コンテナを起動し、この作業は終わりです。

2. 実務でどう使うかの予想

今回の研修で学んだコンテナという技術ですが、実務で活かすにはどのような場面で使用されるのかを私の推測になりますが書いていきます。

まず私がコンテナを学んで一番のメリットだなと感じたのは環境差異の解消なので、ここを実務のどのような場面で活かせるのかを考えました。

活かせそうな場面を以下の2つ挙げました。

  • 複数の案件を同時に掛け持つとき
  • 新メンバーがチームに合流したとき

複数の案件を同時に掛け持つとき
複数の環境を1つのPCで作ろうとしたらバージョンが衝突してエラーが発生しますが、実務ではプロジェクトごとにコンテナを完全に切り離して動かすことで複数の案件を同時に掛け持つことが可能になると感じました。

新メンバーがチームに合流したとき
新しいメンバーがチームに合流したら、環境構築をしなければいけませんが、Docker Composeを使うことで環境構築が格段に楽になり、合流する際のコストを削減できるなと思いました。

以上が実務でどう使うかの予想です。実務で使っていけば他にも多くのメリット、デメリットを感じることができると思うので、ぜひ使ってみたい技術だなと思います。

3. 最後に

今回の「さわってわかるモダン開発入門 コンテナ活用編」研修ではコンテナという技術について学びました。従来のコンテナなしでの開発手法とコンテナを使った開発のどちらも演習で体験したことでコンテナのありがたみを実感する貴重な機会だったなと感じました。
コンテナ技術は今後開発、運用を行っていく上で欠かせない存在になりそうだなと思いました。