VirtualBox上にUbuntuのVMを作成し、DockerとNode.jsを入れて、ホストOSからアクセスするちょっとした環境を作る


ローカルにUbuntuのVMをいれて、UbuntuにNode.jsとDockerいれて、ホストOSからアクセスする方法のメモ。
VirtualBoxのダウンロード・インストールしていることが前提となります。


 


 

【もくじ】

0.はじめに
1.UbuntuのVMイメージをゲットする
2.VirtualBoxにUbuntu VMを作成する
3.ゲストOS起動・初期設定
4.ゲストOSへのIP設定、opensshdインストール、SSHでの接続
5.Docker、Node.jsインストール
6.Node.jsの簡易アプリを作成してホストOSからアクセス




     0.はじめに

ローカルのマシンがWindows10(pro)なので、最初はDocker for WindowsいれてローカルでDocker立ち上げようと思ってたんですが、Docker for Windows(の仮想化機能のHyper-V)とVirtualBoxが同居できないという問題があるようで、実際、Docker for WindowsいれてDocker起動したあとはVirutlBoxのVMが起動できなくなったし、詳細は追跡していませんが、Hyper-Vがネットワークを使ってしまって?インターネットに出れなくなっちゃって?(この辺本当詳しくない…)、なんかもういろいろ面倒くさいので、ローカルでDockerあげるのはやめて、ゲストOSに逃がしちまえと思うに至りました。
ゲストOSにUbuntu選んだ理由は大してありません。なんとなくググってみたら最初にそれがひっかかったくらいな程度です。(OSごとの違いとかもよくわかってないのでマジで適当です)
その辺の手順メモを備忘録で載せております。

VirutlBoxにおけるVMの作成から、ゲストOSへのSSH接続、Docker及びNode.jsのインストール等、基本的な手順やトピックスは一通りこの記事にそろえてあるので、ゴールである「Docker+Node.js」のキーワードに囚われなくても、環境構築回りのことは押さえられると思います。
Node.jsを軽く勉強するためのちょっとした環境が欲しかっただけで、そもそも目的は私の備忘録(いつか私が同じことをやるときに役立てるため)です。

     1.UbuntuのVMイメージをゲットする

ここからゲットできますので、ダウンロードしてきます。
「ubuntu vm image」とかで検索すれば大体1~2番目にすぐヒットするはずです。

     2.VirtualBoxにUbuntu VMを作成する

VirutlBoxマネージャーの「新規」ボタンを押します




タイプ:Linux、バージョン:Ubuntu(64-bit)を選択します。
名前は適当です(後で変更できるのでわかりやすければなんでもいい)




続いてメモリサイズを決めます。
デフォだと1024MB(1GB)になりますが、せめてもう少しはあげたいところですよね。。。
私はあまり深いこと考えずとりあえず2倍の2048MBでいいかみたいな適当な決め方しましたが、VMだからまだしも(?)現代のパソコンではもはやあり得ない数値設定です。
ちなみに2048MBだとVMはなかなかもっさりします。(当たり前かw)




仮想ハードディスクの割り当てを行います。
ここで、1.でゲットしてきたUbuntuのVMイメージ(.vhdファイル)を選択します。




これでとりあえず作成完了です。
このあと、起動する前に、作成したVMの「設定」を選択し、「ネットワーク」の設定画面を表示します。
「アダプタ-2」のタブを選択し(アダプター1にはNATがもう既に設定されている、はず)「ネットワークアダプタを有効化」にチェック、「割り当て」で「ホストオンリーアダプター」を選択します。
また、このとき、「高度」の設定を開いて、「MACアドレス」をメモしておきます。
(これは後でもいいんですがとりあえず一旦ここで設定しておきます)


     3.ゲストOS起動・初期設定

VMを起動します。
初回起動時はUbuntuの初期設定から始まります。
画面の指示に従って進めていきます。

言語設定は日本語で。




キーボードも日本語版で。




ユーザーを登録。
マシン名もここで指定できます。
なんでもいいですがこのユーザーで今後もいろいろやっていくのでユーザー名とパスワードは忘れないようにしましょう。




初期処理の後、以下画面が出れば完了。
パスワードいれてログインします。


     4.ゲストOSへのIP設定、opensshdインストール、SSHでの接続

