【Docker入門#01】nginxコンテナでWelcomeしてみる【docker run】

Docker入門01 tech

こんにちは、Mashです。

今回のテーマである「Docker」ですが、ITエンジニアのみなさんなら一度は聞いたことがあるかと思います。

某エンジニア系インフルエンサーも必須スキルといってましたね。

私自身、本業でDockerを触る機会がありまして、自分の知識整理のためと、せっかくならということで初学者さんに向けて記事を作成しました。

今回は第1回となります。

今回のゴール
  • 「Docker?なにそれ?」な人が「Dockerなんとなく知ってる!」になる
  • Dockerの環境構築、コンテナの起動ができるようになる

※本シリーズはDocker初心者向けではありますが、前提として多少のLinux知識が必要となります。ご了承ください。

Why Docker?

「Dockerとは?」については、ググっていただければ情報がいっぱい出てきますので詳しくはお任せするとして、、、

私の記事では概要は少しだけにしておきます。

Docker(コンテナ技術)は「仮想化技術」です。

もともと「仮想化技術」は「仮想マシン方式」が主流でした。

物理サーバしかなかった時代と比較すると、例えば開発環境を複製したり本番環境をスケールしたりすることが、仮想マシン技術に登場によって劇的に容易になりました。

それではなぜDocker(コンテナ技術)が昨今主流になっているのでしょうか。

その鍵を握るのが↓こちらの仮想マシンとコンテナの構成の違いです。

VM VS CONTAINER

この絵で伝えたいことは、

  • 仮想マシンは、OSそのものやOS上で稼働する(してしまう)プロセスやファイル群も含めて複製する必要がある
  • コンテナは、目的のアプリケーションと必要最低限のファイル群のみを複製できる

これですね。

この差異によって仮想マシン方式よりコンテナ方式のほうが、

  • 不要なファイルを持っていないから、データサイズが小さく複製も容易
  • OSを起動しなくていいから、複製した環境の起動が高速
  • 目的のアプリケーション以外のプロセスは起動しないから、ハードウェアリソースを効率よく使用可能

となります。

「Dockerは軽い、速い」といわれる所以ですね。

Dockerを動かしてみる

さて、能書きはこれくらいにしてDockerを動かしてみます。

今回は第一回ですので環境構築とnginxコンテナの起動までチャレンジしてみましょう。

前提環境

私の環境について。

私の環境
  • PCはWindows10 Pro。IPアドレスは10.10.1.100
  • Dockerをインストールする環境はUbuntu 20.04 LTS。IPアドレスは10.10.1.1
  • Ubuntuはインターネット接続できる状態

PCからUbuntuへSSH接続し、あれこれ操作をします。(WindowsやMacじゃなくてごめんなさい)

環境構築

まずは環境構築。

以下記載の手順はUbuntu前提ですので、みなさんはご自身の環境に応じて公式ドキュメントをご参照ください(謝)

ご利用のOS参考URL
Machttps://docs.docker.com/docker-for-mac/install/
Windows Pro以上https://docs.docker.com/docker-for-windows/install/
Windows Homehttps://docs.docker.com/docker-for-windows/install-windows-home/
Ubuntuhttps://docs.docker.com/engine/install/ubuntu/
CentOShttps://docs.docker.com/engine/install/centos/
それ以外公式ドキュメントをご参照ください
https://docs.docker.com/engine/install/
# Ubuntuでのインストール手順
# 念のため、古いパッケージをアンインストール(お掃除)
$ sudo apt-get remove docker docker-engine docker.io containerd runc
$ sudo apt-get purge docker-ce docker-ce-cli containerd.io

# 前提パッケージのインストール
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common

# Docker公式GPGキーを取得
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# キー適用状況を確認
$ sudo apt-key fingerprint 0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

# Docker(stable)リポジトリを指定
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

# Dockerエンジンのインストール
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io

インストール作業は以上になります。

このままの状態だとdockerコマンドを実行する際に毎回 sudo が必要となってしまいますので、下記を実行してSSH接続しているユーザをdockerグループに追加します。

# 現在のユーザをdockerグループに所属(dockerコマンド実行時のsudoを不要とするため)
$ sudo usermod -aG docker $USER

# グループ追加設定を反映するために一度ログオフ
$ exit

nginxコンテナを起動

Dockerがインストールできたのでさっそくコンテナを起動してみましょう!

docker run コマンドでコンテナを起動します。

$ docker run -d nginx
(以下略)
# -d はコンテナをバックグラウンドで起動するための「デタッチド」オプション
# 基本つける

何が起こったかというと、コンテナの雛形/テンプレートとなるDockerイメージがまだDockerホスト上にありませんので、イメージをDocker Hubからダウンロードしたうえでコンテナを起動しています。

docker run時の挙動

