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]をクリックします。
ダウンロード画面にて[Download Docker for Mac]をクリックします。
[Docker.dmg]をダブルクリックすると以下の画面が表示されます。ドラッグ&ドロップにて、[Applications]フォルダにコピーします。
インストールウィザードを進め、以下の画面が出たらインストール完了です。
インストールが成功しているかを確認するため、ターミナルから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を停止し、再度起動することができます。
$ 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イメージを作ってみる
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コンテナがマウントするファイルパスを指定することができます。
ディスク、メモリ、CPUサイズを指定することができます。
* * *
今回は、Dockerに触れました。dockerコマンドを使ってコンテナを操作したり、Dockerイメージを構築したりする様子がご理解いただけたでしょう。なお、Docker Registryを使ったプライベートなDockerレジストリサーバを立てる事で、構築したイメージの管理を管理することができます。
次回はKubernetesを実際に触ってみることで、コンテナオーケストレーションを体感いただきます。
著者紹介
![]() |
正野 勇嗣 (SHONO Yuji ) - NTTデータ 課長
2011年まで開発自動化技術のR&Dに従事。その後、開発プロジェクト支援やトラブルシューティング等に主戦場を移す。「ソースコード自動生成」に加えて、JenkinsやMaven等の「ビルド自動化」、JsTestDriverやSelenium等の「テスト自動化」を扱うようになり、多様化する開発自動化技術動向に興味。
最近は第四の自動化であるInfrastructure as Code等の「基盤自動化」の魅力に惹かれている。開発自動化技術に関する雑誌・記事執筆も行う。3児のパパ。