ko2ic Blog

悩みがネタ

Dockerメモ

| Comments

「VagrantでVirtualBox内でubuntuを動かして、そのubuntu内でdockerコンテナを起動して、その中でubuntuを動かす」
という文章にするとややこしいことをすぐ忘れるので自分用にメモしておく。
(この記事ではVagrant1.6からのDocker Provider・boot2dockerを使わない)

Vagrant

Vagrant Boxから適切なBoxを選択する。

まずは、VirtualBox内で動作するubuntuのBoxを使ってVagrantfileを作成する

1
$ vagrant init ubuntu-docker https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/ubuntu-14.04-amd64-vbox.box 

作成した後に、vagrant起動。
この時にboxをローカルに配置している。
boxの配置される場所は ~/.vagrant.d/boxes

1
$ vagrant up

ちなみにvagrant終了はこれ

1
$ vagrant halt

ちなみに破棄はこれ

1
$ vagrant destroy

再起動はこれ

1
$ vagrant reload

VirtualBox内で動作するubuntuにsshで接続する

1
2
$ vagrant ssh
vagrant@ubuntu-14:~$

Dockerインストール

VirtualBox内で動作するubuntuにはdockerがinstallされていないので、installする。
この際にインストールするのは docker ではなくて、 docker.io
全く違うものなので、間違えるとこんなエラーが出るので注意。
参考記事
Segmentation Fault or Critical Error encountered. Dumping core and aborting.

1
2
3
4
5
vagrant@ubuntu-14:~$ docker -v
The program 'docker' is currently not installed. You can install it by typing:

vagrant@ubuntu-14:~$ sudo apt-get install docker.io
vagrant@ubuntu-14:~$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker

再度バージョンを調べる。

1
2
vagrant@ubuntu-14:~$ docker -v
Docker version 0.9.1, build 3600720

バージョンが古いので最新にする。

1
2
3
vagrant@ubuntu-14:~$ curl -s https://get.docker.io/ubuntu/ | sudo sh
vagrant@ubuntu-14:~$ docker -v
The program 'docker' is currently not installed.

認識しなくなった。。

1
2
vagrant@ubuntu-14:~$ which docker
/usr/bin/docker

なるほど。前作ったシンボリックリンクが邪魔なのね。

1
2
3
4
vagrant@ubuntu-14:~$ sudo rm /usr/local/bin/docker
vagrant@ubuntu-14:~$ source .bashrc
vagrant@ubuntu-14:~$ docker -v
Docker version 1.0.1, build 990021a

無事新しくなった。
dockerデーモンが動いている。

1
2
3
vagrant@ubuntu-14:~$ ps aux | grep docker
root      6066  1.3  1.5 495764 15664 ?        Ssl  07:30   0:35 /usr/bin/docker -d
vagrant   6298  0.0  0.0  11744   920 pts/0    S+   08:13   0:00 grep --color=auto docker

Docker使い方メモ

docker run

1
2
vagrant@ubuntu-14:~$ sudo docker run ubuntu /bin/cat /proc/version
Linux version 3.13.0-24-generic (buildd@panlong) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014

これで、以下のことが起きるらしい

  • 最初はubuntuイメージをDockerのRepositoryから取得
  • ubuntuイメージを使ってdockerデーモンが新規に起動したコンテナ内で cat コマンドを実行

docker内で起動しているコンテナ内で作業をしたいので、標準入力を開く -i と端末を割り当てる -t を付けて起動してみる。
起動後、上記と同じコマンドを叩くと確かに同じubuntu。

1
2
3
vagrant@ubuntu-14:~$ sudo docker run -it ubuntu /bin/bash
root@968e85928a5a:/# cat /proc/version
Linux version 3.13.0-24-generic (buildd@panlong) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1) ) #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014

docker内のプロセスはbashしか動いていないとのことなので確かめてみる。

1
2
3
4
root@968e85928a5a:/# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.1  18156  1964 ?        Ss   08:17   0:00 /bin/bash
root        15  0.0  0.1  15568  1144 ?        R+   08:25   0:00 ps aux

確かにbashだけだった。

バックグランドで動作させるために -d でデーモンモードにする

1
2
vagrant@ubuntu-14:~$ sudo docker run -t -d ubuntu /usr/bin/perl -e 'while(1){print "Hello\n"; sleep 1}'
fdeecfacf4377cc7e81bf780b0f0bc197c45058c2b490174037db8a8f64b7598

docker ps

起動中のコンテナ一覧を表示する

1
2
3
vagrant@ubuntu-14:~$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
fdeecfacf437        ubuntu:latest       "/usr/bin/perl -e 'w   5 minutes ago       Up 5 minutes                            trusting_brattain

以下からのコマンドは、CONTAINER IDを引数にとるので、aliasにしておく

1
vagrant@ubuntu-14:~$ alias cid='sudo docker ps -l -q'

すでに終了したコンテナを含めて一覧表示する

1
vagrant@ubuntu-14:~$ sudo docker ps -a

docker logs

起動中のコンテナのログを出力する

1
2
3
vagrant@ubuntu-14:~$ sudo docker logs `cid`
Hello
Hello

コンテナのステータスの詳細をjson形式で出力する

