差分表示
- 最後の更新で追加された行はこのように表示します。
- 最後の更新で削除された行は
このように表示します。
#contents
*こちらも参照
https://hackmd.io/ZJWSTrK8R8ium6yqEqgGbA?view
*インストール
最近はdocker-composeを別途入れなくていい。プラグインだが公式のEngineのインストール手順に含まれてる
インストールページに書いてあるログローテートの設定もやっておく
*コンテナをサブドメインに割り当てる
-ドメインを取る
-DNSのAレコードに*.example.comを設定
-[[jwilder/nginx-proxy>https://github.com/jwilder/nginx-proxy]]を起動
-80番でlistenするコンテナを用意
-下記のオプションで起動
-e VIRTUAL_HOST=<service-name>.example.com
* PIDからコンテナを特定する
topやiotopで重いプロセスがいたときに、そのプロセスが所属するコンテナを知りたい
---(
$ docker ps --format '{{.ID}}' | xargs docker inspect -f '{{.State.Pid}} {{.Config.Hostname}} {{.Name}}'
---)
docker psの方だけ--formatなのが罠(-fはFilter)
* jrcs/letsencrypt-nginx-proxy-companion で証明書の期限を確認
---(
find . -name cert.pem | xargs -n 1 -I{} sh -c 'echo {}; openssl x509 -noout -dates -in {} | grep notAfter'
---)
* イメージのバージョンを固定する
タグの指定では不十分(後から変更される可能性がある。latestとか特に)
---(
$ docker image ls --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
jwilder/nginx-proxy latest sha256:4e6bae63dab0c4d3ebf3bbecbf5cd2700ca99db02e155efaa6e28baa14033bc8 2e769f4d3e9c 2 months ago 148MB
そしてdocker-compose.ymlで
image: jwilder/nginx-proxy@sha256:4e6bae63dab0c4d3ebf3bbecbf5cd2700ca99db02e155efaa6e28baa14033bc8
---)
*時間が経つとリビルドできない
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!>http://jpetazzo.github.io/2014/06/23/docker-ssh-considered-evil/]]
- 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>http://container42.com/2014/05/05/docker-quicktip-5-backing-up-volumes/]]
*Docker volumeの内容をバックアップ
**バックアップ
docker compose downでサービスを止めてから
---(
docker run --rm -v <volume_name>:/dst -v `pwd`:/backup busybox \
tar cpvf /backup/_`date +%Y%m%d_%H%M%S`.tar -C /dst ./
---)
**レストア
事前にdocker compose upでvolumeを作成し、downでサービスを止める
---(
# 一旦中身を消して
docker run --rm -v <volume_name>:/dst busybox \
rm -rv /dst
# レストア
docker run --rm -v <volume_name>:/dst -v `pwd`:/backup busybox \
tar xpvf /backup/<backup_file> -C /dst ./
---)
**もっとちゃんとやるなら
https://gist.github.com/nicklegr/9a792c00c02b524501b15ffcd84128e1
*MongoDBのバックアップ・レストア
''最近は docker compose run を使うといい''
---(
docker compose run --rm -v $WORK_DIR:/dst $SERVICE_NAME \
mongodump --host $SERVICE_NAME -o/dst/mongodb
---)
json形式でエクスポートするには
https://gist.github.com/nicklegr/73d9d0824a8919a9e095e72db2837c9a
''※以下は古い情報。--linkや環境変数のホスト名は非推奨''
[[backup_docker_lets-chat.sh>https://gist.github.com/nicklegr/39a3e39ac8efec5ddfb5feed263b3fe7]]
$ 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接続関連一通り
---)
* 開発環境としての利用
- [[Run compass, sass, guard in a Docker container | Brad Jones LLC>https://bradjonesllc.com/blog/run-compass-sass-guard-docker-container]]
* 未使用データの削除
- [[How to remove old and unused Docker images - Stack Overflow>https://stackoverflow.com/questions/32723111/how-to-remove-old-and-unused-docker-images/32723127#32723127 "How to remove old and unused Docker images - Stack Overflow"]]