Build、Ship、and Run Any App、Anywhere。開発したら即座にビルド(Build)し、出荷(Ship)・配備し、実行(Run)するというDocker社が提唱する考え方で、昨今の開発を象徴しています。コンテナオーケストレーションツールであるKubernetesをより深く理解するためには、コンテナの理解は欠かせません。

コンテナをより深く理解するために、代表例であるDockerを実際に触ってみることで、以下を理解しましょう。

  • あらかじめ用意された環境(Dockerイメージ)の起動
  • Docker HubにおけるDockerイメージの検索
  • Dockerイメージを作ってみる(Dockerfileの理解)
  • Dockerイメージに割り当てるリソース設定

仮想化の種類(第一回の再掲)

Docker for Macのインストール

まずは事前準備として、Docker for Macをインストールします。公式サイトにアクセスし、[Get Started]をクリックします。

Dockerのトップページ

ダウンロード画面にて[Download Docker for Mac]をクリックします。

ダウンロード画面

[Docker.dmg]をダブルクリックすると以下の画面が表示されます。ドラッグ&ドロップにて、[Applications]フォルダにコピーします。

Applcationsへのコピー

インストールウィザードを進め、以下の画面が出たらインストール完了です。

Dockerの起動状況

インストールが成功しているかを確認するため、ターミナルからdockerコマンドを叩いてみましょう。

$ docker info
Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
Images: 0
~ 中略 ~
Experimental: true
Insecure Registries:
 127.0.0.0/8
Live Restore Enabled: false

Dockerイメージを起動する

Webサーバ(nginx)をコンテナ上で動作させてみましょう。dockerコマンドのrunオプションを利用します。立ち上がったらdocker psにて稼働状況を確認します。 

$ docker run -d -p 80:80 --name webserver nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
5040bd298390: Pull complete
333547110842: Pull complete
4df1e44d2a7a: Pull complete
Digest: sha256:f2d384a6ca8ada733df555be3edc427f2e5f285ebf468aae940843de8cf74645
Status: Downloaded newer image for nginx:latest
c5d69ad7b8720d050f5ba1eda87c7255be22e2380d5d6b3d5f4a9e0dd9c5dd57
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED                  STATUS              PORTS                         NAMES

c5d69ad7b872        nginx               "nginx -g 'daemon ..."   About a minute ago   Up 59 seconds       0.0.0.0:80->80/tcp, 443/tcp   webserver

ブラウザから[http://localhost/]にアクセスすると以下が表示されます。

nginxのウェルカムページへのアクセス

以下のコマンドで、nginxを停止し、再度起動することができます。

$ docker stop webserver
webserver
$ docker start webserver
webserver

以下のようにCentOSのコマンドを発行することもでき、nginxのようなミドルウェア層だけでなく、OS層までコンテナで操作できることがわかります。

$docker run centos:7 /bin/echo 'Hello World'
Unable to find image 'centos:7' locally
7: Pulling from library/centos
469cfcc7a4b3: Pull complete
Digest: sha256:989b936d56b1ace20ddf855a301741e52abca38286382cba7f44443210e96d16
Status: Downloaded newer image for centos:7
Hello World

$docker run -it centos:7 /bin/bash
[root@2c15ca4662d7 /]# echo 'Hello World'
Hello World

Docker HubでDockerイメージ検索

実は先ほど使ったnginxのDockerイメージはDocker Hubで登録されています。例えばnginxに関するものだけでも検索時点(2018/10)で41634件登録されていますので、使ってみたいものを検索してみると良いでしょう。

Docker Hubでnginxの検索

Dockerイメージを作ってみる

Node.jsのアプリケーションを作ってDockerイメージを構築してみましょう。server.jsファイルを作成し、[Hello Node World!]と返すだけの処理を実装します。

$vi server.js
var http = require('http');

var handleRequest = function(request, response) {
  console.log('Received request for URL: ' + request.url);
  response.writeHead(200);
  response.end('Hello Node World!');
};
var www = http.createServer(handleRequest);
www.listen(8080);

Dockerfileファイルを作成し、Dockerイメージの設定を記述します。例えば、FROM句にて、元となるDockerイメージ(node:10.12.0)を指定したり、CMD句にて利用するコマンド(node server.js)を指定したりします。

$vi Dockerfile
FROM node:10.12.0
EXPOSE 8080
COPY server.js .
CMD node server.js

[docker image]コマンドにて、hello-nodeという名称のDockerイメージを作成します。

$docker image build -t hello-node:v1 .
Sending build context to Docker daemon  3.072kB
Step 1/4 : FROM node:10.12.0
 ---> faaadb4aaf9b
Step 2/4 : EXPOSE 8080
 ---> Using cache
 ---> dbe6bed8217b
Step 3/4 : COPY server.js .
 ---> 45ec2e26adc8
Step 4/4 : CMD node server.js
 ---> Running in 8506f953f033
Removing intermediate container 8506f953f033
 ---> 42439f7ac61a
Successfully built 42439f7ac61a
Successfully tagged hello-node:v1

それでは実行してみましょう。コンテナ内で利用されるポートは8080で、コンテナ外(筆者の場合はmac book)から見えるポートに9000を指定しました。使い終わったコンテナはdocker psコマンドによりIDを確認した上で停止しておきます。

$docker run -p 9000:8080 hello-node:v1 &
$curl http://localhost:9000/
Hello Node World!$

$docker ps|grep hello-node
6f5914504a59        hello-node:v1                    "/bin/sh -c 'node se..."   10 seconds ago      Up 8 seconds        0.0.0.0:9000->8080/tcp   mystifying_goldberg
$docker stop 6f5914504a59
6f5914504a59

Dockerのリソース設定

Dockerイメージに割り当てるリソース設定についてもみてみましょう。まずは、Dockerコンテナがマウントするファイルパスを指定することができます。

File Sharingの設定

ディスク、メモリ、CPUサイズを指定することができます。

Diskの設定

CPU/メモリの設定

*  *  *

今回は、Dockerに触れました。dockerコマンドを使ってコンテナを操作したり、Dockerイメージを構築したりする様子がご理解いただけたでしょう。なお、Docker Registryを使ったプライベートなDockerレジストリサーバを立てる事で、構築したイメージの管理を管理することができます。

次回はKubernetesを実際に触ってみることで、コンテナオーケストレーションを体感いただきます。

著者紹介


正野 勇嗣 (SHONO Yuji ) - NTTデータ 課長

2011年まで開発自動化技術のR&Dに従事。その後、開発プロジェクト支援やトラブルシューティング等に主戦場を移す。「ソースコード自動生成」に加えて、JenkinsやMaven等の「ビルド自動化」、JsTestDriverやSelenium等の「テスト自動化」を扱うようになり、多様化する開発自動化技術動向に興味。

最近は第四の自動化であるInfrastructure as Code等の「基盤自動化」の魅力に惹かれている。開発自動化技術に関する雑誌・記事執筆も行う。3児のパパ。