Dockerを久しぶりに試してみた

Dockerを昔すこしだけ触ったのだけど、バージョンも1.0を超えてちゃんと使ってみたいなと思い使ってみたメモ。

Ubuntu 14.04 on VagrantにDockerをインストールして、そこで試してみる。boot2dockerは使った事あるけどいいや。

$ vagrant init ubuntu # 14.04
$ vim Vagrantfile # config.vm.network "forwarded_port", guest: 80, host: 8080の行のコメントを外す
$ vagrant up
$ vagrant ssh

aptのsourcesをちょっと変える。

$ sudo sed -E -i.bak 's!http://[^/]+!http://ftp.jaist.ac.jp!' /etc/apt/sources.list

aptでDockerをインストール。公式ドキュメント読んだらdockerじゃなくてdocker.ioの方が良いみたいだった。 https://docs.docker.com/installation/ubuntulinux/

Note: Ubuntu (and Debian) contain a much older KDE3/GNOME2 package called docker, so the package and the executable are called docker.io.

$ sudo apt-get install docker.io
$ which docker
/usr/bin/docker

bashのcompletionも読み込んでおく。

$ source /etc/bash_completion.d/docker.io

ubuntuのイメージをダウンロードする。

$ sudo docker pull ubuntu:14.04

ubuntuのイメージを元にコンテナに入る?

$ sudo docker run -it --name node-1 ubuntu /bin/bash

Docker内に入ってから。とりあえずnode.jsを入れてみる。

# cd /root
# apt-get update
# apt-get install nodejs
# which node
# which nodejs
/usr/bin/nodejs

コマンド名、nodeじゃなくてnodejsなのか……

ついでにちょっとしたスクリプトも置いておく。

# vi index.js
var http = require('http');

http.createServer(function() {
  res.writeHead(200);
  res.end('Hello!');
}).listen(80);

コンテナから出る。

# exit

コミットしてイメージを見てみる。

$ sudo docker commit node-1 node
$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
node                latest              ff719d489805        16 seconds ago      226.6 MB
ubuntu              14.04               5506de2b643b        3 weeks ago         197.8 MB
ubuntu              latest              5506de2b643b        3 weeks ago         197.8 MB

追加されてるっぽい。

再度起動。--name node-1にしたら怒られた。nameが何に使われてるのかよくわからない。

保存したファイルとかもコミットしたので残ってる。

$ sudo docker run -it --name node-2 node
# cd /root
# ls
index.js
# cat index.js
var http = require('http');

http.createServer(function(req, res) {
    res.writeHead(200);
      res.end('Hello!');
}).listen(80);

ファイルの追加と変更の一覧が表示された。今回はファイルの削除とかはしなかったけど、削除したら表示されるのかな?

$ sudo docker diff node-1

作ったイメージの削除。

$ sudo docker rmi -f ff719d489805

Dockerfileを書いてコンテナを作って動かしてみる。

$ vi Dockerfile
$ sudo docker build --rm .
...
Successfully built 67107e660eec
$ sudo docker run -d -p 8080:80 67107e660eec

Dockerfileはこんな感じ。index.jsを作るところはファイルを作ってADDでも良かったんだろうけど。

FROM ubuntu:14.04
MAINTAINER sasa+1 <sasaplus1@gmail.com>

RUN sed -r -i.bak 's!http://[^/]+!http://ftp.jaist.ac.jp!' /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y nodejs

RUN touch /root/index.js
RUN echo 'var http = require("http");' >> /root/index.js
RUN echo 'http.createServer(function(req, res) {' >> /root/index.js
RUN echo '  res.writeHead(200); res.end("Hello!"); ' >> /root/index.js
RUN echo '}).listen(80);' >> /root/index.js

EXPOSE 80

CMD ["nodejs", "/root/index.js"]

curlでアクセスしてみると?

$ curl http://127.0.0.1:8080/
Hello!

レスポンスが返ってきた!

用は済んだので終了してもらう。

$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                  NAMES
13117aa084ae        67107e660eec        nodejs /root/index.j   2 minutes ago       Up 2 minutes        0.0.0.0:8080->80/tcp   focused_hypatia
$ sudo docker stop 13117aa084ae
13117aa084ae
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                  NAMES

止まったみたい。

改めてDockerすごい。昔はVMware ESXiにVMを作って、インストール直後のスナップショットを撮って、作業して戻して……とかしてたけどそれがもっと手軽になる。

Vagrant, Docker, Ansibleとかこの辺のツール、5年前くらいに手順書とか書いてて辛かったので、自動化好きな自分にとってとても良いツールというか、やりたかったことというか。