Ubuntuのデスクトップ環境が開いたら、右上のネットワーク設定のアイコン(つながってなければ扇形みたいなマーク、つながってれば↑↓みたいなマーク)を右クリックして、「接続を編集する」をクリックします。




Wired Connection 2を選択して「編集」ボタンを押します。




このとき、「Ethernet」のタブを選択し、MACアドレスの値を確認します。
2.の最後の手順でメモした、VirtualBoxのアダプタ設定に表示されていたMACアドレスと一致していることを確認します。
「アダプター」に設定しているのでたいてい2番目のネットワーク(なのでWired Connection 2)になります、が、もし違ったらWired Connection 1のほうを確認してみてください。




「IPv4設定」タブを押してIPアドレス等を設定していきます。


編集内容としては以下の通りです。

方式 手動
アドレス 192.168.56.104※
ネットマスク 255.255.255.0
ゲートウェイ 255.255.255.0
DNSサーバー 192.168.56.1※

※これは環境ごとに適切に変えてください。(私の環境がこうだったというだけ)
VirtualBoxのホストオンリーアダプターは、ゲストOSとの間のデフォルトのローカルアドレスを192.168.56.xxxとし、ホストOSのIPを192.168.56.1とするようです。
環境下に複数のVMがおり、かつそれらにこれと同様の方法でホストオンリーアダプターを設定して各々固定IPを振っていると、(当たり前ですが)IPの競合が起きる可能性があるため、競合しないIPを探す必要があります。

この後、ホストOSからpingを打ってつながればOKです。
(この例だと「ping 192.168.56.104」)


続いて、ゲストOS側にopensshをインストールします。
ゲストOSのデスクトップ環境左上にあるubuntuVM+Docker_09-00.pngってマークを右クリックして、検索キーワード部分に「ter」くらいまでうちます。
検索結果に「端末」という黒いマークのアイコンが出てくると思うので、それをクリックします。


以下のコマンドを実行します。

$ sudo apt-get update  
$ sudo apt-get install openssh-server  
$ sudo service ssh restart  

 

 


ubuntuVM+Docker_09-02.png

最初のコマンド打った時にパスワード聞かれますが、3.で作ったユーザー(つまり現在ログイン中のユーザー)と同じパスワードでよいです。
ダラダラいろいろ標準出力出てきますがあまり気にしないでください。
openssh-serverを入れた直後で勝手にサービス起動するらしいですが、一応最終的に、以下コマンドを実行して、結果が「start/running」(実行中)になっていることを確認します。

$ sudo service ssh status  

 


最後にホストOSでTera Termを起動して、ゲストOSのUbuntuに接続してみます。
IPアドレスは(この例では)192.168.56.104、ユーザーとパスワードは3.で作ったユーザーです。



