こんにちは、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 のデータ準備に何十分もかかる問題も イメージを作る時にやっておけば解決です。 ディスクも節約できます。