nginx
Ubuntu
Docker
CoreOS
WindowsAzure

DockerをWindows Azure仮想マシンで使ってみた

More than 3 years have passed since last update.

最近噂のDockerを使ってみました。とりあえず大体分かってきたのでメモ。


そもそもDockerとは

Docker(正確にはDocker Engine)とは、OSやHTTPなどのサーバー類をひとまとめにしたコンテナを作成することが出来るツール。たとえばHTTPサーバーとPHP・MySQLなどのサーバー環境をコンテナとしてイメージを作っておくことで、いつでもまったく同じ環境を作り上げて使うことができます。

そのため、開発中のサービス専用の仮想サーバーを作り、他の環境に影響を与えることなくカスタマイズしたり、いつでも同じ環境でサービスの試験を行うことができるという、便利なツールです。


Dockerを使うには

DockerはLinux上のアプリですので、WindowsやMacでは利用できません。一応それぞれの環境用にVirtualPC上でDocker用環境を動かすBoot2Dockerという環境もあるそうですが、その説明はここでは行いません。

また、Dockerを利用するためのコンパクトなLinux、Core OSというものも存在します。今回は、Windows Azureの仮想マシンとしてCore OSを作成し、そのうえでDockerをいじってみました。


OSのbin/bashに入る

とりあえず基本。

sudo docker run -i -t ubuntu /bin/bash

UbuntuのOSイメージをダウンロードし、シェルにログインします。試験的にパッケージをインストールしてみたり、後述するDockerfileで記載する処理をシミュレーションするときなど意外と使っています。


Docker Hubのイメージを使う

Docker Engineは、Docker Hubというサービスで公開さっれているOSイメージを取り込んで使うことができます。これを使ってごく普通のWordpressな環境やら、Ubuntuの環境やらを作成することもできます。


Dockerfileを作ってOSイメージを作る

さてここからがDockerの本番。Dockerfileを作って独自のOSイメージを作ります。今回はとりあえずngixsのサーバーを作ってみます。

Core OSにSSHでログインし、~/に次のようなDockerfileを作成します。


Dockerfile

FROM ubuntu:trusty

MAINTAINER TakamiChiei<chie@onpu-tamago.net>

# パッケージのインストール
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update
RUN apt-get -y install nginx

# スタート
EXPOSE 80
CMD ["/usr/sbin/nginx", "-g", "daemon off;"]


最後から二行目のEXPOSE 80が、ポートを公開する設定。これによってコンテナの外からコンテナないの80番ポート(つまり、HTTP)を表示することができるようになります。

かけたら早速実行。


ビルド

sudo docker build -t [タグ名] .


タグ名は、「自分の名前/任意の文字」と言うのが一般的なパターンのようです。自分の場合は、「takamichie/nginx」など

ビルドをすると、インストールするaptのインストール処理などでしばらく待たされます。一度ビルドした後、次にビルドするまでにパッケージが変更されてなかった場合は、ビルド処理が短縮されるようです(が、apt-get -y installでふたつ以上のパッケージをインストールするときは、短縮されない模様。面倒でもインストールは一行に一つだけとした方がいいのかもしれません)。

ビルドが終わったら、早速実行。


run

sudo docker run -p 8080:80 -d takamichie/nginx


これでnginxを起動したUbuntuのコンテナが実行され、HTTPが8080番ポートで公開されます(-p 8080:80は、「コンテナが80番ポートで公開している内容を、8080番ポートで外向けに公開する」という意味。ただし、WindowsAzure環境上ではもう一手間あります)。


8080番ポートをエンドポイントとして設定する

Windows Azure上でDockerを実行している場合は、Windows Azure仮想マシン内で公開されているポートを、仮想マシンのエンドポイントとして設定する必要があります。

「参照>仮想マシン>[仮想マシンの名称]>Settings>エンドポイント」より「追加」をクリックし、名前(エンドポイント)が「HTTP」、パブリックポート・プライベートポートを8080に設定したエンドポイントを作成します。

2015-02-10_01h07_04.png

ここまでできたら早速仮想マシンのアドレス「[仮想マシン名].cloudapp.net」にアクセスしてみましょう。

2015-02-10_01h18_56.png

無事にサイトが表示されました。


サイトをSSLに対応させる

さてそれでは、このサイトをSSLに対応させてみます。SSL証明書の発行には今回StartSSLを使用します。StartSSLの使い方は以下を参照してください。

-無料のSSL証明書StartSSLを活用する

ここから先の処理は、残念ながらAzureに最初から設定されているcloudapp.netドメインでは実行できません。独自のドメインを設定しておく必要があります。

ドメインが一個手元にある場合のみの記述になります。


ドメインを設定する

まずはドメインを設定します。それぞれのドメイン管理画面にて、「[サブドメイン名].[ドメイン名]」のAレコードを作成します。

Aレコードの値は、Azureポータルの仮想マシンの情報ページにある「Virtual IP address」で大丈夫みたいです。


前準備

Azure仮想マシン上に、次の三つのファイルを作成します。


  • nginx用のSSL設定定義ファイル(ssl.conf)

  • 認証用ファイル(ssl.crt)

  • 認証鍵ファイル(ssl.key)

ssl.confの中身は、次の通り


ssl.conf

server{

listen 443;
server_name devbael.onpu-tamago.net;
ssl on;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!ADH:!MD5;
ssl_certificate /etc/nginx/ssl_certfile/ssl.crt;
ssl_certificate_key /etc/nginx/ssl_certfile/ssl.key;
}

とりあえず三つのファイルをCoreOSの~/に配置します。


DockerfileにSSL関連処理を追加する

DockerfileにHTTPSに関連する処理を追加します。最近のnginxは初期設定で/etc/nginx/conf.d/というディレクトリに追加設定を置けるようになっているので、それを利用します。


Dockerfile(追加分のみ)

# SSL情報を格納

ADD ssl.conf /etc/nginx/conf.d/ssl.conf
RUN mkdir /etc/nginx/ssl_certfile/
ADD ssl.key /etc/nginx/ssl_certfile/ssl.key
ADD ssl.crt /etc/nginx/ssl_certfile/ssl.crt
RUN chmod 400 /etc/nginx/ssl_certfile/ssl.key
RUN chmod 400 /etc/nginx/ssl_certfile/ssl.crt


実行する

おわったら早速、build&run。今回HTTPSは8081番ポートに結びつけておきます。


build&run

sudo docker build -t [タグ名] .

sudo docker run -p 8080:80 -p 8081:443 -d takamichie/nginx

Azureのポータルより、8081ポートをエンドポイントに設定することをお忘れなく。

DNSの浸透後、設定したドメインを表示してみます。

2015-02-10_01h42_09.png

無事表示されました。


今後

今後はひとまず、実際にサービスをデプロイしてためしてみたいと思います。

ひとまず公開できそうなネタができたら、また掲載したいと思います。