コンテナをサブドメインに割り当てる

  • ドメインを取る
  • DNSのAレコードに*.example.comを設定
  • jwilder/nginx-proxyを起動
  • 80番でlistenするコンテナを用意
  • 下記のオプションで起動 -e VIRTUAL_HOST=<service-name>.example.com

時間が経つとリビルドできない

aptとかgemとかのリポジトリからパッケージが消えると、結局リビルドできない。
公開できるものはDocker Hubにビルド済イメージを入れておく。

プライベートのものは自前のDocker Hubを用意するのかなー

apt-get update がキャッシュされて、それが古くなってて失敗することもあるようだ。
docker build --no-cache でOK。

時計がずれる

https://www.eucalyptus.com/blog/2014/09/14/docker-strange-dev-how-i-learned-stop-worrying-and-love-vm

お手軽にmongodbの永続化

$ boot2docker ssh
$ sudo mkdir -p /var/lib/docker/mongodb
$ exit

$ docker run --name mongodb --restart=always -d -v /var/lib/docker/mongodb:/data/db mongo mongod --smallfiles

で、DBを使うコンテナを起動

docker run ... --link mongodb:mongodb

データバックアップ

  • バックアップ処理を行うコンテナを作る
  • バックアップ対象とvolumeをshareする

If you run SSHD in your Docker containers, you're doing it wrong!

  • DBの場合、バックアップ対象とlinkしてDBに接続する
  • その場合、クライアントは同一イメージに入れると綺麗みたい

https://github.com/dockerfile/mongodb

docker run -it --rm --link mongodb:mongodb dockerfile/mongodb bash -c 'mongo --host $MONGODB_PORT_27017_TCP_ADDR'

  • gitlabみたいな複雑なコンテナの場合、データをtarに固めるのは誰がやるのがいい?
    • gitlabの場合はバックアップ機能があるので、同一イメージからそいつを実行すればいいかな

Docker Quicktip: Backing up Volumes Container42

MongoDBのバックアップ・レストア

backup_docker_lets-chat.sh

$ sudo docker run -it --rm -v /path/to/backup:/backup --link <target_container>:mongodb mongo \
 /bin/bash -c 'mongodump --host $MONGODB_PORT_27017_TCP_ADDR -o/backup'

$ sudo docker run -it --rm --link <target_container>:mongodb -v /path/to/backup:/backup mongo bash
$ mongorestore --host $MONGODB_PORT_27017_TCP_ADDR /backup

バイナリは互換性がなくなることがあるようなので、
テキストでエクスポートもしとくとよさげ
http://stackoverflow.com/a/13550669/1904257

#!/bin/bash

if [ ! $1 ]; then
        echo " Example of use: $0 database_name [dir_to_store]"
        exit 1
fi
db=$1
out_dir=$2
if [ ! $out_dir ]; then
        out_dir="./"
else
        mkdir -p $out_dir
fi

tmp_file="fadlfhsdofheinwvw.js"
echo "print('_ ' + db.getCollectionNames())" > $tmp_file
cols=`mongo --host $MONGODB_PORT_27017_TCP_ADDR $db $tmp_file | grep '_' | awk '{print $2}' | tr ',' ' '`
for c in $cols
do
    mongoexport --host $MONGODB_PORT_27017_TCP_ADDR -d $db -c $c -o "$out_dir/${db}_${c}.json"
done
rm $tmp_file

root以外で行う場合は下記のハック

# バックアップファイルのオーナーがrootになるので、dockerに変更
# (idコマンドでホスト側のdockerのuid,gidを調べて渡している)
docker run -it --rm -v $WORK_DIR:/backup mongo:3.2.6 \
  /bin/bash -c "chown -R `id -u`:`id -g` /backup"

PostgreSQLのバックアップ・レストア

ここまで来るとバックアップコンテナ作った方がよさそうね
$ sudo docker run -it --rm -v /path/to/backup:/backup --link <target_container>:postgresql sameersbn/postgresql:9.4 \
  /bin/bash -c 'DUMMY=$(echo "*:*:*:$POSTGRESQL_ENV_DB_USER:$POSTGRESQL_ENV_DB_PASS" > ~/.pgpass) && chmod 600 ~/.pgpass && pg_dump -h $POSTGRESQL_PORT_5432_TCP_ADDR -U $POSTGRESQL_ENV_DB_USER $POSTGRESQL_ENV_DB_NAME > /backup/dump.sql'

$ sudo docker run -it --rm -v /path/to/backup:/backup --link <target_container>:postgresql sameersbn/postgresql:9.4 /bin/bash
# psql -h postgresql -U $POSTGRESQL_ENV_DB_USER $POSTGRESQL_ENV_DB_NAME -f /backup/<filename>.sql

docker-compose

volumesの設定が間違ってると起きることがある?
$ sudo docker-compose up
Recreating loftcalendar_mongodb_1...
Cannot start container 44ba4c1e27343fcbe77ae1c5e9b17cdec35908395e2890481329b6511f94f954: set app
armor profile docker-default: no such file or directory

このときは一度コンテナを消す

$ sudo docker rm loftcalendar_mongodb_1

Web UI

docker front end & reverse proxy for development
https://github.com/acidlemon/mirage

デバッグ用シェル

下記をdocker-compose.ymlに書いておく

shell:
  build: .
  command: bash
  working_dir: /app/user
  environment:
    - DB接続関連一通り

開発環境としての利用

未使用データの削除