Dockerの基礎知識とNginxコンテナを動かしてみた

はじめに

はじめまして!インフラSEの宮本(@miyamon_ky)です。今回初めてDockerを触ってみたので記事にしてみました。コンテナ初心者の方にも読んでいただけるように意識して書いてみました。まずは自己紹介させてください!

  • 自己紹介
1994年生まれでインフラSEしています。2020年末に未経験からインフラ系SIerにキャリアチェンジしまして、SE歴が4年目に突入しました。ネットワーク機器やセキュリティ系SaaSの商材をメインにプリセールしつつ、設計構築も担当しています。プラットフォーム、クラウド系の技術に興味を持ち、TechBullコミュニティへ参画しました。

Dockerとは

1台のサーバー上にコンテナ型の仮想環境を構築することが出来るDocker社が開発したプラットフォームです。今までも仮想環境を構築する技術はOracle社のVirtualBoxやVagrant、Microsoft社のHyper-V等数多くありました。しかし従来の仮想化技術はゲストOSを起動させる事が前提なのに対して、Dockerのコンテナはプロセスとして動いています。それによって軽量で扱う事ができ、環境差分が無い状態で複数人で開発をできます。Dockerを利用した事の無い人からすると、この説明ではメリットがまだ分かり難いと思いますので、次の項では従来の仮想技術と比較しながら説明を記載していきます。

従来の仮想化技術との比較

上の仮想化技術はいずれも従来のものですが、ゲストOSが存在している事が分かると思います。ゲストOSを稼働させるのに基盤のリソースを割いてしまう為、動作が重くなってしまう傾向があります。またミドルウェア、ソフトウェアは各VMの単位でそれぞれインストールする必要があるために、バージョン差分が生じやすく、依存関係の都合上VMによってアプリケーションが動作しないといった課題が見つかることもあります。こういった課題を解決するのがコンテナ技術で、その技術を利用可能にするのがDockerになります。
上の図の通りミドルウェア〜アプリケーション層のソフトウェアがコンテナの中に纏まってあり、マシンからマシンへ流用することが可能になります。ミドルウェアとソフトウェアのバージョン不一致により動かないといったこともありません。そしてOSから起動させる必要が無い分、高速で起動するが可能になります。

Dockerで押さえておく必要がある概念
ではDockerの中の話に踏み込んでいきます。Dockerを利用してコンテナを構築するには最低限以下の3つの概念を理解する必要があると思っているので説明します。
  • イメージ
イメージとはコンテナを動作させるのに使うテンプレートファイルを指します。イメージの中にはOSやアプリケーションの実行に使われるコマンド、メタデータが含まれています。Dockerコンテナを構築するには、必ず基となるイメージが1つ必要で、このイメージはインターネットのdockerhubというサイトから探す必要があります。
  • Dockerfile

既存のイメージに機能を積み重ねるためのテキストファイルです。Dockerイメージの設計図の役割を果たします。dockerhubで公開されているイメージではインストールされているコマンドが足りない事があるのでDockerfileで自分好みにカスタマイズさせていきます。

  • Docker Compose

複数のコンテナを効率的に操作するためのDockerに対する指示書の役割を果たします。compose.ymlというファイルが実際の指示書になるのですが、ここで利用するDockerfileやコンテナ名、NWを定義していきます。


Dockerをローカル環境にインストール

実際にDockerを構築する為の環境を整えます。
  • 環境
    • PC:windows 11
    • Docker Desktop:4.33.1
    • Terminal:VScodeのGit bash
  • Docker for windowsをインストール

https://docs.docker.com/desktop/windows/install/

Docker for windowsをインストールしましょう。Windows 用 Docker デスクトップ – x86_64をダウンロードし「Docker Desktop Installer.exe」インストーラーを実行します。インストールが完了したらTeminalでDockerのコマンドを実行してみます。
  • バージョン確認

以下でdocker versionというコマンドでdockerがインストールされていることと、どのバージョンをインストールしたのか確認します。


簡単にDockerでNginxのコンテナを構築

実際に何かを構築するのが一番理解が深まるのでNginxを構築してみました。Dockerはディレクトリ構成が重要です。今回の構築のディレクトリ構成は以下としました。

<ディレクトリ構成解説>
  •  docker-testというディレクトリ配下に
    • docker-compose.ymlファイルを作成
    • nginxディレクトリを作成
  • nginxディレクトリ配下に
    • Dockerfileを作成
  • Dockerfileの中身は以下とします。

<ファイル構成解説>
    • FROM
      • Dockerhubで探したイメージを指定しています。
    • RUN
      • コンテナ内で実行されるコマンドを書いています。
    • EXPOSE
      • 公開するコンテナのポートを指定しています。(httpでアクセスできるよう80を指定)
docker-compose.ymlは以下とします。
<ファイル構成解説>
    • services
      • Docker-Composeでは、アプリケーションを動かすための各要素をServiceと読んでいます。
      • 今回nginxというサービス(コンテナ)を1つ構築する為、servicesの中にnginx:を入れ子にしています。
    • container_name
      • コンテナ名を定義しています。
    • build
      • 参照させたいDockerfileのあるディレクトリを指定しています。
      • 今回はnginx配下のDockerfileを利用したい為./nginx/を指定しています。
    • image
      • イメージ名を指定しています。
      • 実際のイメージの指定はDockerfileで指定しているので、ここでは名前だけを定義しています。
    • ports
      • ローカルとコンテナのポートマッピングを定義しています。
      • 今回はローカルPCの80とコンテナポート80をマッピングさせています。
  • イメージをbuild
最低限Dockerコンテナを構築する準備が出来たので実行していきます。まずはイメージをbuildさせます。イメージを作成することをbuildさせると言います。buildにはdocker-compose buildコマンドを利用します。
  • buildしたイメージを使用してコンテナを起動

コンテナをデプロイするにはdocker-compose upコマンドを利用します。-dオプションを付け加えることでバックグラウンドでコンテナを起動してくれるので、続けてターミナル上から操作できます。

  • コンテナが起動されているか確認
docker psコマンドでdockerが起動ステータスを確認できます。「STATUS」が「Up」になっていることから起動されていることが確認できます。
  • コンテナにログイン

起動したコンテナにログインするにはdocker exec コマンドを利用します。[docker exec -it <コンテナ名> bash]が書式となり、Dockerfileで私はnginxとコンテナ名を定義したので-itの後はnginxとしています。-itのオプションは-i(interactive)と-t(tty)を組み合わせたものでコンテナ内で対話的なシェルを使えるようになります。

  • 構築したNginxに実際にブラウザからアクセス

Nginxはwebサーバなのでブラウザからもアクセステストをします。今回はconfファイルをオリジナルで作成していないので、アクセス成功すればデフォルトの画面が表示されます。今回80ポートを解放して、ローカルポート80とコンテナポート80をマッピングさせているのでhttpでアクセスします。hostsで名前解決の設定をしていなければドメインはlocalhostでアクセス出来ます。

http://localhost


まとめ

たしかに事前に調べていた通り、docker-compose upした後の起動が高速に感じました。またローカル環境に依存することなくDockerをインストールしていれば、今回用意したDockerfileとdocker-compose.ymlがあることで、どの環境でも同じ開発環境を構築出来るということが大きなメリットのように思います。今回は基本機能しか検証していませんが、現在並行して応用したKubenetesにもチャレンジしているので、そちらも記事に出来ればと思います。

以上ありがとうございました!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール