Docker †
- https://www.docker.io/
- 仮想化ではなく、LXC(Linux Container)技術を用い、ホストOSの上に独立した環境を構築する。そのため環境を仮想化より早く作れる。ホストOSからプロセスは見える
- 仮想化(VMware, VirtualBox, VirtualPC等)はハードウェアをエミュレートしている。
- 2017-04-21 現在、実験環境では動作するが、本番環境では安定して運用するには向かない。各社(AWS, Google, 他)多大な労力を裂いて検証している
トラブルシューティング †
yum.dockerproject.orgが廃止された †
調査用のサイズの小さいコンテナ †
- busybox: 1.2MBと小さいコンテナで複数コマンドの代替ができる。nslookup等
ログ基盤設計 †
マルチCPUアーキテクチャ †
/var/lib/docker/ の肥大化 †
- cron等で定期実行すると、デフォルトではコンテナのストレージは残る
- 標準ログがたまる
- ログファイル単体を0 byteにする
truncate -s 0 /var/lib/docker/containers/<container-id>/<container-id>-json.log
- ロギング・ドライバの設定でログの上限を設定する
# 現在のドライバ確認
docker info | grep Logging
Logging Driver: json-file
# ログ1ファイル、最大10MB、3回までrole-overしたら破棄する
cat /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
sudo service docker restart
build後に不要なコンテナやimageを削除 †
docker buildで失敗したり、同じタグを指定すると、「tag=none」(dangling=宙ぶらりん状態)なimageがどんどん貯まる。
コンテナがあるとimageが消せない。
VirtualBoxとDocker for Windowsが競合する †
Dockerfile †
MongoDB ReplicaSet †
コマンド †
CONTAINER=mysql
# bashでコンテナに入る。bashが無いイメージの場合sh
docker exec -it $CONTAINER bash
# hostnameコマンドを実行
sudo docker exec $CONTAINER hostname
または
sudo docker exec $CONTAINER bash -c 'hostname'
Java †
For windows †
イメージの容量削減 †
ベストプラクティス †
コンテナ内からのメール送信 †
ストレージ使用量の確認 †
- system毎の使用率表示
sudo docker system df
- 詳細: コンテナ毎の使用率表示
sudo docker system df -v
便利な使い方 †
systemd経由で、docker-composeを自動起動 †
- exampleサービス用のsystemdファイル。volumeは消さない。
- --abort-on-container-exit: コンテナが1つでも停止したら全てのコンテナを停止
- /etc/systemd/system/example.service
[Unit]
Description=docker-compose example service
Requires=docker.service
[Service]
User=vagrant
Type=simple
EnvironmentFile=-/etc/sysconfig/compose.d/example
Environment=COMPOSE_FILE=/home/vagrant/docker-compose.yml
ExecStartPre=-/usr/local/bin/docker-compose -f ${COMPOSE_FILE} kill
ExecStart=/usr/local/bin/docker-compose -f ${COMPOSE_FILE} up --abort-on-container-exit
ExecStop=/usr/local/bin/docker-compose -f ${COMPOSE_FILE} stop
Restart=always
RestartSec=180s
[Install]
WantedBy=multi-user.target
- 登録と実行
sudo systemctl daemon-reload
# 自動実行
sudo systemctl enable example
sudo service example start
sudo service example stop
docker-compose: 複数のdockerコンテナをyamlで記述 †
- volumes: データの永続化をする場合。ホストの固定パスにデータを置ける。
- 省略した場合、rm, down等でデータが消える。
起動しないコンテナの調査 †
portsが未定義だったり、なにかエラーがあると、コンテナが止まってしまう。
「tty: true」をつける事で起動しつづける事ができる
- docker-compose.yml
version: '2'
services:
alpine:
image: alpine:latest
tty: true
- 起動
docker-compose up -d
docker-compose ps
Name Command State Ports
-----------------------------------------
example_alpine_1 /bin/sh Up
- コンテナに入って調査
docker exec -it example_alpine_1 sh
- 停止
docker-compose kill
コード整形 †
Javaアプリ関連 †
脆弱性検査 †
セキュリティ †
BuildKit: ビルドの高速化 †
仮想NIC/ブリッジ/docker0 †
- CentOS7:
- docker0という仮想NICが増える。/etc/sysconfig/network-scripts/ 以下には存在しない
- NICの名前が、eth0から、ensXXXのような名前に変わった。
- puppet facterやansible factsで自動取得していると、docker0がeth0より先に取得されて既存の設定が壊れる事がある。
- facter ipaddress: eth0の値から、docker0の値へ変わってしまう。
CentOS7で There are no more loopback devices available. †
sudo yum install docker device-mapper -y
sudo systemctl start docker
Job for docker.service failed. See 'systemctl status docker.service' and 'journalctl -xn' for details.
sudo systemctl status docker.service -l
...
9月 07 15:46:04 centos7-server docker-current[2886]: time="2016-09-07T15:46:04.652301456+09:00" level=error msg="There are no more loopback devices available."
# /dev/loop[1:6]を作成
for i in {0..6}; do sudo mknod -m0660 /dev/loop$i b 7 $i;done
# 開始
sudo systemctl start docker
systemctl enable docker
インストール †
- ansibleが便利。docker-comporseもインストールしてくれる