チラシの裏的に
やりたかったこと
systemdについて興味が出て調べているとき、Fedora20の/sbin/init (すなわちsystemd) をdockerで動かそう、なんていうヨコシマなことを考えて、でも動かないようでした。
このあたりはdockerで主に期待される使い方からかけ離れているのと、下位層にまつわるもろもろがあるようで私がなんとかできるレベルを超えているような気がしたので今回はギブアップしてます。やった人がいたら超期待です。
なおsysvinit, upstart, systemdあたりの私のメモはこちらにあります: https://mowa-net.jp/wiki/init
せめてUpstartなホストでsshだけ動かしてみよう
TwitterにてUpstartでなら/sbin/initを走らせる記事があるよ、という話がありました。
ということで Ubuntu 12.04 LTS をdocker 0.11.0 で動かしてみました。
ただ、参考にしたその記事ですが、このままだとどうも動きません。
脇道: 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はよくないと、ちあのんが言ってた気がしますので消します
- 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
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ベースでやるとブートで止まります。原因不明。