Docker
Docker 社が開発して無償配布する OSS
コンテナ技術の利用
- ソフトウェア実行環境
- ソフトウェア的に独立しているため、アプリケーション間で動作に必要なライブラリが競合しない
Docker エンジン
- コンテナをベースにしたアプリケーションの実行環境
プロビジョニング支援ツール
コンテナ管理ソフト
- LXC(Linux Container) => libcontainer
- イメージ
- AUFS
- Overlayfs
- Device Mapper
仕組み
Docker は Linux カーネルの複数の機能を活用してコンテナ型仮想化を実現
- 複数の Docker ホストを管理するためのツール
Docker のデータ保存場所
# ll /var/lib/docker/ 合計 0 drwx------. 2 root root 6 11月 28 12:10 containers drwx------. 3 root root 22 11月 28 12:10 image drwxr-x---. 3 root root 19 11月 28 12:10 network drwx------. 3 root root 40 12月 17 09:19 overlay2 drwx------. 4 root root 32 11月 28 12:10 plugins drwx------. 2 root root 6 11月 28 12:10 swarm drwx------. 2 root root 6 11月 28 12:10 tmp drwx------. 2 root root 6 11月 28 12:10 trust drwx------. 2 root root 25 11月 28 12:10 volumes
MySQL
- 5.1
エラー
- host にマウントしたディレクトリにアクセスできない
SELinux 疑ってみる
# getenforce
Tips
- 改行コード
通常の run は LF
$ sudo docker run --rm centos echo "test" | cat -e test$
TTY を有効にすると、CRLF
$ sudo docker run --rm -t centos echo "test" | cat -e test^M$
- ホスト側で NTPD などで時刻同期をしていれば、コンテナ内の時刻管理は必要がないらしい
References
- Get Started with Docker
- Dockerコンテナのパフォーマンス劣化とチューニング
- DockerとLinux OSのリソース共有状況の調査
- dockerコンテナ自動テストツール dgossを使ってみた
- CentOS 過去イメージ
- systemd 利用できるコンテナ
「コンテナ化」するための Linux の機能
Linux Namespace
/proc/PID/ns
# ll /proc/$(docker inspect --format='{{.State.Pid}}' 7cb633b15bc2 )/ns/ 合計 0 lrwxrwxrwx 1 root root 0 3月 17 15:37 ipc -> ipc:[4026532171] lrwxrwxrwx 1 root root 0 3月 16 11:13 mnt -> mnt:[4026532169] lrwxrwxrwx 1 root root 0 3月 16 11:13 net -> net:[4026532174] lrwxrwxrwx 1 root root 0 3月 17 15:37 pid -> pid:[4026532172] lrwxrwxrwx 1 root root 0 3月 17 15:37 user -> user:[4026531837] lrwxrwxrwx 1 root root 0 3月 17 15:37 uts -> uts:[4026532170]
- グローバルな名前空間とは別の OS リソースが割り当てられている
- => Linux Namespace
- グローバルな名前空間とは別の OS リソースが割り当てられている
- nsenter
Contents
OCI(Open Container Initiative)
- 団体
- CRI(Container Runtime Interface)
/etc/hosts に追記するのは
--add-host
を利用するdocker run -t -i --add-host=test.example.co.jp:127.0.0.1 --add-host=test2.example.co.jp:127.0.0.1 test/hoge /bin/bash
コンテナ情報取得
$ docker inspect ID
作成日の取得
# docker inspect -f {{.Created}} [container_id]
シェルを立ち上げる際は -i, -t オプションを付けて標準入力と端末を仮想環境につなげる。
検索(例 : nginx)
$ docker search nginx
コンテナのファイルシステムに加えられた変更を表示
下記はコンテナに Vagrantfile をコピーした時に実行した場合
$ docker diff test-new C /tmp A /tmp/Vagrantfile
コンテナ内のプロセス確認
$ docker top [コンテナ ID] ax | unexpand -t20
イメージ作成履歴の確認
$ docker history [image name]
ローカルイメージの書き出しとリストア
save
コマンドを実行することで、リポジトリ単位で tar アフィるとして書き出すことが可能標準出力になるので圧縮するよう渡してあげる
# docker save [image name] | gzip -9 > /tmp/test.gz
-o
オプションをつけると圧縮されない tar 形式で出力
load
コマンドで他のサーバのローカルのイメージとして登録可能# docker load -i filetame.gz
ファイルシステムの書き出しとリストア
export
コマンドで起動中のコンテナのルートファイルシステムの内容を tar ファイルに書き出す$ docker export CONTAINER_ID | gzip > container.tar.gz
import
コマンドで tar ファイルからルートファイルシステムを復元したものをコンテナイメージとして登録することができる$ cat container.tar.gz | docker import - centos:imported
アーカイブファイルが web に公開されている場合
$ docker import http://example.com/test.tgz [image name]
ビルド(ノーキャッシュ)
# docker build --no-cache --rm -t .
コンテナ名を指定して起動
$ docker run -d -P --name localnginx nginx $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 223350df1b54 nginx "nginx -g 'daemon of…" Less than a second ago Up 10 seconds 0.0.0.0:32769->80/tcp localnginx
- コンテナ名の重複不可
環境編集
タイムゾーンの設定
$ docker run -it -e TZ=Asia/Tokyo --rm ubuntu:16.04 date
ボリュームのバインド
nginx とか公式のイメージを pull してくると vim とか入ってないので入れたい(本来は入れない
exec して中へ
apt-get update apt-get install vim
コンテナ名の変更
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e2e87861947d ubuntu "/bin/bash" 7 seconds ago Up 5 seconds test01 $ docker rename test01 test-new $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e2e87861947d ubuntu "/bin/bash" 51 seconds ago Up 49 seconds test-new
ポート転送設定の表示
$ docker port [コンテナ]
Docker がホスト上の全てのデバイスに対して接続可能になる設定
- この時、 AppArmor や SELinux の設定があれば、ホスト上のコンテナ外のプロセスと同じように、ホスト上の同じアクセス権限が与えられた状態で利用可能になる
# docker run --privileged
メトリクス
-
$ docker stats CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS e2e87861947d test-new 0.00% 780KiB / 1.952GiB 0.04% 1.25kB / 0B 0B / 0B 1
- 初期化とバックアップ
/var/lib/docker/*
配下にデータが存在するので、これを削除すると初期化可能- 逆にバックアップも上記配下をバックアップすると良い
ストレージドライバの切り替え手順
Docker を停止
既存のデータの削除
# rm -rf /var/lib/docker/*
zfs, btrfs を使用する場合には、 /var/lib/docker ディレクトリに、ZFS ファイルシステムまたは Btfs ファイルシステムをマウントする必要がある
Docker 起動
# docker deamon -s [ストレージドライバ名]