# Docker 入門

Dockerのユースケース、機能、使用方法をまとめました。

### Docker 概要

* Docker 向き・不向き
  * 向き : 日々変化するようなシステム
  * 不向き : 絶対に停止しては困るようなミッションクリティカルなシステムなど。構成を少しでも変更すると、業務に大きな影響がでることが考えられるようなもの
* コンテナ管理ソフトウェア　
  * Podman
  * Docker
  * LXC(Linuxコンテナ)
  * LXD
  * Virtuozzo
  * OpenVZ
* プラットフォーム 比較
  * 物理基盤
    * ハードウェア性能の教授
    * トランザクション処理向き
    * 障害発生時の問題切り分けが比較的簡素　
    * 高可用性、無停止システムで採用
  * 仮想化技術
    * ハイパーバイザーが介在
    * 仮想的なハードウェアが存在
    * オーバーヘッドが存在　
    * 仮想マシンはファイルで管理
    * ゲストOSの起動、停止等の管理が必要
    * サーバー集約
    * リソースプール化に有用
  * コンテナ
    * ランタイムをパッケージ管理化したアプリ　
    * オーバーヘッドがほぼゼロ
    * 隔離空間でアプリを実行
    * ホストOSからプロセスとして見える
    * 非常に軽量なアプリ環境を実現
    * ソフトウェア開発の工数削減
    * 圧倒的な集約度
* 使用技術
  * 名前空間
    * 単一のOS環境で複数の分離された空間を実現するために使用
    * 種類
      * ipc名前空間 : プロセス間通信の分離
      * mnt名前空間 : ファイルシステムのマウント情報の分離
      * net名前空間 : ネットワークインターフェイスを分離
      * pid名前空間 : プロセスの分離
      * user名前空間: ユーザーIDとグループIDを分離
      * uts名前空間 : UTS(Unix Time-Sharing System)名前空間。ホスト名やNISドメイン名などの分離
  * cgroups(Control Groups)
    * 1つのホスト上で複数の分離空間として稼働するDockerコンテナが稼働する環境において、限られたハードウェア資源の利用制限は重要
    * CPU、メモリ、ブロックI/O等の制御
    * cgroupsのファイルシステムで管理される主な統計情報
      * blkio
      * cpuacct
      * cpuset
      * devices
      * freezer
      * hugetlb
      * memory
      * perf\_event
* ストレージドライバー
  * コンテナ・イメージ間の生成処理の際に使用　
  * 種類
    * overlay2, overlay
      * すべてのLinuxディストリビューションで推奨(overlayは古く非推奨)
      * ファイルシステム: xfs, ext4
    * aufs
      * Linuxカーネル3.13のUbuntuが稼働するDocker CEのバージョン18.06およびそれ以前のバージョンで推奨
      * ファイルシステム: xfs,ext4
    * devicemapper
      * シンプロビジョニング、スナップショット機能を使って管理
      * ブロックレベルでアクセス　
      * ファイルシステム: direct-lvm
    * btrfs
      * Dockerエンジンが稼働するホストOS上にbtrfsファイルシステムが利用できる場合
      * ファイルシステム: btrfs
    * zfs
      * Dockerエンジンが稼働するホストOS上にzfsファイルシステムが利用できる場合
      * ファイルシステム: zfs
    * vfs
      * ファイルシステムの種類によらず利用できて安定した動作だが、性能が良くないため、テスト用途で使用
      * ファイルシステム: 任意
* サーバーOS・コンテナ専用OS
  * サーバーOS
    * Docker以外の非コンテナ環境のサーバーoS環境と同様のOS管理が行える
    * 新しい管理手法を習得する工数を削減できる
  * コンテナ専用OS
    * コンテナ専用OS自体の作法を学ぶ必要性
    * yumのようなパッケージ管理が利用できない場合があり、rpm-ostreeのようなOS環境全体の更新やローづバックなどの新しい仕組みを理解する必要がある。
    * 例
      * Atomic Host
      * CoreOS
      * Snappy Ubuntu Core
      * RancherOS
* ホストOSのディレクトリをDockerコンテナへマウント
  * bind mount : ホスト上のデバイスファイルやディレクトリ
  * volume : ホスト上のボリューム　
  * tmpfs　 : ホストのメモリ

