docker on Debian

とある早朝の散歩時、向こうの方から犬を散歩させてるおじさんがやってきた。

犬は柴犬。尋常じゃない喜びを表現してたぞ。尻尾はちぎれんばかりに振る、振る、振る。 ジャンプして、ご主人の顔を舐めようとする。大騒ぎ、もうこれ以上喜びを表現出来ませんって ぐらいな表情をしてる。

こういうのを見ると、オイラーも楽しくなってくるぞ。

そう言えば、いつも出会うゴールデンレトリバーを見ないな。いつものおばちゃんに聞いたら、 去年回虫にやられて亡くなってしまったとか。ちゃんと予防接種をしてても、だめな時は だめなんですねぇ。

docker

前回から、qemu-kvm とか、FreeBSDのbhyveなんていう仮想がらみをやってる。リナで 近頃有名な、ドッカーとかいう、軽めな仮想も有るようなので、これに触っておかないと 片手落ちだろう。

qem-kvmはCentOSに入れたので、dockerはDebianに入れてみるかな。どなたかが 作ってくださったインストールスクリプトが有ったので、有難く頂戴した。

debian様は相性で呼ばれる事が多くて困る。unameしても出てこないしね。

[debian ~]$ uname -a
Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2 (2017-04-30) x86_64 GNU/Linux

しょうがなしに、こんな証明書の事を覚えてしまったぞ。困ると言うと和暦推進派が暗躍してる ようで、西暦を使うなと時代錯誤の事を言う人がいる。こういう事を言う輩は、役所や銀行で 手続きとかやった事無いんだな。それと通販とかもだな。ダブルスタンダードは止めて、 西暦一本で行ってくれよ。

リニア新幹線が平成XX年開業予定とか言われても、絶対にそんな年はやってこないと思うぞ。 途中で、大地震とか疫病が流行って、改暦されるに違いない。

[debian ~]$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 8 (jessie)"
NAME="Debian GNU/Linux"
VERSION_ID="8"
VERSION="8 (jessie)"
ID=debian
HOME_URL="http://www.debian.org/"
SUPPORT_URL="http://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

こういう時は、*BSDみたいに過疎化してないOSってありがたい。 (そりゃ違うだろ、*BSDなんてのに触る人は、manと勘だけで何とかしちゃう猛者ばかりだから、わざわざ公開なんてしないのさ。)

sudo apt-get install -y curl apt-transport-https \
  software-properties-common ca-certificates
curl -fsSL https://yum.dockerproject.org/gpg | sudo apt-key add -
sudo add-apt-repository "deb https://apt.dockerproject.org/repo/ \
debian-$(lsb_release -cs) \
main"
sudo apt-get update -y
sudo apt-get install -y docker-engine
sudo systemctl start docker
sudo systemctl enable docker

dockerはソケットを使うようなので、自分もdockerグループに参加。リナの作法でグループに 登録するのが若者なんでしょうが、オイラーはロートルなのさ。

sodo vi /etc/group
 :
docker:x:998:sakae

そして、dockerの情報

[debian tmp]$ docker -v
Docker version 17.05.0-ce, build 89658be
[debian tmp]$ docker info
Containers: 1
 Running: 0
 Paused: 0
 Stopped: 1
Images: 1
Server Version: 17.05.0-ce
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
  :
Docker Root Dir: /var/lib/docker

お試しのハロワ

[debian tmp]$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
78445dd45222: Pull complete
Digest: sha256:c5515758d4c5e1e838e9cd307f6c6a0d620b5e07e6f927b07d05f6d12a1ac8d7
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://cloud.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/engine/userguide/

最近の新人類は、横幅を気にしないのね。一行を80文字以内に収めるのがCUIな人の鉄則だと 思うんだなあ。まあ、兎も角、こういうコマンドを使うとVBOXのパネルみたいにインストール されてるのを確認出来るのね。知らんかったぞ。

[debian tmp]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              48b5124b2768        3 months ago        1.84kB
[debian tmp]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
413a8d87f15b        hello-world         "/hello"            31 minutes ago      Exited (0) 31 minutes ago                       pedantic_babbage

Docker Engine について

さわって理解するDocker入門

Linux: Dockerの使い方

Docker Hub

dockerの正体みたり

上のHubから有名なapacheを試してみようと思って、あちこちをつついていたんだ。 冒頭の所にある、ドッカーファイルを開いてみると、なんだこれ。