以後の作業はホストOSからTera TermでゲストOSにつないで、ホストOS側から行うことができます。
(と、思ったけど、よく考えたら別にゲストOS側のTerminalで操作できれば別にこの手順は不要ですね(;´Д`)
「これはゲストOSでの諸々の操作をTera Termでやりたい(Tera Termのほうが使い慣れている)」という私の個人的な要望によるものであり、必須ではない、とだけ一応追記しておきます。。。)

この辺の、「VirtualBoxのゲストOSにSSHで接続してみる」は、ググれば非常に多くの記事が見当たりますので、わからなければ調べてみてください。
私が参考にした記事を載せておきます。
http://tenten0213.hatenablog.com/entry/2013/10/15/232600
http://d.hatena.ne.jp/geek-it/20120501/p1

     5.Docker、Node.jsインストール

Tera Termを起動して、ゲストOSのUbuntuにログインします。

まずDockerですが、Dockerに関してはこの記事が詳しいです。
やることといえば、

$ sudo apt-get install -y \  
    apt-transport-https \  
    ca-certificates \  
    curl \  
    software-properties-common  


と、

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -  


と、

$ sudo apt-key fingerprint 0EBFCD88  


を実行して最下部にDockerのFingerprintがあることを確認するのと、

$ sudo add-apt-repository \  
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \  
   $(lsb_release -cs) \  
   stable"  


と、

$ sudo add-apt-repository \  
   "deb [arch=armhf] https://download.docker.com/linux/ubuntu \  
   $(lsb_release -cs) \  
   stable"  


と、

$ sudo apt-get update  
$ sudo apt-get install -y docker-ce  


です。

最後に

$ docker version  

ってうってバージョン表示されたら完了です。

次にNode.jsですが、Node.jsに関してはこの記事が参考になります。
ただ最低限必要なのは

$ sudo apt-get install -y nodejs npm  


だけです。
実行後、下記それぞれのコマンドを打ってバージョンが表示されたら完了です。

$ nodejs -v  
$ npm -v  


     6.Node.jsの簡易アプリを作成してホストOSからアクセス

すげー簡単なNode.jsのWebアプリを作成します。
これについてはこちらの記事が詳しいです。
とりあえず作業ディレクトリを適当に作成し(例:/home/<username>/docker等)、その配下に移動します。
以後も出てきますが、<username>は環境に合わせて変更してください

$ mkdir -m 777 -p /home/<username>/docker  
$ cd /home/<username>/docker  


さらに配下に「helloworld」「work」というディレクトリを作成します。
ついでに「helloworld」配下に移動します。

$ mkdir -m 777 -p helloworld  
$ mkdir -m 777 -p work  
$ cd helloworld  


この配下に以下2つのファイルを作成していきます。
vi [ファイル名]でファイル作成を行っていってください。
相変わらず<username>は環境に合わせて変更ください。
■Dockerfile

FROM node:9-alpine  
EXPOSE 1337  
WORKDIR /home/<username>/docker/work  
COPY ["server.js", "/home/<username>/docker/work"]  
CMD ["node", "server.js"]  


■server.js

var http = require('http');  
http.createServer(function (req, res) {  
  res.writeHead(200, {'Content-Type': 'text/plain'});  
  res.end('Hello, world!\n');  
}).listen(1337);  


次に、以下コマンドでDockerイメージを作成します。
相変わらずは環境に合わせて変更ください。

$ sudo docker build -t helloworld /home/<username>/docker/helloworld  


最終行に「Successfully tagged helloworld:~」が出てることを確認します。。
一応作成されたDockerイメージをコマンドで見てみます。

$ sudo docker images  
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE  
helloworld          latest              556f2b425a70        About a minute ago   68.5MB  
node                9-alpine            a56170f59699        5 months ago         68.5MB  

↑の赤字のようなの(helloworldという名前のもの)ができているのが確認できます。

で、最後に以下のコマンドを打ってこいつを実行状態にします。

$ sudo docker run -d -p 1337:1337 --name helloworld helloworld  


なんかやたら長い乱数文字列みたいのが出てきますが、これで成功です。
一応プロセスの状態を以下コマンドで見てみます。

$ sudo docker ps -a  
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES  
a5fd37266b7c        helloworld          "node server.js"    4 seconds ago       Up 3 seconds        0.0.0.0:1337->1337/tcp   helloworld  


↑の赤字のようになってれば成功です。
ちなみにDockerfileの記述を少しミスってたりすると、「PORTS」の部分(0.0.0.0:1337->1337/tcpのとこ)が消失したりします。
この場合、Dockerfileを修正してイメージから再作成が必要になります。
docker stop helloworld→docker rm helloworld→docker rmi helloworldでプロセスとイメージを削除した後、またdocker buildからやり直してください(次回のための自戒w)

ホストOSでGoogle Chrome等のブラウザを起動し、アドレスバーに「http://192.168.56.104:1337/」を打ってみます。


成功です!
ホストOSからゲストOSに立ち上げたDockerのNode.jsコンテナにアクセスできました。

以降はTera Termを閉じても、本体のゲストOSが動いてる限りはずっとこのプロセスが動きます。
ちなみに止めたいときは以下コマンドです

$ sudo docker stop helloworld  

 




慣れてしまうと全行程でも1時間前後で可能です。(といえるほど何度も繰り返したんだがw)
「VM作成」「ゲストOSへのSSH接続」「Dockerインストール」「Node.jsインストール」等のトピックは、個々にはナレッジとしていくらでもネットに転がっていますが、集合しているものはあまり見かけないので、今回のケースのように、なんとなく目的をもって手番を踏んでいくのは、広く浅く触れられるという点で良いのではと思っています。
比較的簡易に手元に環境を作れるというのがわかっただけでも自分の中で一つナレッジになりました。