(参考) [Docker実践ガイド 第2版](https://www.amazon.co.jp/dp/4295005525)

### Dockerfile

以下の命令から構成されたイメージの元になるファイル。プロジェクトのルートに作製するが、別ディレクトリで別のファイル名としても作成でき、その場合はイメージのビルド時に`-f`オプションでファイル名を指定する。

* 命令
  * FROM
  * MAINTAINER
  * RUN
  * CMD
  * LABEL
  * EXPOSE
  * ENV
  * ADD
  * COPY
  * ENTRYPOINT
  * VOLUME
  * USER
  * WORKDIR
  * ARG
  * ONBUILD
  * STOPSIGNAL
  * HEALTHCHECK
  * SHELL

#### 命令

**RUN**

可能であれば不要なレイヤーを使わないように以下のように1つのRUNにすることを推奨(その他の命令も同様)

```
RUN apt-get update && apt-get install -y \
    aufs-tools \
    automake \
    build-essential \
    curl \
    dpkg-sig \
    libcap-dev \
    libsqlite3-dev \
    lxc=1.0* \
    mercurial \
    reprepro \
    ruby1.9.1 \
    ruby1.9.1-dev \
    s3cmd=1.1.* \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*
```

**LABEL**

イメージにラベルを設定

```
LABEL multi.label1="value1" \
      multi.label2="value2" \
      other="value3"
```

**ENV**

環境変数の設定

```
ENV myName="John Doe" myDog=Rex\ The\ Dog \
    myCat=fluffy
```

**EXPOSE**

コンテナ実行時にポートをリッスンすることを指定。-p フラグを使ってポートの公開範囲を指定するか、 -P フラグで全ての露出ポートでホストからコンテナにアクセス可能になる。

ADDとCOPYの違いは、ADD命令は、圧縮ファイルの回答、展開が行われ、圧縮元のファイル自体はコピーされない。COPY命令は、元のファイルの状態でコピーされる。ADD命令はURLを指定することで、リモートサイトのファイルをダウンロードし、コピーもできる。\
ADDの機能が必要ない場合はCOPYを使うことが推奨。

Dockerfile には少なくとも１つのCMDまたはENTRYPOINT命令を含むべき。\
ENTRYPOINTもCMDもどちらもコマンドを実行できるが、CMD命令で指定した内容は`docker container run`コマンド実行時にオプションで上書き可能。そのため、オプションで上書きすることがないベースのコマンドを記載しておき、上書きするようなオプション等をCMD命令に分けるなどの使い分けができる。

**ARG 環境変数名\[=default value]**

`docker image build`時に`--build-arg envname=envvalue` のようにすることで動的な値をイメージに含めなくても良い

**ONBUILD**

ベースのイメージを作製して、派生版のイメージ作製するといった運用のときに使用。\
ベースのDockerfileにおいて、派生版で実行させたいコマンドのベースをONBUILD命令に記述しておくことで、ベースのイメージをビルド時にはONBUILD命令の行を除いた内容でベースのDockerイメージが作製され、派生版のDockerイメージは、派生版のDockerfileのコマンドと、ベースのDockerfile内のONBUILD命令に指定したコマンドをあわせたもので構成される。派生版のDockerfileではFROMでベースのイメージ名を指定する。

**STOPSIGNAL**

コンテナを終了する時に送信するための、システムコール・シグナルを設定

**HEALTHCHECK**

オプション、および、命令を続けることで死活監視を行うことができる。`docker container ls`コマンドのSTATUS列にhealthyのように確認できる。\
Dockerfileに記述しなくても`docker container run`コマンドのオプションで指定可能

* 形式
  * `HEALTHCHECK [option] CMD command` コマンド
    * コンテナ内でコマンドを実行して、コンテナの正常性を確認
  * `HEALTHCHECK NONE`
* オプションの種類
  * `--interval=`
  * `--timeout=`
  * `--retries=`

例

```
HEALTHCHECK --interval=5m --timeout=3s \
  CMD curl -f http://localhost/ || exit 1
```

**SHELL**

SHELL命令以降は、指定したシェルで実行。\
Windowsで便利。ネイティブなシェルcmdとpowershellだけでなく、shも指定可能。

**USER**

利用するには Dockerfile でユーザとグループを `RUN groupadd -r postgres && useradd -r -g postgres postgres` のように作成

**WORKDIR**

移動にはRUN命令でcdコマンドを実行せずにWORKDIR命令を使用する\
読みやすさ、トラブルシュートのしやすさ、維持のしやすさが増す。

#### Others

* Dockerコンテナをすぐに終了させない方法として、`tail -f /dev/null`やプロセスをフォアグラウンドで実行(`ENTRYPOINT ["usr/sbin/httpd", "-DFOREGROUND"]`)する方法などがある
* 環境変数対応
  * 以下のデフォルト値設定も可能
    * `${val:-char}`
    * `${val:+char}`
* パーサ・ディレクティブ
  * 全てのパーサ・ディレクティブは Dockerfile の限りなく上に書くべき
  * Dockerfile 中では、次に続く行にも影響を与える
  * 種類
    * escape : Windowsのディレクトリを扱うとき、`COPY testfile.txt c:\\`のようにすると、2つめのバックスラッシュが新しい行のためのエスケープとして扱われるため、エスケープ文字をバッククォートに設定するような使い方をする　
      * `# escape=\` (default)
      * ` # escape=`` ` \`\` \`

#### References

Dockerfileの仕様は以下を参照

* [Dockerfile リファレンス](http://docs.docker.jp/engine/reference/builder.html)
* [Dockerfile のベストプラクティス](http://docs.docker.jp/engine/articles/dockerfile_best-practice.html)

Dockerfileの書き方の例は以下を参照

* [アプリケーションの Docker 化](http://docs.docker.jp/engine/examples/toc.html)

### Docker Networking

デフォルトで持つネットワークは、ホストOS上でdocker0というブリッジインターフェイス、`docker network ls`コマンドで確認すると、bridgeというネットワークが作製されている。

`docker network create`コマンドでサブネットのCIDRを指定して固定IPアドレスで起動することもできる。`docker container run`コマンド指定時に--networkオプションで指定したネットワークを指定し、--ipコマンドでIPアドレスを指定。

コンテナ間通信として、`docker container run`コマンド実行時に`--link image:tag`のようにlink機能。ただし、Docker社によると将来削除の可能性がある。

* マルチホスト上でのコンテナ間通信
  * weave
  * etcd+flannel
  * Docker Swarm
* ネットワーキングの実現方法
  * オーバーレイネットワーク(VXLAN) : 　Docker Swarmで利用
  * MACVLAN
    * DockerホストのNICに複数のMACアドレスとIPアドレスを割り当てることでVLANを形成
    * ホストOSと同じIP空間にコンテナを所属させたい場合に有用
* Docker Swarm
  * Dockerエンジン搭載のクラスタリング機能
  * `docker network`コマンドを併用
  * マネージャノードとワーカーノードで構成
    * HAのため、マネージャノードを奇数台の複数台で構成することも可能
  * アプリケーションの実行単位をサービスとして管理(`docker service`コマンドで操作可能)
  * コンテナの配備はマネージャノードで行う
  * `docker stack`という複数のサービスをグループ化する機能
* Docker Compose
  * Dockerコンテナを一括で構築、連携、管理することで管理負荷を低減
* Docker Machine
  * パブリッククラウドのインスタンス上や仮想環境における仮想マシン上のDockerホストを管理するソフトウェア
* Docker Private Repository(DPR)
  * 組織内に閉じたDockerレジストリ
* マイグレーション
  * CRIUというチェックポイントを作成し、そのチェックポイントを指定してコンテナを開始させる
* リソース管理
  * CPU
    * `--cpuset-cpus=0`のようにホストOS側のCPUコア番号を指定　
    * `--cpu-shares=1024`のようにCPU割当時間
    * `--cpus`オプションでCPUリソースの上限の割合
  * メモリ
    * `-m 512m`オプションのように制限
  * ディスクI/O帯域幅
    * `--device-write-bps=/dev/sdb:1mb`のようにホストOSのデバイス名に対して書き込みに対するディスクI/Oの帯域幅を制限

### Get Started

#### Dockerコンテナ

Dockerでコンテナを動作させてみる。

test.shという名前で以下のファイルを作成。

```
#!/bin/sh

date >> /var/log/test.log
df -HT >> /var/log/test.log
tail -f /dev/null
```

Dockerfile

```
FROM centos:8.1.1911

ADD test.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/test.sh
ENTRYPOINT ["/usr/local/bin/test.sh"]
```

```
$ docker image build -t centos:v1 .
Sending build context to Docker daemon  15.87kB
Step 1/4 : FROM centos:8.1.1911
8.1.1911: Pulling from library/centos
8a29a15cefae: Pull complete 
Digest: sha256:fe8d824220415eed5477b63addf40fb06c3b049404242b31982106ac204f6700
Status: Downloaded newer image for centos:8.1.1911
 ---> 470671670cac
Step 2/4 : ADD test.sh /usr/local/bin/
 ---> 6e60cdad9a7f
Step 3/4 : RUN chmod +x /usr/local/bin/test.sh
 ---> Running in 60d9952b70b9
Removing intermediate container 60d9952b70b9
 ---> 1e2c412a7aeb
Step 4/4 : ENTRYPOINT ["/usr/local/bin/test.sh"]
 ---> Running in 018eeab58ee7
Removing intermediate container 018eeab58ee7
 ---> 7b2c60eb2910
Successfully built 7b2c60eb2910
Successfully tagged centos:v1
```

作製したイメージを確認

```
$ docker image ls centos:v1
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              v1                  7b2c60eb2910        7 minutes ago       237MB
```

作製したイメージからコンテナを稼働

```
$ docker container run -d --name v1n -h v1h centos:v1
28c2a84d709024837c6077f5c6da3fb36695ca8e5da7b61470e32ac9dfd6e5dc
```

作製したコンテナを確認

```
$ docker container ls -a
CONTAINER ID        IMAGE                                                        COMMAND                  CREATED             STATUS                     PORTS                NAMES
28c2a84d7090        centos:v1                                                    "/usr/local/bin/test…"   6 seconds ago       Up 6 seconds                                    v1n
86a3ead28df3        fab2dded59dd                                                 "kube-scheduler --bi…"   3 days ago          Up 3 days                                       k8s_kube-scheduler_kube-scheduler-docker-desktop_kube-system_131c3f63daec7c0750818f64a2f75d20_0
e0340e29888a        1399a72fa1a9                                                 "kube-controller-man…"   3 days ago          Up 3 days      :
```

コンテナ内で稼働するOSのシェルにアクセス。

```
$ docker container exec -it v1n /bin/bash
[root@v1h /]# pgrep -a test.sh
1 /bin/sh /usr/local/bin/test.sh
[root@v1h /]# cat /var/log/test.log 
Sat May 16 15:27:39 UTC 2020
Filesystem     Type     Size  Used Avail Use% Mounted on
overlay        overlay   63G  5.6G   54G  10% /
tmpfs          tmpfs     68M     0   68M   0% /dev
tmpfs          tmpfs    1.1G     0  1.1G   0% /sys/fs/cgroup
shm            tmpfs     68M     0   68M   0% /dev/shm
/dev/sda1      ext4      63G  5.6G   54G  10% /etc/hosts
tmpfs          tmpfs    1.1G     0  1.1G   0% /proc/acpi
tmpfs          tmpfs    1.1G     0  1.1G   0% /sys/firmware
```

コンテナのIPアドレスも確認可能

```
$ docker inspect --format="{{ .NetworkSettings.IPAddress }}" v1n
172.17.0.2
```

#### Docker Compose

```
$ cd /tmp/wordpress && cd $_
```

```
version: '3.7'
services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8000:80"
    restart: always
    links:
      - db:mysql
    networks:
      mynet:
    volumes:
      - wp-vol:/var/www/html
    depends_on:
      - db
  db:
    image: mariadb:latest
    environment:
      MYSQL_ROOT_PASSWORD: password123
    networks:
      mynet:
        ipv4_address: 172.20.0.2
    volumes:
      - mysql-vol:/var/lib/mysql
volumes:
  wp-vol:
    driver_opts:
      type: none
      device: /Users/hayashier/data/html
      o: bind
  mysql-vol:
    driver_opts:
      type: none
      device: /Users/hayashier/data/mysql
      o: bind
networks:
  mynet:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/24
```

ホストOS用のディレクトリ作製

```
$ mkdir -p ~/data/mysql
$ mkdir -p ~/data/html
```

Docker Composeのバージョン確認

```
$ docker-compose version
docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.1d  10 Sep 2019
```

Docker Composeによりコンテナを起動

```
$ docker-compose up
```

ブラウザから`http://localhost:8000`でアクセスできるようになります。

開いた画面でWordpressの設定を行う。

* Database Name: mysql
* Usename: root
* Password: password123
* Database Host: 172.20.0.2
* Table Prefix: wp\_

Wordpressのアカウント情報の設定を行う。

* Site Title: Sample Blog
* Usename: hayashier
* Password: Test1234
* Confirm Password: Confirm use of weak passwordにチェック
* Your Email: <sample@hayashier.com>
* Search Engine Visibility: Discourage search engines from indexing this siteにチェック

Docker Composeにより起動したコンテナを片付ける。

```
$ docker-compose down
$ rm -Rf ~/data/
```

**Checking**

イメージ一覧確認で、wordpressとmariadbのイメージが作製されていることを確認

```
$ docker image ls
REPOSITORY                                               TAG                 IMAGE ID            CREATED             SIZE
centos                                                   v1                  7b2c60eb2910        11 hours ago        237MB
mariadb                                                  latest              9c1f27148b1f        16 hours ago        357MB
wordpress                                                latest              675af3ca3193        33 hours ago        540MB
:
```

Docker Composeによるプロセス一覧

```
$ docker-compose ps
        Name                       Command               State    Ports  
-------------------------------------------------------------------------
wordpress_db_1          docker-entrypoint.sh mysqld      Up      3306/tcp
wordpress_wordpress_1   docker-entrypoint.sh apach ...   Up      80/tcp  
```

Wordpressのコンテナに割り当てられたIPアドレスを確認

```
$ docker container inspect --format '{{.NetworkSettings.Networks}}' wordpress_wordpress_1
map[wordpress_mynet:0xc0004dc000]
$ docker container inspect --format '{{.NetworkSettings.Networks.wordpress_mynet.IPAddress}}' wordpress_wordpress_1
172.20.0.3
```

MariaDBのコンテナに割り当てられたIPアドレスを確認。また、データベース一覧を確認

```
$ docker container inspect --format '{{.NetworkSettings.Networks.wordpress_mynet.IPAddress}}' wordpress_db_1
172.20.0.2
$ docker container exec -it wordpress_db_1 /bin/bash -c "mysql -uroot -ppassword123 -e 'show databases;'"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
```

Ctrl-CでDocker Composeから抜けるとコンテナも終了。`-d`でデーモンとして起動している場合は以下のように停止したりコンテナを削除することができる。

```
$ docker-compose stop wordpress db
$ docker-compose rm -f wordpress db
```

### Commands

Dockerのシステム情報の表示。

```
$ docker system info
Client:
 Debug Mode: false

Server:
 Containers: 11
  Running: 9
  Paused: 0
  Stopped: 2
 Images: 137
 Server Version: 19.03.8
 Storage Driver: overlay2
  Backing Filesystem: <unknown>
  Supports d_type: true
  Native Overlay Diff: true
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc version: dc9208a3303feef5b3839f4323d9beb36df0a9dd
 init version: fec3683
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 4.19.76-linuxkit
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 1.943GiB
 Name: docker-desktop
 ID: SNLI:62ZX:VQK6:SZVX:O2LS:4IW2:WC37:ZEDK:FZAH:X4T2:34XO:HJFI
 Docker Root Dir: /var/lib/docker
 Debug Mode: true
  File Descriptors: 97
  Goroutines: 105
  System Time: 2020-05-17T02:40:56.2843101Z
  EventsListeners: 4
 HTTP Proxy: gateway.docker.internal:3128
 HTTPS Proxy: gateway.docker.internal:3129
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false
 Product License: Community Engine
```

Dockerのバージョン表示

```
$ docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:21:11 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:29:16 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683
 Kubernetes:
  Version:          v1.15.11-eks-af3caf
  StackAPI:         Unknown
```

統計情報表示　

```
$ docker stats
CONTAINER ID        NAME                                                                                                                CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
86a3ead28df3        k8s_kube-scheduler_kube-scheduler-docker-desktop_kube-system_131c3f63daec7c0750818f64a2f75d20_0                     5.40%               11.31MiB / 1.943GiB   0.57%               0B / 0B             0B / 0B             12
e0340e29888a        k8s_kube-controller-manager_kube-controller-manager-docker-desktop_kube-system_b2850863d2a1ddaac8ed962e6881584c_0   0.41%               13.07MiB / 1.943GiB   0.66%               0B / 0B             0B / 0B             9
0c8c59efe24e        k8s_POD_kube-scheduler-docker-desktop_kube-system_131c3f63daec7c0750818f64a2f75d20_0                                0.00%               296KiB / 1.943GiB     0.01%               0B / 0B             0B / 0B             1
1329d8aea1ec        k8s_POD_kube-controller-manager-docker-desktop_kube-system_b2850863d2a1ddaac8ed962e6881584c_0                       0.00%               276KiB / 1.943GiB     0.01%               0B / 0B             0B / 0B             1
bc54cb40b9c6        k8s_POD_kube-apiserver-docker-desktop_kube-system_556b996466155d7ad37d896897208f67_0                                0.00%               340KiB / 1.943GiB     0.02%               0B / 0B             0B / 0B             1
48f8d8ace1a4        k8s_POD_etcd-docker-desktop_kube-system_f132e1c85abd4953a304d1c65d9d74f9_0                                          0.00%               248KiB / 1.943GiB     0.01%               0B / 0B             0B / 0B             1
:
```

コンテナ一覧

```
$ docker container ls
CONTAINER ID        IMAGE                  COMMAND                  CREATED             STATUS              PORTS               NAMES
86a3ead28df3        fab2dded59dd           "kube-scheduler --bi…"   3 days ago          Up 3 days                               k8s_kube-scheduler_kube-scheduler-docker-desktop_kube-system_131c3f63daec7c0750818f64a2f75d20_0
e0340e29888a        1399a72fa1a9           "kube-controller-man…"   3 days ago          Up 3 days                               k8s_kube-controller-manager_kube-controller-manager-docker-desktop_kube-system_b2850863d2a1ddaac8ed962e6881584c_0
0c8c59efe24e        k8s.gcr.io/pause:3.1   "/pause"                 3 days ago          Up 3 days                               k8s_POD_kube-scheduler-docker-desktop_kube-system_131c3f63daec7c0750818f64a2f75d20_0
1329d8aea1ec        k8s.gcr.io/pause:3.1   "/pause"                 3 days ago          Up 3 days                               k8s_POD_kube-controller-manager-docker-desktop_kube-system_b2850863d2a1ddaac8ed962e6881584c_0
bc54cb40b9c6        k8s.gcr.io/pause:3.1   "/pause"                 3 days ago          Up 3 days                               k8s_POD_kube-apiserver-docker-desktop_kube-system_556b996466155d7ad37d896897208f67_0
48f8d8ace1a4        k8s.gcr.io/pause:3.1   "/pause"                 3 days ago          Up 3 days                               k8s_POD_etcd-docker-desktop_kube-system_f132e1c85abd4953a304d1c65d9d74f9_0
```

コンテナの標準出力および標準エラーのストリームを表示。

```
$ docker container logs e0340e29888a
I0513 00:51:18.641504       1 serving.go:319] Generated self-signed cert in-memory
I0513 00:51:19.599737       1 controllermanager.go:164] Version: v1.15.5
I0513 00:51:19.602481       1 secure_serving.go:116] Serving securely on 127.0.0.1:10257
I0513 00:51:19.604127       1 deprecated_insecure_serving.go:53] Serving insecurely on [::]:10252
:
```

イメージのファイルへの書き出しと読み込み

```
$ docker image save centos:6.9 > centos-6.9.tar
$ docker image load -i centos-6.9-tar
```

コンテナのエクスポート、インポート

```
$ docker container export db01 > db01.tar
$ cat db01.tar | docker image import - postgres:11
```

docker image save, docker image loadとの違いは、docker container export,docker image importを使ったバックアップ、リストアでは、データボリュームとして定義されたディレクトリが除外される。

コンテナの詳細表示　

```
$ docker container inspect 86a3ead28df3
[
    {
        "Id": "86a3ead28df3a98ee1b4abab5097b6690301d855f1712a2de43359f657ca569d",
        "Created": "2020-05-13T00:51:15.8050084Z",
        "Path": "kube-scheduler",
        "Args": [
            "--bind-address=127.0.0.1",
            "--kubeconfig=/etc/kubernetes/scheduler.conf",
            "--leader-elect=true"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 2641,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2020-05-13T00:51:16.2635987Z",
            "FinishedAt": "0001-01-01T00:00:00Z"
        },
        "Image": "sha256:fab2dded59dd0c2894dd9dbae71418f565be5bd0d8fd82365c16aec41c7e367f",
        "ResolvConfPath": "/var/lib/docker/containers/0c8c59efe24e9e92ed3a7bbefe7ee04165fdaeb079e0b1ca5878df1fb350b35d/resolv.conf",
        "HostnamePath": "/var/lib/docker/containers/0c8c59efe24e9e92ed3a7bbefe7ee04165fdaeb079e0b1ca5878df1fb350b35d/hostname",
        "HostsPath": "/var/lib/kubelet/pods/131c3f63daec7c0750818f64a2f75d20/etc-hosts",
        "LogPath": "/var/lib/docker/containers/86a3ead28df3a98ee1b4abab5097b6690301d855f1712a2de43359f657ca569d/86a3ead28df3a98ee1b4abab5097b6690301d855f1712a2de43359f657ca569d-json.log",
        "Name": "/k8s_kube-scheduler_kube-scheduler-docker-desktop_kube-system_131c3f63daec7c0750818f64a2f75d20_0",
        "RestartCount": 0,
        "Driver": "overlay2",
        "Platform": "linux",
:
```

`-f '{{.NetworkSettings.IPAddress}}'`のようにして取得項目をフィルタリングする。

環境変数の確認

```
$ docker container inspect 86a3ead28df3 -f '{{range .Config.Env}}{{println .}}{{end}}'
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
```

```
$ docker container top d8b92b7a4ed0
PID                 USER                TIME                COMMAND
5791                root                0:00                /bin/bash
5884                xfs                 0:00                apache2 -DFOREGROUND
98808               root                0:00                apache2 -DFOREGROUND
99349               xfs                 0:00                apache2 -DFOREGROUND
99350               xfs                 0:00                apache2 -DFOREGROUND
99351               xfs                 0:00                apache2 -DFOREGROUND
99352               xfs                 0:00                apache2 -DFOREGROUND
99353               xfs                 0:00                apache2 -DFOREGROUND
$ docker container stats d8b92b7a4ed0 --no-stream
CONTAINER ID        NAME                    CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
d8b92b7a4ed0        wordpress_wordpress_1   0.00%               32.65MiB / 1.943GiB   1.64%               48kB / 7.14kB       0B / 0B             8
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
3a39d2a3be36        bridge              bridge              local
9484ac6c6e9a        host                host                local
fb2546fc2ba3        none                null                local
70c2109bcc5f        wordpress_mynet     bridge              local
$ docker network inspect wordpress_mynet
[
    {
        "Name": "wordpress_mynet",
        "Id": "70c2109bcc5f46fb84f15f09ddb119bfd16ffa9c8b476e47c42490cfb8a1e44b",
        "Created": "2020-05-17T02:15:28.2651735Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.20.0.0/24"
                }
            ]
        },
        "Internal": false,
        "Attachable": true,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "d8b92b7a4ed02406639d1efb6d0f0570c75488414c0ad5fb12c9cd22a23bc55e": {
                "Name": "wordpress_wordpress_1",
                "EndpointID": "f775ed139052829e1b887e412060e157891a55ac701df6114567af16f0a144ec",
                "MacAddress": "02:42:ac:14:00:03",
                "IPv4Address": "172.20.0.3/24",
                "IPv6Address": ""
            },
            "d9c8cdbccda5cb058f27a9aa3441205d6c70aad73378410c37c677a8b7bac78a": {
                "Name": "wordpress_db_1",
                "EndpointID": "35f723d0cc55fb84032cf165ba0778fa2272edd4e9260a5a967839ac7cff8e4f",
                "MacAddress": "02:42:ac:14:00:02",
                "IPv4Address": "172.20.0.2/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {
            "com.docker.compose.network": "mynet",
            "com.docker.compose.project": "wordpress",
            "com.docker.compose.version": "1.25.4"
        }
    }
]
```

システムのベインと表示

```
$ docker system events
2020-05-17T11:42:11.501614000+09:00 container create 0db69262af595cb5e87d20fb7e93ca5bb63086fed53b02cf3231e41596550465 (annotation.io.kubernetes.container.hash=625b6933, annotation.io.kubernetes.container.restartCount=1, annotation.io.kubernetes.container.terminationMessagePath=/dev/termination-log, annotation.io.kubernetes.container.terminationMessagePolicy=File, annotation.io.kubernetes.pod.terminationGracePeriod=30, image=sha256:2c4adeb21b4ff8ed3309d0e42b6b4ae39872399f7b37e0856e673b13c4aba13d, io.kubernetes.container.logpath=/var/log/pods/kube-system_etcd-docker-desktop_f132e1c85abd4953a304d1c65d9d74f9/etcd/1.log, io.kubernetes.container.name=etcd, io.kubernetes.docker.type=container, io.kubernetes.pod.name=etcd-docker-desktop, io.kubernetes.pod.namespace=kube-system, io.kubernetes.pod.uid=f132e1c85abd4953a304d1c65d9d74f9, io.kubernetes.sandbox.id=48f8d8ace1a4a69292e887dcf6ff2308cd89e18713ae2432a8708c71514a9d86, name=k8s_etcd_etcd-docker-desktop_kube-system_f132e1c85abd4953a304d1c65d9d74f9_1)
2020-05-17T11:42:11.763692700+09:00 container start 0db69262af595cb5e87d20fb7e93ca5bb63086fed53b02cf3231e41596550465 (annotation.io.kubernetes.container.hash=625b6933, annotation.io.kubernetes.container.restartCount=1, annotation.io.kubernetes.container.terminationMessagePath=/dev/termination-log, annotation.io.kubernetes.container.terminationMessagePolicy=File, annotation.io.kubernetes.pod.terminationGracePeriod=30, image=sha256:2c4adeb21b4ff8ed3309d0e42b6b4ae39872399f7b37e0856e673b13c4aba13d, io.kubernetes.container.logpath=/var/log/pods/kube-system_etcd-docker-desktop_f132e1c85abd4953a304d1c65d9d74f9/etcd/1.log, io.kubernetes.container.name=etcd, io.kubernetes.docker.type=container, io.kubernetes.pod.name=etcd-docker-desktop, io.kubernetes.pod.namespace=kube-system, io.kubernetes.pod.uid=f132e1c85abd4953a304d1c65d9d74f9, io.kubernetes.sandbox.id=48f8d8ace1a4a69292e887dcf6ff2308cd89e18713ae2432a8708c71514a9d86, name=k8s_etcd_etcd-docker-desktop_kube-system_f132e1c85abd4953a304d1c65d9d74f9_1)
:
```

イメージ情報のキーと署名に関する情報確認

```
$ docker trust inspect wordpress:latest
[
    {
        "Name": "wordpress:latest",
        "SignedTags": [
            {
                "SignedTag": "latest",
                "Digest": "1c4b01a38f37fee0e3aee5266bef13cbb3bb2ff705803377a35687fc441f6da8",
                "Signers": [
                    "Repo Admin"
                ]
            }
        ],
        "Signers": [],
        "AdministrativeKeys": [
            {
                "Name": "Root",
                "Keys": [
                    {
                        "ID": "09ece9bf02bfbef9b047a8c0e65ddc3a816f062b208fe1e224a383864c3d5c1d"
                    }
                ]
            },
            {
                "Name": "Repository",
                "Keys": [
                    {
                        "ID": "36aa4a54e8bb66ed3772f1fac2e886291cd90e3039ee0d64c00f95de5d6590e1"
                    }
                ]
            }
        ]
    }
]
```

ボリューム一覧

```
$ docker volume ls
DRIVER              VOLUME NAME
local               test2_mysql-vol
local               test2_wp-vol
local               wordpress_mysql-vol
local               wordpress_wp-vol
$ docker volume inspect wordpress_wp-vol
[
    {
        "CreatedAt": "2020-05-17T02:16:15Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "wordpress",
            "com.docker.compose.version": "1.25.4",
            "com.docker.compose.volume": "wp-vol"
        },
        "Mountpoint": "/var/lib/docker/volumes/wordpress_wp-vol/_data",
        "Name": "wordpress_wp-vol",
        "Options": {
            "device": "/Users/hayashier/data/html",
            "o": "bind",
            "type": "none"
        },
        "Scope": "local"
    }
]
```

#### Error

**ERROR: Pool overlaps with other one on this address space**

```
$ docker-compose up -d  
Creating network "wordpress_mynet" with driver "bridge"
ERROR: Pool overlaps with other one on this address space
```

docker-compose実行前にも同じコマンドを実行しており、ネットワークが既に作られており重複していたことが原因

対象のネットワークを特定し、削除する

```
$ docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
3a39d2a3be36        bridge              bridge              local
9484ac6c6e9a        host                host                local
fb2546fc2ba3        none                null                local
680c7ae3219a        test2_mynet         bridge              local
```

```
$ docker network rm test2_mynet
test2_mynet
```

**dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib**

```
$ brew switch openssl 1.0.2s
```

(参考) [Macでdyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib](https://cocoinit23.com/library-not-loaded-usr-local-opt-openssl-lib-libssl-1-0-0-dylib/)