FreeBSDとかに有る、portsの仕組みそのものじゃん。あちらはMakefileだけど、 ドッカーの方は、apt-get とかで、環境を取り寄せて、ソース取り寄せて、configして makeしてinstallしてる。それが終わったら、起動するとな。

うんと分かり易いのが有った。こういうのは、勝手知ったるgaucheがいいな。これの ドッカーファイル

FROM debian:jessie
RUN apt update \
	&& apt upgrade -y \
	&& apt install -y wget build-essential \
	&& wget -O Gauche-0.9.5.tgz --no-verbose 'http://downloads.sourceforge.net/project/gauche/Gauche/Gauche-0.9.5.tgz?r=&ts=1479315272&use_mirror=jaist' \
	&& tar xzf Gauche-0.9.5.tgz \
	&& cd Gauche-0.9.5 \
	&& ./configure \
	&& make \
	&& make install

これを書いた人、コンパイルの残骸は始末してないけど、Hackする積りなのかな。ならば、 gauche信者が増えて嬉しいんだけどね。

このドッカー、FROMに書いてあるように、debian様限定。yum属の仲間のCentOSなんて、 お呼びじゃないと主張してます。リナも分断されてるのね。

という事で、ドッカーは、bsd系のportsの再発明と分かって、興味が失せました。

そりゃ、あんまりだろう。折角入れたので、少しは楽しめよ。HUBにある公式なやつを 見てたら、面白いものを発見。

alpine linux

わずか5Mのリナだって。本当か? こういうのは試してみるべし。

[debian ~]$ docker run alpine
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
cfc728c1c558: Pull complete
Digest: sha256:c0537ff6a5218ef531ece93d4984efc99bbf3f7497c0a7726c88e2bb7584dc96
Status: Downloaded newer image for alpine:latest

あっと言う間にダウンロードが終わったぞ。起動は、下記のようにするとな。

[debian ~]$ docker run -it alpine:latest /bin/sh
/ # ls
bin    etc    lib    mnt    root   sbin   sys    usr
dev    home   media  proc   run    srv    tmp    var
/ # uname -a
Linux ea5f28533407 3.16.0-4-amd64 #1 SMP Debian 3.16.43-2 (2017-04-30) x86_64 Linux
/ # id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel),11(floppy),20(dialout),26(tape),27(video)
/ # ps awx
PID   USER     TIME   COMMAND
    1 root       0:00 /bin/sh
   39 root       0:00 ps awx
/ # exit

カーネルはdebian様のものを拝借してる。プロセスはshしか動いていない。

もう一度、起動して探りを入れてみる。

/ # ls -l /bin
total 804
lrwxrwxrwx    1 root     root            12 May  9 22:52 ash -> /bin/busybox
lrwxrwxrwx    1 root     root            12 May  9 22:52 base64 -> /bin/busybox
lrwxrwxrwx    1 root     root            12 May  9 22:52 bbconfig -> /bin/busybox
-rwxr-xr-x    1 root     root        821408 Oct 26  2016 busybox
lrwxrwxrwx    1 root     root            12 May  9 22:52 cat -> /bin/busybox
  :

なる程、軽い理由が分かったわい。じゃ、C&C のNECじゃないけど、コミュニケーションは 出来るの? その前にNICは有るのか?

/ # ip address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.2/16 scope global eth0
       valid_lft forever preferred_lft forever

一人前にeth0が有るじゃん。でも、クラスBのネットワークとは、大きく出たもんだな。 きっと、debian様側にも受けが用意されているに違いない。

[debian ~]$ ip address
  :
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
    link/ether 02:42:79:6e:11:e0 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:79ff:fe6e:11e0/64 scope link
       valid_lft forever preferred_lft forever
5: veth3a3081f: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
    link/ether e2:94:60:14:ca:20 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::e094:60ff:fe14:ca20/64 scope link
       valid_lft forever preferred_lft forever

ふーん、通信出来るか疎通試験してみる。

/ # ping 172.17.0.1
PING 172.17.0.1 (172.17.0.1): 56 data bytes
64 bytes from 172.17.0.1: seq=0 ttl=64 time=0.065 ms
64 bytes from 172.17.0.1: seq=1 ttl=64 time=0.173 ms
64 bytes from 172.17.0.1: seq=2 ttl=64 time=0.110 ms
64 bytes from 172.17.0.1: seq=3 ttl=64 time=0.111 ms
^C
--- 172.17.0.1 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.065/0.114/0.173 ms
/ # netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         172.17.0.1      0.0.0.0         UG        0 0          0 eth0
172.17.0.0      *               255.255.0.0     U         0 0          0 eth0

