ENGINEER BLOG

ENGINEER BLOG

Windows10+VirtualBox+VagrantでDockerはじめました

こんにちは。ささのです。
平成最後の夏が来ようとしているのに、
Dockerの「Do」の字も知らないのはさすがに恥ずかしいのではじめようと思った次第です。

今回は、Windows10上にDocker環境を構築していきます。

Docker for Windowsもありますが、Vagrantで仮想ホストを構築して、その上でDockerを使えるようにしていきます。

先日、新入社員と話をしていたら、
「エンジニアブログ、みなさん難しいことやっていて分からないです~(意訳)」
というようなことを言われたので、新入社員でも真似できそうな簡単なやつ(のつもり)です。
ご意見お待ちしております。

すでにDockerが無いと生きていけない身体になってしまっていて、
「健全なコンテナ生活を送りたい」という方はこちらをどうぞ。
lint、testについて書いてあります。

コンテナイメージを丁寧に作る | 日販コンピュータテクノロジイ株式会社(NCT)

そもそも VirtualBox / Vagrant / Docker ってなに?

ここではざっくり説明しますが、詳しく知りたい方はぐぐってください。

VirtualBox

  • 仮想化ソフトウェア
  • ホストOS上にアプリケーションとしてインストールする
  • 仮想PCを作成し、別のOSをインストール・実行できる
  • 例)Windows10上に仮想PCを作成し、Ubuntuをインストールして実行
  • PC1台しかないけどWindowsもCentOSもUbuntuもぜーーーんぶ同時に使いたいの!っていうときに使う

Vagrant

  • 仮想マシンの構築や管理をするためのコマンドラインツール
  • 構成情報を記述した設定ファイルを元に、仮想マシンの構築から設定までを自動的に行うことができる
  • Vagrant単体では仮想化はできない(VirtualBoxなどの仮想化ソフトウェアが必要)

Docker

  • コンテナ型のアプリケーション実行環境
  • 実行環境を他のプロセスから隔離し、その中でアプリケーションを動作させる
  • VirtualBoxなどでOSをまるっと仮想化するのと比較して、ホストOS上の1つのプロセスとして実行されているためリソース消費が少ない

今回の環境

  • Windows 10 version 1709
  • VirtualBox 5.2.12 platform packages
  • Vagrant 2.1.1
    • ubuntu/xenial64
    • Docker version 18.03.1-ce

下の図のような感じです。

Windows上にVirtualBoxでUbuntuを仮想化、ここはVagrantをつかってサクッとやります。
その後、UbuntuにDockerをインストールしてContainerを動かします。

docker_1

環境構築

個人的な趣味で、WSL(Windows Subsystem for Linux)を多用していきますのでご注意ください。(WSL推しです。)
コマンドプロンプトから wsl ls -la のような感じで、頭に wls をつけることでbashコマンドが使えたりします。

DL & install

まずは以下のURLからVirtualBoxとVagrantをDLして、インストールします。
Windowsの再起動等は適宜行ってください。

Vagrantで仮想ホスト(Ubuntu)を作成する

分かりやすいように「Vagrant -> 仮想マシン名」でフォルダを作成し、移動しておきます。
今回はCドライブ直下に作成していますが、各自お好みでどうぞ。

rem フォルダ作成・移動
> mkdir c:\Vagrant\ubuntu & cd c:\Vagrant\ubuntu

ちなみに、このフォルダ名がVirtualBoxのVM名になります。
一度起動するとVirtualBoxマネージャーに表示されるようになります。
(今回の場合は「ubuntu_default_~~~~~~~~」)

docker_3

Vagrantで仮想マシンを生成するには、ベースとなるBoxファイルが必要です。

今回は 「ubuntu/xenial64 – Official Ubuntu 16.04 LTS (Xenial Xerus) Daily Build」 を使用します。
以下のコマンドで、インストールするOSを指定して初期化します。

rem Vagrant初期化
> vagrant init ubuntu/xenial64

初期化が完了するとVagrantfileという仮想マシンの構成を記述するファイルがカレントディレクトリに作成されます。

> c:\Vagrant\ubuntu>wsl ls -la
total 4
drwxrwxrwx 0 root root  512 Jun  5 15:57 .
drwxrwxrwx 0 root root  512 Jun  5 15:57 ..
-rwxrwxrwx 1 root root 3092 Jun  5 15:57 Vagrantfile

参考)以下のURLにBoxファイルが多数公開されています。
Discover Vagrant Boxes – Vagrant Cloud

Vagrantfileの修正

このままでも仮想ホストを起動することは可能ですが、プライベートIPアドレスを変更しておきます。
今回は「192.168.33.66」にします。(メモ帳などで編集してもいいです。)

> c:\Vagrant\ubuntu>wsl vi Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

