VagrantとDockerを使ってnginxを起動する

Vagrant上でDockerを動かす方法を知りたくて、Vagrant上のDockerでnginxを起動してみました。

構成

今回はDocker用軽量ホストOSのBargeのVagrantBoxをVagrantで起動し、Barge上にNginxのDockerコンテナを構築します。

今回はNginxのコンテナが1つしかありませんが、1つのアプリケーションに1つのDockerコンテナを割り当てることで、1つのマシンで複数のアプリケーションを動かしていても、それぞれがコンテナとして独立しているため、アプリケーションの追加や破棄がしやすくなります。また、コンテナを動かすためのホストOSもVirtualBox上で動かすことで、別のマシンへの移動や複製も楽になります。

今回作成する環境は以下のような階層になります。


--------------------------
          Nginx
--------------------------
          Docker
--------------------------
          Barge
--------------------------
        VirtualBox
--------------------------
          macOS
--------------------------

ディレクトリの構成は以下のようになっています。

vmディレクトリの中にDockerfileやnginxの設定ファイルを入れておきます。vmディレクトリはBargeのホームディレクトリにマウントします。


$ tree barge
barge
├── Vagrantfile
└── vm
    └── nginx
        ├── Dockerfile
        ├── app.conf
        └── www
            └── index.html

ディレクトリはGithubにも入れておきました。

https://github.com/iamn3/barge-vagrant.git

Vagrantfileの作成

まずは、Vagrantfileを作成します。


Vagrant.configure("2") do |config|
  config.vm.box = "ailispaw/barge"
  config.vm.network :private_network, ip: "192.168.33.111" # IPアドレス固定
  config.vm.synced_folder "./vm", "/home/bargee/vm", mount_options: ['dmode=755','fmode=755'] # vmフォルダを同期する

  # Dockerのバージョンを最新(v17.09.0-ce)に切り替えて、
  # nginxのコンテナを作成・起動する。
  # Dockerのリスタートに時間がかかるため、とりあえず10秒待つ。
  config.vm.provision "shell", inline: <<-SHELL
    sudo /etc/init.d/docker restart v17.09.0-ce 
    sleep 10
    docker build -t nginx1 /home/bargee/vm/nginx 
    docker run -d -p 80:80 --name c_nginx1_1 nginx1
  SHELL
end

Docker用の設定ファイルを作成する

ゲストOSであるBargeの上でNginxを動かすための設定ファイルを作成していきます。

Dockerfileを作る

Dockerfileを以下の内容で作成します。wwwディレクトリをゲスト側の/root/wwwにマウントし、Nginxの設定ファイルをコピーしています。


FROM nginx

MAINTAINER mani

ADD ./www /root/www
ADD ./app.conf /etc/nginx/conf.d/app.conf

RUN mkdir /root/logs
RUN chmod 755 -R /root

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

Nginxの設定ファイルを作る

Nginxの設定ファイルをapp.confとしてnginxディレクトリに作ります。内容は以下です。/root/www以下をホームページのルートとして公開する設定です。ホスト上のnginx/wwwディレクトリをコンテナの/root/wwwにマウントすることでnginx/www以下に入れておいたindex.htmlが公開されます。


server {
       listen 80;
       server_name localhost;

       location / {
                alias /root/www/;
       }
}

ちなみにindex.htmlの内容はなんでもいいのですが以下にしています。


Hello Nginx!

仮想マシンを起動する

実際に仮想マシンを起動して動作を確認します。とは言ってもBargeのBoxを取得し、「vagrant up」すれば終わりです。


$ vagrant box add ailispaw/barge
$ cd ~/vagrant/barge
$ vagrant up

起動の途中でBargeで使うDockerのバージョンを最新のものにするために、Dockerデーモンを再起動していて、再起動の完了を待つために10秒ほど何もしない時間を取っているので少し時間がかかります。

ブラウザを起動時てアドレスバーに「http://192.168.33.111」を入れて実行し、以下のようなページが表示されれば成功です。

Nginxのスタート画面

まとめ

VagrantとDockerを使ってNginxを動かしてみることで、VagrantfileやDockerfileの配置方法を勉強することができました。

今度は、複数のDockerコンテナを使って、コンテナ間の連携をさせてみたいです。また、「vagrant up」した時のDockerのリスタートを待つ処理が「sleep 10」とやっつけ感がすごいのでなんとかしたいです。

シェアする

  • このエントリーをはてなブックマークに追加