Vagrant + CoreOS + Docker でコンテナ環境体験

  • 374
    いいね
  • 4
    コメント
この記事は最終更新日から1年以上が経過しています。

Vagrant で CoreOS を動かし、その上で Docker を使ってみます。
ここでは、簡単な概念の説明と、初歩的な操作方法について書いています。

Docker とは

http://ja.wikipedia.org/wiki/Docker

  • コンテナ型仮想化
    • VirtualBox / Vmware ではOSイメージが多すぎるとスペースがもったいない
    • カーネルはホストと共有で、各コンテナが独立したユーザーランドを持つ
    • http://tkng.org/b/2013/11/17/vm-and-container/ あたりがわかりやすい
  • コンテナは実行完了後に破棄されます

構成イメージ

Container | Container | ...
-----------------------
       Docker
-----------------------
       CoreOS
-----------------------
     VirtualBox
-----------------------
    LocalMachine

ちなみに今回 CoreOS を使っているのは、単純に docker が最初から入っているからです

準備

CoreOS を動かす

$ git clone https://github.com/coreos/coreos-vagrant.git
$ cd coreos-vagrant
$ vagrant up
$ vagrant ssh

詳しくは http://coreos.com/docs/running-coreos/platforms/vagrant/

Docker をいじってみる

$ docker version
$ docker pull ubuntu:latest
$ docker images

$ docker run ubuntu echo "Hello, Docker"
Hello, Docker

Docker image と container

image と container がわかりにくいかもしれないので、簡単に概念を書いておきます。
ただし間違っているかもしれないので、ご指摘ください。

  • image をベースに container を生成します
    • build で image 生成
    • run で container 生成
  • image の設計図が Dockerfile
  • container を image として保存できます

Docker image を作ってみる

ubuntu をベースに作ります

まずは、コンテナを起動し、shell に入ります

$ docker run -t -i ubuntu /bin/bash

コンテナ内で環境をいじります

$ sed -i s/archive.ubuntu.com/ftp.jaist.ac.jp/ /etc/apt/sources.list
$ apt-get update
$ apt-get install golang
$ go version
$ exit

いじった環境を image として保存します

$ docker ps -l
$ docker commit <hash> myuser/golang
$ docker images

保存した image からコンテナを作ります

$ docker run myuser/golang go version
$ docker ps -l

Dockerfile から image を作る

さきほど作った image を元に、別の image を作ります

Dockerfile
FROM myuser/golang

RUN apt-get install -qq -y --force-yes nginx
RUN echo "daemon off;" >> /etc/nginx/nginx.conf

EXPOSE 80

CMD ["nginx"]

ここでは nginx をインストールし、起動時に foreground で nginx が立ち上がるようにしています。

image を作成し、コンテナを起動します

$ docker build -t myuser/nginx .
$ docker run -d -p 80:80  myuser/nginx
$ docker ps

LocalMachine のブラウザから nginx にアクセスしてみます
http://172.17.8.101/

Hello! nginx. は見えましたか?

不要になったコンテナは停止しましょう

$ docker ps
$ docker stop <hash>
$ docker ps -l

Dockerfile の書き方: https://docs.docker.com/reference/builder/

いろいろな使い方

container の削除

$ docker rm $(docker ps -a -q)

ホストとファイル共有

ホストとファイルを共有するオプションがあります。

$ echo 'Hello, Host' > /home/core/share/hello.txt
$ docker run -v /home/core/share:/usr/local/share -t -i ubuntu cat /usr/local/share/hello.txt
Hello, Host

コンテナではファイルの保存ができない (コンテナ停止で消える)ので、永続化が必要なものはこれでホスト側に置くことができます。

image の公開

github のような公開サービスが用意されています。
https://hub.docker.com/

公開されている repository から image を pull してきて、そのまま利用したり、自分の image のベースにすることができます。
また、自分の image も公開することができます。

公開手順まで書くと長いので、ここでは説明を省きます。

あわせてやりたい

公式 tutorial: https://www.docker.com/tryit/