コンテナを起動するためには雛形となる「イメージ」が必要です。コンテナ起動コマンドを実行した際、イメージが手元にない場合は勝手にダウンロードしてくれます。

イメージ自体はただのファイルです。コンテナとして起動してはじめて仮想環境が立ち上がります。

2回目以降はイメージのダウンロードが不要になるので、1秒も経たずにコンテナが起動できるようになります。

仮想マシン方式ではありえない速さですね。

ちなみに、nginx以外にも有名なOSやミドルウェアはこのように↓紹介されています。

Docker Hub

Docker Hubに代表される「Dockerイメージを置いておく場所」のことを レジストリ と呼びます。

言葉だけでも軽く覚えておいてください。


Docker HubのWebサイト自体はインターネット上に公開されていて、今回使用しているnginxのイメージも誰でも利用可能ですが、実際にアプリケーションを開発する際は公開不可(プライベート)とすることも可能です。

ちゃんとコンテナが立ち上がっているかコマンドで確認してみましょう。

docker ps コマンドでコンテナの起動状況が確認できます。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6a2e65e98569        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        80/tcp              gifted_driscoll

docker stats コマンドでコンテナの使用リソースが確認できます。Ctrl(Command)+Cで抜けることができます。

$ docker stats
CONTAINER ID        NAME                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
6a2e65e98569        gifted_driscoll     0.00%               2.195MiB / 1.878GiB   0.11%               1.02kB / 0B         0B / 8.19kB         2

うまくコンテナが起動できているようです!

ブラウザで接続確認してみたら、、、

さぁ、それではWebブラウザからnginxコンテナにアクセスしてみます。

私の環境は、サーバのアドレスが10.10.1.1でした。

ブラウザアクセス失敗

む、、、

nginxのWelcomeページが表示されません、、、

実はここがDocker初心者最初の躓きポイントです。

コンテナはDockerエンジン上で隔離されて動いているので、ただ起動しただけでは外部からアクセスできないんですね~。

nginxコンテナは外部公開されていない

いったんコマンドのお勉強もかねて不要なコンテナを停止・削除しましょう。

# コンテナの起動状況を確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
6a2e65e98569        nginx               "/docker-entrypoint.…"   19 minutes ago      Up 19 minutes       80/tcp              gifted_driscoll

# コンテナを停止(nginxコンテナIDを指定しています)
$ docker stop 6a2e65e98569
6a2e65e98569

# コンテナを削除(nginxコンテナIDを指定しています)
$ docker rm 6a2e65e98569
6a2e65e98569

# ダウンロード済みイメージの確認
# コンテナを削除しただけでイメージは削除されていないことがわかる
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
nginx               latest              c39a868aad02        8 days ago          133MB

お掃除は以上です。

それでは外部公開する手順をご紹介します。

# 外部公開ポートを指定してコンテナを起動
$ docker run -d -p 80:80 nginx

# コンテナ起動状況を確認
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
c0102f42ff11        nginx               "/docker-entrypoint.…"   38 seconds ago      Up 37 seconds       0.0.0.0:80->80/tcp   zealous_dubinsky

docker run コマンドに -p オプションを追加しました。これだけです。

-p のあとの 80:80 は、

  • 左側がホストOSでバインドするポート
    ホストOSで稼働する別プロセスと競合しないようにポートを指定する
  • 右側がコンテナ上のプロセスがバインドしているポート
    今回はnginxの待ち受けポート番号である80番を指定する

このような意味になります。

もう一度Webブラウザからアクセスしてみましょう。

ブラウザアクセス成功

nginxコンテナをうまく公開することができました!

(おまけ)コンテナ外部公開の仕組み

ここからはおまけになります。

今回はとりあえずコンテナ起動できたー!でOKです。笑

さて、先程の通りdocker runの-pオプションでポートを指定することで、コンテナを外部に公開することができました。

実はDockerをインストールした時点から、ホストOS内にDocker独自のネットワークが形成されています。

このDocker独自のネットワーク内で起動したコンテナも、IPアドレスを持っています。

コンテナのIPアドレスへは外部から直接アクセスできない状態となっているわけですが、ホストOS側の iptables という機能がDockerネットワークとホストOSの間をうまく橋渡ししてくれてるため、nginxコンテナにアクセスできるようになった というわけです。

コンテナ外部公開の仕組み

Dockerネットワークは第一回で取り扱うには重すぎるネタなので、今回はこのあたりにしておきます。笑

まとめ

Docker入門第1回、いかがでしたでしょうか。

無事、環境構築とnginxコンテナの起動は成功しましたでしょうか。

はじめはコマンドをコピペするだけでもかまいませんので、まずは動かしてみてイメージを固めていくことが大切だと思います。

次回以降で少しずつ深堀していきますので、引き続き参考にしていただけるとうれしいです。

今回は以上です。

それじゃあまたね。

第2回記事を作成しました!

ぜひあわせてご一読ください。

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