docker inspect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
vagrant@ubuntu-14:~$ sudo docker inspect `cid`
{
    "Args": [
        "-e",
        "while(1){print \"Hello\\n\"; sleep 1}"
    ],
    "Config": {
        "AttachStderr": false,
        "AttachStdin": false,
        "AttachStdout": false,
        "Cmd": [
            "/usr/bin/perl",
            "-e",
            "while(1){print \"Hello\\n\"; sleep 1}"
        ],
        "CpuShares": 0,
        "Cpuset": "",
        "Domainname": "",
        "Entrypoint": null,
        "Env": [
            "HOME=/",
            "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
        ],
        "ExposedPorts": null,
        "Hostname": "fdeecfacf437",
        "Image": "ubuntu",
・・・

docker attach

コンテナにアタッチして端末制御を取得する

1
2
vagrant@ubuntu-14:~$ sudo docker attach `cid`
Hello

docker kill

起動中のコンテナを終了

1
2
vagrant@ubuntu-14:~$ sudo docker kill `cid`
fdeecfacf437

docker images

dockerが管理しているイメージ一覧表示

1
2
3
vagrant@ubuntu-14:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              latest              e54ca5efa2e9        2 weeks ago         276.5 MB

docker commit

自作のイメージを作るためのコマンド

1
2
3
4
5
vagrant@ubuntu-14:~$ sudo docker commit `cid` ko2ic/test
vagrant@ubuntu-14:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ko2ic/test         latest              8a7aadadc161        11 minutes ago      276.5 MB
ubuntu              latest              e54ca5efa2e9        2 weeks ago         276.5 MB

docker rmi

イメージを削除するコマンド

1
2
vagrant@ubuntu-14:~$ sudo docker rmi -f 8a7aadadc161
Deleted: 8a7aadadc16131a6bccdce922e64a94fe8b615091b8cfa1a01d7d4ee2b0caeb8

コンテナでネットワークサービスを提供

1
2
3
4
5
6
7
8
9
vagrant@ubuntu-14:~$ sudo docker run -it base /bin/bash
root@ce1526db2356:/# apt-get install -y memcached
root@ce1526db2356:/# exit
vagrant@ubuntu-14:~$ sudo docker commit `cid` ko2ic/memcached
vagrant@ubuntu-14:~$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ko2ic/memcached     latest              64c0c7c2dba1        34 seconds ago      224.3 MB
ubuntu              latest              e54ca5efa2e9        2 weeks ago         276.5 MB
vagrant@ubuntu-14:~$ sudo docker run -p 11211 -it ko2ic/memcached /usr/bin/memcached -u memcache -vv

別のターミナルで接続確認

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ vagrant ssh
vagrant@ubuntu-14:~$ sudo docker ps
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS              PORTS                      NAMES
481bf32d1fd6        ko2ic/memcached:latest   /usr/bin/memcached -   4 seconds ago       Up 4 seconds        0.0.0.0:49153->11211/tcp   cocky_bartik
48b171c2c366        ubuntu:latest            /bin/bash              About an hour ago   Up About an hour                               furious_pike
vagrant@ubuntu-14:~$ sudo docker inspect 481bf32d1fd6
・・・
    "NetworkSettings": {
        "Bridge": "docker0",
        "Gateway": "172.17.42.1",
        "IPAddress": "172.17.0.22",
        "IPPrefixLen": 16,
        "PortMapping": null,
        "Ports": {
            "11211/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "49153"
・・・
vagrant@ubuntu-14:~$ telnet 172.17.0.22 11211
Trying 172.17.0.22...
Connected to 172.17.0.22.
Escape character is '^]'.
stat ← このコマンドを打つとサーバー側でも同じ文言が表示されて通信されているのがわかる
ERROR
quit

docker port

portのマッピングを表示する

1
2
3
vagrant@ubuntu-14:~$ sudo docker port 481bf32d1fd6 11211
0.0.0.0:49153
vagrant@ubuntu-14:~$ telnet localhost 49153

コンテナ側の11211ポートがlocalhostの49153ポートにマッピングされている

次はmac側からmemcachedを触れるようにする

1
2
3
4
5
6
7
$ vim Vagrantfile
・・・
config.vm.network "forwarded_port", guest: 49153, host: 49153
・・・
$ vagrant up
$ vagrant ssh
vagrant@ubuntu-14:~$ sudo docker run -p 11211 -it ko2ic/memcached /usr/bin/memcached -u memcache -vv

別のターミナル(mac)で接続してみる

1
2
3
4
5
6
7
8
$ telnet localhost 49153
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stat
ERROR

接続成功。

Dockerfile

dockerイメージの構築をここに記述することで手動で docker commit などをしなくても良くなる

1
2
3
4
5
6
7
8
9
10
11
12
vagrant@ubuntu-14:~$ mkdir docker
vagrant@ubuntu-14:~/docker$ vim Dockerfile
FROM ubuntu

RUN apt-get update
RUN apt-get install -y memcached
RUN apt-get clean

CMD ["/usr/bin/memcached", "-vv"]
USER memcached

vagrant@ubuntu-14:~/docker$ sudo docker build -t ko2ic/memcached2 ~/docker/

Dockerfileの CMDdocker run 時の起動コマンドになる
イメージができているか確認後、起動してみる

1
2
3
4
5
6
7
8
vagrant@ubuntu-14:~/docker$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ko2ic/memcached2    latest              6ba44a313a00        30 seconds ago      282.8 MB

vagrant@ubuntu-14:~/docker$ sudo docker run -p 11211 -it ko2ic/memcached2
・・・
<29 server listening (udp)
・・・

他のターミナルで接続してみると成功していることがわかる

1
2
3
4
5
6
7
8
$ telnet localhost 49153
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
stat
ERROR

Comments