/sbin/init (upstart) in docker + ssh

チラシの裏的に

# やりたかったこと

systemdについて興味が出て調べているとき、Fedora20の/sbin/init (すなわちsystemd) をdockerで動かそう、なんていうヨコシマなことを考えて、でも動かないようでした。

https://github.com/dotcloud/docker/issues/3629

このあたりはdockerで主に期待される使い方からかけ離れているのと、下位層にまつわるもろもろがあるようで私がなんとかできるレベルを超えているような気がしたので今回はギブアップしてます。やった人がいたら超期待です。

なおsysvinit, upstart, systemdあたりの私のメモはこちらにあります: https://mowa-net.jp/wiki/init

# せめてUpstartなホストでsshだけ動かしてみよう

TwitterにてUpstartでなら/sbin/initを走らせる記事があるよ、という話がありました。

https://twitter.com/tnaoto/status/464616913180852225

ということで Ubuntu 12.04 LTS をdocker 0.11.0 で動かしてみました。

ただ、参考にしたその記事ですが、このままだとどうも動きません。

http://blog.udcp.net/2013/11/10/docker%E3%81%A7ubuntu%E3%81%AEsbininit%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B/

# 脇道: docker記事を漁る時の注意

dockerはここ半年の範囲ですらバージョンがボンボン上がって昔の実装と今の実装でやっていることが違うようです。

かつて```/sbin/init```が書き換わっていた時期というのもあるようなんですが、現在0.11.0では書き換わらなようです。「upstart動かないちゃん」的な記事の英語のフォーラム含めて結構時代遅れだったりして、ちょっと調べるのがハードです。

＃ ```/sbin/init``` を直接書き換えていたところは /.dockerinit というルート配下の別の実行ファイルを用意することで動作を変えた、みたいですが……よくわからない

一応現時点 (2014-05-09 + Debian wheezy 7.5 + docker 0.11.0 + lxc) でUpstart + ssh動かした方法だけ書きますが、正しい保障はありません。

# Dockerfile

```
FROM ubuntu:12.04
MAINTAINER amedama

RUN apt-get -q update
RUN apt-get install -y apt-utils openssh-server sudo vim

RUN update-rc.d ssh defaults

RUN useradd --create-home -s /bin/bash ubuntu ; \
  adduser ubuntu sudo ; \
  echo "ubuntu:ubuntu" | chpasswd;

# Expose the container's port 22
EXPOSE 22

# Execute /sbin/init directly (without shell)
CMD ["/sbin/init","3"]
```

* 日本語ロケールとか邪魔ですし元の記事のはSJIS周りでエラー吐いてますので消しました
* lxc.confは多分要りません
* 代わりにruntime 3としてみましたが必須か知りません
* apt-get upgradeはよくないと、ちあのんが言ってた気がしますので消します
    * https://github.com/dotcloud/docker/issues/1724#issuecomment-34406469
* MAINTAINERをつけときました

# で、ビルド

    > docker version
    Client version: 0.11.0
    Client API version: 1.11
    Go version (client): go1.2.1
    Git commit (client): 15209c3
    Server version: 0.11.0
    Server API version: 1.11
    Git commit (server): 15209c3
    Go version (server): go1.2.1
    Last stable version: 0.11.1, please update docker
    > echo-sd うるせーこれ書いたらアップデートするから黙れ
    ＿人人人人人人人人人人人人人人人人人人人人人人人人＿
    ＞　うるせーこれ書いたらアップデートするから黙れ　＜
    ￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y￣
    > docker build -t dmiyakawa:inittest . 
    ...

* 参考: https://github.com/fumiyas/home-commands/blob/master/echo-sd
* debconfが文句を言うのも不快なのですが、本筋からはずれるのでスルー

# 走らせる…… --privileged をつけて

    > docker run --privileged -t -i dmiyakawa:inittest

 * http://blog.docker.io/2013/09/docker-can-now-run-within-docker/

# IPアドレスを調べる

同じマシンの別のターミナルで (他のcontainerがない前提で)

    > docker inspect `docker ps -q` | grep IPAddress
        "IPAddress": "172.17.0.2",

# ssh

    > ssh ubuntu@172.17.0.2
    ubuntu@172.17.0.2's password: 
    Welcome to Ubuntu 12.04.4 LTS (GNU/Linux 3.2.0-4-amd64 x86_64)
    
     * Documentation:  https://help.ubuntu.com/
    Last login: Fri May  9 06:20:47 2014 from 172.17.42.1
    ubuntu@5e8833be75cf:~$

(個人的諸事情で手元では```-o PubkeyAuthentication=no```をsshにつけてます)

# 次の課題

systemdをこれで動かせればsystemctlを調べる記事が書けるのに……

ただ、スムーズに動くんですかね。しょうじき下回りが絡みすぎててもう少しガチな人に解説願いたい感。

ま、やるなら多分 virtual box か kvm か何かでやります

# 注意

上のDockerfileを14.04ベースでやるとブートで止まります。原因不明。