アクトインディ開発者ブログ

子供とお出かけ情報「いこーよ」を運営する、アクトインディ株式会社の開発者ブログです

Docker のはまりどころ

こんにちは、tahara です。

ちかごろ Docker を使ってステージング環境を作っています。

いろいろはまりました。

Btrfs 使ってる

Btrfs を使っていると pwd が失敗したりします。 Btrfs 上では AUFS だと問題があるようです。

docker のデーモンを -s btrfs オプション付きで動かしましょう。

Debian なら /etc/init.d/docker.io で指定すればいいと思います。

DOCKER_OPTS="-s btrfs"

apt-get が遅い

日本にいるなら /etc/apt/sources.list で ftp.jp.debian.org などを指定しましょう。

Dockerfile であらかじめ用意していたファイルを ADD するといいと思います。

ADD sources.list /etc/apt/sources.list

タイムゾーンの設定

Dockerfile で

RUN echo "Asia/Tokyo" > /etc/timezone && dpkg-reconfigure tzdata

ロケールの設定

Dockerfile で

RUN echo "ja_JP.UTF-8 UTF-8" > /etc/locale.gen \
    && apt-get install locales \
    && update-locale LANG=ja_JP.UTF-8 \
    && . /etc/default/locale

RUN sudo service mysql start したのに...

Dockerfile で RUN sudo service mysql start したのに RUN mysql -uroot でつながらない。

RUN ごとに起動したサービスは終っちゃうようです。 1 つの RUN の中にまとめましょう。

RUN sudo service mysql start && mysql -uroot < init.sql && sudo service mysql stop

サービスを起動したいけど Supervisor めんどくさそう

こんなシェルスクリプトを用意しておきます。

#!/bin/bash

service ssh start
service mysql start
service memcached start
service td-agent start
service solr start
service nginx start

# /bin/bash -l
while true
do
    sleep 7
done

Dockerfile で

ADD start.sh /start.sh
CMD /start.sh

ssh でつなぐとプロンプトが表示されない

-t オプションをつけてコンテナを実行しましょう。

docker.io run -d -t -name foo localhost:5000/outing

コンテナ起動時に id と ip アドレスをとりたい

ID=$(docker.io run -d -name '1234' localhost:5000/outing)
IP=$(docker.io inspect -format="{{ .NetworkSettings.IPAddress }}" $ID)
echo $ID $IP

いらないコンテナを削除したい

起動中のコンテナは削除しようとしてもできないので、次で削除しています。

docker.io rm $(docker.io ps -a -q)

いらないイメージを削除したい

イメージの作り直しをしていると、いらないイメージがたくさんできます。

リポジトリが <none> になっているのはきっといらないこなので、次で削除しています。

docker.io images | grep '<none>' | awk '{print $3}' | xargs docker.io rmi

イメージを別のサーバにコピーしたい

save と load でできます。

docker.io save localhost:5000/outing | ssh -C user@another.example.com docker.io load

IP アドレスが変わるので ssh が...

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! としかられる。

-o 'StrictHostKeyChecking no' オプション付けましょう。

ssh -o 'StrictHostKeyChecking no' user@172.17.0.2'

Docker いいですね。 テスト用の MySQL や Solr のデータ準備に何十分もかかる問題も イメージを作る時にやっておけば解決です。 ディスクも節約できます。