この環境がdockerが用意してくれてるんだな。これを土台にしてやりたい事をアプリを入れて 実現してちょってのが、dockerの目指す道なんだな。

Alpine Linux入門 -環境構築編-

Alpine Linux入門 -内部構造とapkでパッケージインストール編-

こんなのを見つけた。やっぱりね。

apk add

alpine linuxには、独自のパッケージシステムが有るとな。ちょっとやってみる。

~ # apk update
fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.5/community/x86_64/APKINDEX.tar.gz
v3.5.2-74-gc6acdb11e8 [http://dl-cdn.alpinelinux.org/alpine/v3.5/main]
v3.5.2-70-gec9876f375 [http://dl-cdn.alpinelinux.org/alpine/v3.5/community]
OK: 7961 distinct packages available
~ # apk add ruby-irb
(1/11) Installing libffi (3.2.1-r2)
(2/11) Installing gdbm (1.12-r0)
(3/11) Installing gmp (6.1.1-r0)
(4/11) Installing ncurses-terminfo-base (6.0-r7)
(5/11) Installing ncurses-terminfo (6.0-r7)
(6/11) Installing ncurses-libs (6.0-r7)
(7/11) Installing readline (6.3.008-r4)
(8/11) Installing yaml (0.1.7-r0)
(9/11) Installing ruby-libs (2.3.3-r0)
(10/11) Installing ruby (2.3.3-r0)
(11/11) Installing ruby-irb (2.3.3-r0)
Executing busybox-1.25.1-r0.trigger
OK: 26 MiB in 22 packages

updateしてカタログを取り寄せ、searchで探して、add する流れになるのね。8000個近い パッケージが有れば、大体何とかなりそうな雰囲気。無かったら、開発環境を取り寄せて、 自分でコンパイルしる。

~ # which ruby
/usr/bin/ruby
~ # ldd /usr/bin/ruby
        /lib/ld-musl-x86_64.so.1 (0x5590f0a7a000)
        libruby.so.2.3 => /usr/lib/libruby.so.2.3 (0x7fdc44617000)
        libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x5590f0a7a000)
        libgmp.so.10 => /usr/lib/libgmp.so.10 (0x7fdc443b3000)
~ # ls -l /lib/ld-musl-x86_64.so.1
-rwxr-xr-x    1 root     root        563680 Jan 26 20:49 /lib/ld-musl-x86_64.so.1
~ # ldd /bin/busybox
        /lib/ld-musl-x86_64.so.1 (0x559746c6b000)
        libc.musl-x86_64.so.1 => /lib/ld-musl-x86_64.so.1 (0x559746c6b000)

ユーザーランドは、組み込みの世界だな。debian様の1/3ぐらいしかないコンパクトさでした。

alpineへ行くぞ

空気清冽なアルプスへ行けるか試してみる。まずはsshdを建てるんだな。

~ # apk add openssh
(1/3) Installing openssh-client (7.4_p1-r0)
(2/3) Installing openssh-sftp-server (7.4_p1-r0)
(3/3) Installing openssh (7.4_p1-r0)
Executing busybox-1.25.1-r0.trigger
OK: 30 MiB in 25 packages
~ # which sshd
/usr/sbin/sshd
~ # /usr/sbin/sshd
Could not load host key: /etc/ssh/ssh_host_rsa_key
Could not load host key: /etc/ssh/ssh_host_dsa_key
Could not load host key: /etc/ssh/ssh_host_ecdsa_key
Could not load host key: /etc/ssh/ssh_host_ed25519_key
sshd: no hostkeys available -- exiting.

あらら、ホストキーが無いと怒られたぞ。 host keyて、どうやって作るねん? 元祖OpenBSDの/etcの下を精査したけど見つからず。 ならば、インストール時に作っちゃうんかと思って、 /usr/src/distrib/miniroot/install.sub を見たけど、それらしい痕跡は発見出来ず。

先を急ぐので、FreeBSDを調べてみたら、/etc/rc.d/sshdで、その現場を押さえられた。

        case $alg in
        rsa1)
                keyfile="/etc/ssh/ssh_host_key"
                ;;
        rsa|dsa|ecdsa|ed25519)
                keyfile="/etc/ssh/ssh_host_${alg}_key"
                ;;
         :
	if [ -f "${keyfile}" ] ; then
                info "$ALG host key exists."
        else
                echo "Generating $ALG host key."
                /usr/bin/ssh-keygen -q -t $alg -f "$keyfile" -N ""
                /usr/bin/ssh-keygen -l -f "$keyfile.pub"
        fi

