こんにちは、Mashです。
今回のテーマである「Docker」ですが、ITエンジニアのみなさんなら一度は聞いたことがあるかと思います。
某エンジニア系インフルエンサーも必須スキルといってましたね。
私自身、本業でDockerを触る機会がありまして、自分の知識整理のためと、せっかくならということで初学者さんに向けて記事を作成しました。
今回は第1回となります。
- 「Docker?なにそれ?」な人が「Dockerなんとなく知ってる!」になる
- Dockerの環境構築、コンテナの起動ができるようになる
※本シリーズはDocker初心者向けではありますが、前提として多少のLinux知識が必要となります。ご了承ください。
Why Docker?
「Dockerとは?」については、ググっていただければ情報がいっぱい出てきますので詳しくはお任せするとして、、、
私の記事では概要は少しだけにしておきます。
Docker(コンテナ技術)は「仮想化技術」です。
もともと「仮想化技術」は「仮想マシン方式」が主流でした。
物理サーバしかなかった時代と比較すると、例えば開発環境を複製したり本番環境をスケールしたりすることが、仮想マシン技術に登場によって劇的に容易になりました。
それではなぜDocker(コンテナ技術)が昨今主流になっているのでしょうか。
その鍵を握るのが↓こちらの仮想マシンとコンテナの構成の違いです。

この絵で伝えたいことは、
- 仮想マシンは、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 |
---|---|
Mac | https://docs.docker.com/docker-for-mac/install/ |
Windows Pro以上 | https://docs.docker.com/docker-for-windows/install/ |
Windows Home | https://docs.docker.com/docker-for-windows/install-windows-home/ |
Ubuntu | https://docs.docker.com/engine/install/ubuntu/ |
CentOS | https://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からダウンロードしたうえでコンテナを起動しています。

2回目以降はイメージのダウンロードが不要になるので、1秒も経たずにコンテナが起動できるようになります。
仮想マシン方式ではありえない速さですね。
ちなみに、nginx以外にも有名なOSやミドルウェアはこのように↓紹介されています。

ちゃんとコンテナが立ち上がっているかコマンドで確認してみましょう。
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エンジン上で隔離されて動いているので、ただ起動しただけでは外部からアクセスできないんですね~。

いったんコマンドのお勉強もかねて不要なコンテナを停止・削除しましょう。
# コンテナの起動状況を確認
$ 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回記事を作成しました!
ぜひあわせてご一読ください。