# All Vagrant configuration is done below. The "2" in Vagrant.configure
# configures the configuration version (we support older styles for
# backwards compatibility). Please don't change it unless you know what
# you're doing.
Vagrant.configure("2") do |config|
  # The most common configuration options are documented and commented below.
  # For a complete reference, please see the online documentation at
  # https://docs.vagrantup.com.

  ~~~ 略  ~~~

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.11"  

  config.vm.network "private_network", ip: "192.168.33.66"

  ###############################################
  #       ↑↑↑ ここでIPアドレスを指定 ↑↑↑          #
  ###############################################
  
  # Create a public network, which generally matched to bridged network.
  # Bridged networks make the machine appear as another physical device on
  # your network.
  # config.vm.network "public_network"

  ~~~ 略  ~~~

  # Enable provisioning with a shell script. Additional provisioners such as
  # Puppet, Chef, Ansible, Salt, and Docker are also available. Please see the
  # documentation for more information about their specific syntax and use.
  # config.vm.provision "shell", inline: <<-SHELL
  #   apt-get update
  #   apt-get install -y apache2
  # SHELL
end

仮想ホストを起動してSSHする

準備ができたので、起動してみます。

rem 仮想マシンの起動
> vagrant up

カレントディレクトリが先程作成したディレクトリになっていることを確認して、
コマンドプロンプトで上記コマンドを実行するだけです。簡単ですね。

初回は時間がかかるので瞑想をしながら待ちます。

仮想マシンが起動したらSSHします。
Vagrantでは以下のコマンド一発です。素晴らしいですね。

rem 仮想マシンにssh
> vagrant ssh

よくある感じのターミナルが表示されればOKです。
このとき、vagrantユーザーでログインされます。

vagrant@ubuntu-xenial:~$

今は行わなくて良いですが、使い終わったらログアウトして、

# ログアウト
$ exit

仮想マシンを停止するのもお忘れなく。

rem 仮想マシンの停止
> vagrant halt

うっかり仮想マシンの停止まで行ってしまったら、もう一度起動してSSHしておきましょう。

UbuntuにDockerをインストールする

無事UbuntuにSSHでログインできたら、Dockerをインストールします。

手順は以下参照。「INSTALL DOCKER CE」から下の部分です。
Get Docker CE for Ubuntu | Docker Documentation

最後に hello-worldを実行して以下のように表示されれば正常にインストールされています。
これで、たのしいたのしいDocker生活が送れます。わーい。

$ sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

Docker image をつくって動かしてみる

環境構築して終わりだと寂しいので、簡単なHTMLを表示するWEBサーバをつくります。

Dockerfile をつくる

なにはともあれ Dockerfile をつくります。

  • FROM: どのイメージを基にするか
  • MAINTAINER: 作成したユーザの情報
  • RUN: docker buildするときに実行
  • COPY: ローカルファイルをコンテナの中にコピー
  • EXPOSE: コンテナが接続用にリッスンするポートを指定
  • CMD: docker runするときに実行

といった構成情報を書いていきます。

今回は、

CentOS6 をベースに、httpd をインストール。
後ほどホームディレクトリに作成する index.html を Container 内へコピー。
WEBサーバなので80番ポートを Listen させる。
Container を動かし始めるときに httpd を動かす。

という内容です。

$ vi ~/Dockerfile
FROM centos:centos6
MAINTAINER sasanom
RUN yum install -y httpd
COPY ./index.html /var/www/html
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]

(2018/06/15 13:00 追記)
こちらの記事によると、最近は MAINTAINER は非推奨のようです。

LABEL maintainer "sasanom"

とするのが良さそうです。

index.html をつくる

WEBページの表示内容を適当につくります。

$ vi ~/index.html
<!DOCTYPE html>
<html lang="ja">
  <head>
    <meta charset="UTF-8">
    <title>Docker TEST HTTPD</title>
  </head>
  <body>
    <h1>Docker TEST HTTPD !!!</h1>
  </body>
</html>

Docker image をつくる

Dockerfileから「sasanom/httpd」という名前の image を build します。
image名は「ユーザ名/リポジトリ名」にするのが一般的なようです。

# sudo docker build [-t {イメージ名}] {Dockerfileのあるディレクトリ}
$ sudo docker build -t sasanom/httpd .

処理が終わったら以下のコマンドで image 「sasanom/httpd」が作成されたか確認します。

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
sasanom/httpd       latest              7ecea08918ea        8 seconds ago       195MB
hello-world         latest              e38bc07ac18e        7 weeks ago         1.85kB
centos              centos6             70b5d81549ec        8 weeks ago         195MB

Container を動かす

仮想ホスト(Ubuntu)の8080ポートにきたアクセスを Container の 80ポートに転送しつつ、
バックグラウンド起動にするおまじないをつけて、先程作成した image から Container を起動させます。
この程度のものであれば数秒で立ち上がって、すぐに使えるようになるのがすごいところです。

sudo docker run -p 8080:80 -d sasanom/httpd

ブラウザから「仮想ホストのIPアドレス:8080ポート」にアクセスして、
先程作成したindex.htmlが表示されればOKです。

192.168.33.66:8080

docker_2

さいごに

だいぶ初歩的な内容でしたが、 Vagrantを使用した仮想ホストの作成から、
Docker環境の構築、Docker Container を動かすところまでご紹介しました。

今回はコマンドラインからさくさく進めるためにVagrantを使いましたが、本来は、複数人で同一の環境を構築したいという場面や、環境構築を自動で行いたいといった場面で効果が発揮されるものだと思います。

以上、普段はMac使いですが、
GW最終日にうっかり買ったLenovo ThinkPad X1Carbonを使いたくて、
みんな大好き Windows PC でもそのまま真似できるネタにしてみました。