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年前くらいに手順書とか書いてて辛かったので、自動化好きな自分にとってとても良いツールというか、やりたかったことというか。