DockerコンテナでApacheサーバーを立てる [初級編]


まずはじめに

もし気に入っていただけたり、役に立ったらぜひ ”いいね!” お待ちしております!
投稿のモチベーションに繋がります^^¥

この記事の目的

Dockerコンテナを利用してapacheサーバーを立てます。
localhostからアクセスし、apacheのトップ画面が表示されるところまで見ましょう。

Dockerと従来の仮想化

そもそもサーバーの仮想化をご理解されている方には不要かもしれませんが、
一つの物理機を仮想化することで、以下のようなメリットをもたらします。

  • コスト削減

    • サーバ物品調達コストが減らせる
    • スペースを節約できる
    • 電力コストを抑えられる
  • 運用性向上

    • サーバメンテナンスが楽になる
    • VM毎に役割をもたせることで可用性が高まる
    • OS以上でパッチ適用の切り戻しが楽になる

仮想化の歴史

現在ではストレージ・ネットワークなどのほとんどのものが仮想化され、身近な技術として利用されてきています。
仮想マシン(VM)の歴史は古く、1972年にIBMがメインフレーム用にリリースしたSystem/370までさかのぼるるそうです。

2002年には仮想マシンのための専用OSが登場します。一般的にはハイパーバイザーと呼ばれるものです。

ホスト型とハイパーバイザー型の仮想化

サーバーの仮想化は大きく、 ”ホスト型” と "ハイパーバイザー型"に分けられます。

  • ホスト型
    • OSに仮想化ソフトをインストールし、その上で仮想マシンを動かします。
    • 既存のサーバを使うことができるため、手軽に利用できる
    • ハードウェアにアクセスする際、ホストOSを経由することで余計なオーバーヘッドがかかり、十分な性能がでない
    • 代表的な製品:
      • VMware Palyer, VMWare Fusion, VirtualBox

  • ハイパーバイザー型
    • サーバーへ直接ハイパーバイザーをインストールし仮想マシンを可動させる方式
    • ホストOSを必要としないため、ハードウェアを直接制御することができる
    • 仮想マシンの速度低下を最小限に抑えることができる
    • 複数の仮想マシンを効率よく可動させるための機能がある
    • 代表的な製品
      • VMWare ESX-i, Microsoft Hyper-V

コンテナ型

Dockerがまさにコレです。

  • ホストOSのカーネルを直接利用するため、オーバーヘッドが少なく高速
  • ゲストOSを含まないかつ、アプリケーション/ライブラリをパッケージングしているので、非常に少ないリソースで稼働できる
  • ホストOSに直接アタッチしている反面、セキュリティ上リスクが高め

Dockerを使っていこう

以前はdocker tools + virtualboxで仮想コンテナを立てていましたが、Docker for Macが登場し、
HyperKitの仮想環境上でdockerコンテナを動かすことができるようになりました。
Docker for MacはDocker公式からダウンロードしましょう。

https://docs.docker.com/docker-for-mac/install/

DockerHubにログインする

してもしなくても大丈夫ですが、後にDockerイメージをリモートのDockerHubに上げることができます。
DockerHubアカウントをお持ちの方は、アカウント名とパスワードを入れることでローカル環境からDockerHubにアクセスできます。

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username:'YOUR ACCOUNT NAME'
Password:'YOUR PASSWORD'
Login Succeeded

dockerコンテナでubuntuを動かす

主な流れとしては、以下イメージです。

  • dockerイメージの取得
  • dockerイメージをもとにコンテナを作成
  • コンテナの停止/起動を制御

イメージの取得

docker pull 'image名:オプション' でイメージを取得することが可能です。
latestを指定すると、最新versionのイメージが取得されます。

$ docker pull ubuntu:latest
latest: Pulling from library/ubuntu
5b7339215d1d: Pull complete 
14ca88e9f672: Pull complete 
a31c3b1caad4: Pull complete 
b054a26005b7: Pull complete 
Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c
Status: Downloaded newer image for ubuntu:latest

取得したイメージを確認するには、docker imagesを使用します。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              latest              4c108a37151f        5 days ago          64.2MB 

コンテナの作成

イメージをもとにコンテナを作成します。
docekr runをベースに必要なオプションを付帯させて作成します.
-dデーモンとしてバックグラウンド起動させます。
--name後ろに来る引数を名前としてつけることができます。
-pポートフォワードとIPアドレスを指定します。

$ docker run -d --name test -p 127.0.0.1:10080:80 ubuntu:latest
2f618005774e6d6767e5cd2102785b9a5ec2795aeeb41beccb6d118c58d1f9ca

docker ps -aですべてのdockerコンテナを確認します。
ちゃんと作成されていることがわかりました。

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                            PORTS               NAMES
2f618005774e        ubuntu:latest       "/bin/bash"         7 seconds ago       Exited (0) 6 seconds ago                              test

コンテナにapacheをインストールする

作成したばかりのdockerコンテナをdocker start 'コンテナID'で起動させ、
docker attach 'コンテナID'でコンテナ内を操作しに行きます。
service apache2 startでapacheを起動させましょう。

$ docker start 2f618005774e
2f618005774e
$ docker attach 2f618005774e
root@97de19e4e9f4:/# apt-get update
root@97de19e4e9f4:/# apt-get install apache2 -y
root@97de19e4e9f4:~# service apache2 status
 * apache2 is not running
 * root@97de19e4e9f4:~# service apache2 start 
 * Starting Apache httpd web server apache2                                                                  AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message

ローカルホストにアクセスする

ポートフォワードで指定した127.0.0.1:10080にアクセスすると、apacheの起動画面が表示されました。

最後に

如何でしたでしょうか。
Vagrant + VirtualBoxと比べてコンテナの作成 ~ 起動は秒単位で爆速なので、
作ってすぐ壊す開発環境などにも適していると思います。
至らない点もあるかと思いますが、ここまで読んでいただき、ありがとうございました。

次回はDockerfileを使ったIaC(Infrastructure as Code)でのコンテナ作成について書きたいと思います。