Docker
コンテナ型仮想化
Docker イメージ
振る舞い定義
Docker コンテナ
Docker ホスト上で実際に動作するプロセス
Docker エンジン
コンテナをベースにしたアプリケーションの実行環境
Docker は Linux カーネルの複数の機能を活用してコンテナ型仮想化を実現
コンテナ技術の利用
ソフトウェア実行環境
ソフトウェア的に独立しているため、アプリケーション間で動作に必要なライブラリが競合しない
Linux カーネル技術
仮想ネットワークドライバ
Netfilter
プロビジョニング支援ツール
オーケストレーション
アプリケーションの配備
設定
システム設定
ブートストラッピング
クラウド/仮想イメージの実行や OS インストール
Docker
コンテナ管理ソフト
LXC(Linux Container) => libcontainer => runC runC
コンテナは 2 つのカテゴリに分けられる
システムコンテナ
仮想マシンとよく似た動き
完全なブートプロセスを実行
ssh, cron, syslog
アプリケーションコンテナ
通常はアプリケーションを 1 つ動かす
レジストリ
複数の Docker ホストを管理するためのツール
Docker のデータ保存場所
code:shell
# 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
host にマウントしたディレクトリにアクセスできない
改行コード
通常の run は LF
code:shell
$ sudo docker run --rm centos echo "test" | cat -e
test$
TTY を有効にすると、CRLF
code:shell
$ sudo docker run --rm -t centos echo "test" | cat -e
ホスト側で NTPD などで時刻同期をしていれば、コンテナ内の時刻管理は必要がないらしい
References
CentOS 過去イメージ
systemd 利用できるコンテナ
/etc/hosts に追記するのは --add-host を利用する
code:shell
$ 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
コンテナ情報取得
code:shell
$ docker inspect ID
作成日の取得
code:shell
シェルを立ち上げる際は -i, -t オプションを付けて標準入力と端末を仮想環境につなげる。
検索(例 : nginx)
code:shell
$ docker search nginx
コンテナのファイルシステムに加えられた変更を表示
下記はコンテナに Vagrantfile をコピーした時に実行した場合
code:shell
$ docker diff test-new
C /tmp
A /tmp/Vagrantfile
コンテナ内のプロセス確認
code:shell
$ docker top コンテナ ID ax | unexpand -t20 イメージ作成履歴の確認
code:shell
ビルド(ノーキャッシュ)
code:shell
# docker build --no-cache --rm -t tagname .
コンテナ名を指定して起動
code:shell
$ 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
コンテナ名の重複不可
タイムゾーンの設定
code:shell
$ docker run -it -e TZ=Asia/Tokyo --rm ubuntu:16.04 date
コンテナ名の変更
現状
code:shell
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e2e87861947d ubuntu "/bin/bash" 7 seconds ago Up 5 seconds test01
リネーム
code:shell
$ 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
ポート転送設定の表示
code:shell
Docker がホスト上の全てのデバイスに対して接続可能になる設定
この時、 AppArmor や SELinux の設定があれば、ホスト上のコンテナ外のプロセスと同じように、ホスト上の同じアクセス権限が与えられた状態で利用可能になる code:shell
# docker run --privileged
初期化とバックアップ
/var/lib/docker/* 配下にデータが存在するので、これを削除すると初期化可能
逆にバックアップも上記配下をバックアップすると良い
ログ設定
docker run
--memory
ハードリミット
--memory-reservation
ソフトリミット
システム上でメモリが競合している場合にはこの値を維持しようとするが、競合が発生してない場合には、memory まで使用できる
Docker イメージ作成高速化
.dockerfileignore を利用して無駄なファイルを
Docker オブジェクト・ラベル
Docker オブジェクトに対してメタデータを設定する仕組みです。