後は、猿真似するだけ!!

~ # ssh-keygen -t rsa  -N '' -f /etc/ssh/ssh_host_rsa_key
Generating public/private rsa key pair.
Your identification has been saved in /etc/ssh/ssh_host_rsa_key.
Your public key has been saved in /etc/ssh/ssh_host_rsa_key.pub.
The key fingerprint is:
SHA256:XzEDCDrcjUapWTOfN32hwTuUqE/Uw6aHqLgw2fvMia8 root@b6f05c8e5f7c
The key's randomart image is:
+---[RSA 2048]----+
|      oo ..= .   |
|   . +=o. o.X .  |
|    ++++.= *+= . |
|    oo  = * *+.  |
|   o . .S+ o.o   |
|  + o .  ...     |
|   o o    .      |
|    o+ .         |
|    E+*          |
+----[SHA256]-----+
~ # ssh-keygen -t dsa  -N '' -f /etc/ssh/ssh_host_dsa_key
Generating public/private dsa key pair.
  :

こんな風にして、鍵を4種作成。続いて、/usr/sbin/sshd したら、やっと常駐してくれた。

次は、ユーザーの登録だな。useraddだかadduserだかを探してみたけど、見つからん。 昔取った杵柄を発揮する。

まずは、/etc/passwdにユーザーを登録。vipwは無いので、viで我慢する。

foo:x:1234:5678:foo is temp:/home/foo:/bin/ash

fooさんの登録。id,gidに続いてメモ書き、住処、login時の起動アプリを書くんだったな。 昔よくやったから、忘れずに覚えていたよ。

次は、/etc/groupにfooというグループを作って、それにgidを対応させる。

foo:x:5678:

住処をこしらえてあげる。パスワードを登録する。短いと警告を発してきたけど、rootは神 なんで、素直に従ってくれたよ。

~ # cd /home
/home # mkdir foo
/home # chown foo foo
/home # chgrp foo foo
/home # passwd foo
Changing password for foo
New password:
Bad password: too short
Retype password:
passwd: password for foo changed by root

そして、いよいよ、debian様側から、空気清冽なalpineへ行ってみる。

[debian ~]$ ssh foo@172.17.0.2
The authenticity of host '172.17.0.2 (172.17.0.2)' can't be established.
ECDSA key fingerprint is b7:c1:8c:46:6e:f1:7c:b6:46:fb:e6:3b:c5:e2:42:69.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.17.0.2' (ECDSA) to the list of known hosts.
foo@172.17.0.2's password:
Welcome to Alpine!

The Alpine Wiki contains a large amount of how-to guides and general
information about administrating Alpine systems.
See <http://wiki.alpinelinux.org>.

You can setup the system with the command: setup-alpine

You may change this message by editing /etc/motd.

b6f05c8e5f7c:~$

Welcome to Alpine Linux Wiki なんていう、アルピニストが集う場所を紹介されたんで、見学してるよ。

Package Databaseには、山で遭難しないように 色々な装備品が用意されたますって。

実際に使う時は、debian側とuidを一致させたアカウントを作ってやると吉。そして、alpneの やつは、環境を作ってあるんで、それを永続的に使う。具体的には、

使用を止める時は、docker stop XXX。再開する時は、docker start XXX。rootでlogin(もどき)したい時は、docker attach XXX。

XXXは、コンテナーIDを指定する。

[debian ~]$ docker ps -l
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                           PORTS               NAMES
beab110959a0        alpine              "/bin/sh"           2 hours ago         Exited (137) About an hour ago                       admiring_booth

実際にアクティブになってると、容量まで確認出来る。

[debian ~]$ docker ps -s
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES               SIZE
beab110959a0        alpine              "/bin/sh"           2 hours ago         Up 9 seconds                            admiring_booth      4.82MB (virtual 8.81MB)

ちょっといたずら心を起こして、検索してみた。

[debian ~]$ docker search freebsd
NAME                                 DESCRIPTION
     STARS     OFFICIAL   AUTOMATED
lexaguskov/freebsd                   FreeBSD operating system
     10
egypcio/freebsd                      FreeBSD Containers (12.0, 11.0, 10.x, or 9.
3)   4
kazuyoshi/freebsd-minimal
     4

それから、netbsdとかopenbsdなんてのも有るぞ。本当に動くのか? カーネルがリナで ユーザーランドがBSDってのも理論的には正しいからね。こういう何でも有りが面白いな。