Edited at

Dockerについて調べてみたのでめもめも

More than 5 years have passed since last update.


What is docker?


  • 仮想環境を構築できる仕組み

  • 構築した環境を公開するのが容易。また公開された環境を利用するのも同様に容易

  • 簡単に生成できて簡単に破棄できるので、Immutable Infrastructureに向いている

  • LXC技術を用いているため、仮想環境の一種ではあるが、仮想機械環境ではない


How to Install


on Ubuntu

aptでインストール可能。

# apt-get install docker


on MacOS X


  • MacOS X上では直接dockerを起動できない


  • boot2dockerを用いる


    • 別途VirtualBoxが必要

    • 仮想環境経由でdockerを操作可能とする

    • Vagrant likeに操作できる

    • ちょっとインチキな感じがしないでもないが、自分でVirtualBox上にLinux構築するよりは簡単。起動も多少なりとも早いし



brewでインストールする。

$ brew install boot2docker docker

$ brew info boot2docker docker
boot2docker: stable 1.1.0 (bottled), HEAD
...
docker: stable 1.1.0 (bottled)
...


How to boot

boot2dockerの環境を構築。

最初は起動イメージがダウンロードされる。

$ boot2docker download

2014/07/10 10:46:46 Downloading boot2docker ISO image...
2014/07/10 10:46:47 Latest release is v1.1.0
2014/07/10 10:48:12 Success: downloaded https://github.com/boot2docker/boot2docker/releases/download/v1.1.0/boot2docker.iso
to /Users/uchihara/.boot2docker/boot2docker.iso

環境を初期化。

$ boot2docker init

2014/07/10 10:48:19 Creating VM boot2docker-vm...
2014/07/10 10:48:20 Apply interim patch to VM boot2docker-vm (https://www.virtualbox.org/ticket/12748)
2014/07/10 10:48:20 Setting NIC #1 to use NAT network...
2014/07/10 10:48:20 Port forwarding [ssh] tcp://127.0.0.1:2022 --> :22
2014/07/10 10:48:20 Port forwarding [docker] tcp://127.0.0.1:2375 --> :2375
2014/07/10 10:48:20 Setting NIC #2 to use host-only network "vboxnet1"...
2014/07/10 10:48:20 Setting VM storage...
2014/07/10 10:48:27 Done. Type `boot2docker up` to start the VM.

起動。

$ boot2docker up

2014/07/10 10:49:43 Waiting for VM to be started...

2014/07/10 10:49:43 Started.
2014/07/10 10:49:43 To connect the Docker client to the Docker daemon, please set:
2014/07/10 10:49:43 export DOCKER_HOST=tcp://192.168.59.103:2375

確認。

$ boot2docker status

running

これでdockerによる操作が可能となる。その際環境変数で接続先を指定する。

$ export DOCKER_HOST=tcp://192.168.59.103:2375

$ docker version
Client version: 1.1.0
Client API version: 1.13
Go version (client): go1.3
Git commit (client): 79812e3
Server version: 1.1.0
Server API version: 1.13
Go version (server): go1.2.1
Git commit (server): 79812000


How to Use


とりあえずubuntu

以下で起動できる。

初回はイメージのダウンロードが必要。

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

Unable to find image 'ubuntu' locally
Pulling repository ubuntu
e54ca5efa2e9: Pulling image (latest) from ubuntu, endpoint: https://cdn-registry
e54ca5efa2e9: Download complete
511136ea3c5a: Download complete
d7ac5e4f1812: Download complete
2f4b4d6a4a06: Download complete
83ff768040a0: Download complete
6c37f792ddac: Download complete
root@4dcceaa5f24b:/# ls
bin dev home lib64 mnt proc run srv tmp var
boot etc lib media opt root sbin sys usr

この状態でdockerのインスタンスを一覧できる。

$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4dcceaa5f24b ubuntu:latest /bin/bash 15 hours ago Up About an hour boring_euclid

ファイルを作成してみる。

root@4dcceaa5f24b:/# touch file

root@4dcceaa5f24b:/# ls -l file
-rw-r--r-- 1 root root 0 Jul 10 05:06 file

shellを抜けてみる。dockerも終了する。

root@4dcceaa5f24b:/# exit

$

一覧からも消える。

$ docker ps

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES


別コンテナを起動

もう一度起動する。

今度は起動が早い。

id的なものが変わっているのに注意。

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

root@42412eac21e9:/#

さっき作ったはずのファイルは消えている。

別の環境が立ち上がっていることが分かる。

root@42412eac21e9:/# ls -l file

ls: cannot access file: No such file or directory

さっきの環境は消えてしまったわけではない。

docker psはコンテナを一覧するコマンドだが、起動中に限らず全てのコンテナを含めるには-aオプションを付ける。

$ docker ps -a

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
42412eac21e9 ubuntu:latest /bin/bash About an hour ago Exited (2) 4 seconds ago nostalgic_perlman
4dcceaa5f24b ubuntu:latest /bin/bash 4 hours ago Exited (0) 3 hours ago drunk_mccarthy


指定コンテナの再開

現在は停止中になっているため、再開してattachする。

attach直後はプロンプトの出力がされないため一瞬固まったかと思うので注意。

Enter押下でプロンプトが再表示されるが、その際にうっかり妙なコマンドを実行してしまうことがないようCtrl+Lがオススメ。

$ docker start 4dcceaa5f24b

4dcceaa5f24b
$ docker attach 4dcceaa5f24b
root@4dcceaa5f24b:/#
root@4dcceaa5f24b:/# ls -l file
-rw-r--r-- 1 root root 0 Jul 10 05:06 file


コンテナの保存

commitでコンテナイメージを保存する。

$ docker commit 881448280ac4 uchihara/test1

9be9d854b181d6b72e2cbeffbd1d68e7f0994a180d9d9e8a71844c4cb88bb361

imagesでコンテナイメージを一覧する。

$ docker images

REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
uchihara/test1 latest 9be9d854b181 3 days ago 366.9 MB

コンテナイメージをアップロードするには事前にDocker Indexにアカウントを作成しておく必要がある。

$ docker login

Username: uchihara
Password:
Email: ***
Login Succeeded

pushでアップロード。

$ docker push uchihara/test1

The push refers to a repository [uchihara/test1] (len: 1)
Sending image list
Pushing repository uchihara/test1 (1 tags)
511136ea3c5a: Image already pushed, skipping
d7ac5e4f1812: Image already pushed, skipping
2f4b4d6a4a06: Image already pushed, skipping
83ff768040a0: Image already pushed, skipping
6c37f792ddac: Image already pushed, skipping
e54ca5efa2e9: Image already pushed, skipping
9be9d854b181: Image successfully pushed
Pushing tag for rev [9be9d854b181] on {https://registry-1.docker.io/v1/repositories/uchihara/test1/tags/latest}


Dockerfile

Dockerfileを使ってコンテナ構築ができる。

$ mkdir test1 && cd test1

$ cat >Dockerfile <<EOF
FROM ubuntu
RUN apt-get install -y hello
EOF
$ docker build -t uchihara/hello .

Dockerfileを元に構築されたコンテナで実行できる。

$ docker run -t uchihara/hello /usr/bin/hello

Hello, world!