Edited at

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

More than 5 years have passed since last update.

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/