Docker

update create

www.docker.com

better to use one process per container.

アプリケーションにフォーカスした

  • ホストに左右されない実行環境(Docker Engineによる実行環境の標準化)
  • DSL(Dockerfile)によるコンテナの構成やアプリケーション配置定義
  • イメージのバージョン管理
  • レイヤ構造を持つイメージフォーマット(差分ビルドが可能)
  • Dockerレジストリ(イメージの保管サーバのようなもの)
  • プログラマブルな各種API

メリット

  • 不変な実行環境に冪等性の確保

Immutable Infrastructure

いろいろ

Dockcrコンポーネント

  • Docker Engine: Dockerのコア機能
  • Docker Kitematic: DockerのGUIツール
  • Docker Registry: イメージ公開&共有
  • Docker Compose: 複数コンテナ一元管理
  • Docker Machine: Docker実行環境構築
  • Docker Swarm: クラスタ管理
docker logs [OPTIONS] CONTAINER

Data Volume

Data VolmeはDockerコンテナ内のディレクトリをディスクに永続化するための仕組み
Data Volumeコンテナ

Docker Swarm
複数のDockerホストを束ねてクラスタ化するためのツール。

Stack
複数のServiceをグルーピングした単位。

Docker Hub

Locust負荷テストツール
docker imageを軽くすることを心がける
scratchなど

Alpine Linuxベースイメージ.
glibc問題 ubuntu, centなど

.dockerignore

.git
.idea
*.swp
*.log
.DS_STORE

macOS

https://hub.docker.com/editions/community/docker-ce-desktop-mac

sshログイン

cat $HOME/.docker/config.json "credsStore": "osxkeychain" の場合、他でkeychainをつかんでいるため

security unlock-keychain

でロックを解除する必要がある

Docker Registry

https://hub.docker.com/_/registry/
Docker Registry HTTP API V2

  • API
    http://localhost:5000/v2/_catalog

  • GUI

    • https://github.com/mkuchin/docker-registry-web

参考

Infrastructure as Code(IaC)

macOS(dock)

使用ずみのdockerのアイコンがdockに表示され続ける問題 システム環境設定 -> Dock -> 最近使ったアプリケーションをDockに表示

コマンド

DockerFile内の指令

  • FROM: ベースイメージの指定
    FROM [イメージ名] FROM [イメージ名]:[タグ名] FROM [イメージ名]@[ダイジェスト]
  • MAINTAINER: Dockerfileの製作者情報
  • RUN: コマンド実行
    /bin/sh -c と同じ動作
    RUN echo shell形式
    Exec形式はshellを介さず実行
    RUN ["command", "option", "option"]
  • CMD: デーモン実行
    shell形式
    CMD /usr/sbin/httpd -D FOREGROUND
    Exec形式(直接)
    CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
  • LABEL: ラベルの設定
  • EXPOSE: ポートのエクスポート
  • ENV: 環境変数の設定
  • ADD: ファイル、ディレクトリの追加
  • COPY: ファイルのコピー
  • VOLUME: ボリュームのマウント
  • ENTRYPOINT: デーモンの実行
    docker run コマンドで実行した時に実行される形式
    shell形式、Exec形式を取れる。
    CMDより優先される。
    一つだけ。複数指定の場合は最後の命令が実行。
  • USER: ユーザの指定
  • WORKDIR: 作業ディレクトリの指定
  • ONBUILD: ビルド完了後に実行される命令 ONBUILD ADD website.tar /var/www/html として、buildして、再度Deployする時に FROM web-base とすると、追加buildするとONBUILDのみ追加実行される感じ。

ONBUILDの設定内容確認

docker inspect --format="{{ .Config.OnBuild }}" web-base

標準入力からのビルド

docker build - < Dockerfile

※変更が加わるたびに、イメージIDが発行され、layer形式に積み重なる127layerまで

docker history sample

FROM centos: latest

ENTRYPOINT ["top"]
CMD ["-d", "10"]
// CMD命令で指定した10秒ごとの更新
docker run -it sample
// 直接指定
docker run -it sample -d 2

Notice

Dockerfileの格納場所は、空のディレクトリを作成しておくこと。
docker buildコマンドは、dockerfileを含むディレクトリ(サブディレクトリ)をDocker Daemonに転送するため。

docker-machine

  • crate: driverを指定
  • ls
  • ssh
  • env
  • start | stop | restart
  • scp
  • rm | kill
  • ip | inspect

Link

docker run -d --name dbserver progres
docker run -it --name appserver --link dbserver:pg centos /bin/bash
  • --restart=no : 再起動しない(デフォルト)
  • on-failure: 終了ステータスがnon-zeroの場合に再起動する
  • on-failure:X: 終了ステータスがnon-zeroの場合にX回だけ再起動する
  • always: 常に再起動

コンテナのエイリアスpgが環境変数のprefixになる。

  • コンテナ構成図

Weave Scope

wget -O scope git.io/scope
 chmod a+x ./scope
./scope launch

http://192.168.99.100:4040 で構成図が表示できるとのこと。

docker-machine

実行環境を構築する。
driver + docker でdriverはAmazonEC2など色々とDockerを実行させるための環境を構築する。
実行環境からscpでdownloadできたりする。
driverにはdriverによって様々なオプションを指定する必要がある。

docker-machine create --driver virtualbox host1
docker-machine ssh host1
docker-machine scp host1:/etc/passwd .
docker-machine ip host1
docker-machine inspect host1
docker-machine ls

docker swarm

docker run swarm create

tokenが作成される。

docker-machine create -d virtualbox --swarm --swarm-master --swarm-discoverty token://xxxxxx master
docker-machine create -d virtualbox --swarm --swarm-discoverty token://xxx node01

といった感じでtokenでクラスタを構築。

spread, binpack,random後でまとめる。

docker compose

foregroundで起動

docker-compose up

Ctrl + Cで停止。

backgroundで起動

docker-compose up -d
docker-compose stop
docker-compose restart
docker-compose up -d --build

ビルドを反映させる。

docker-compose logs -f --tail=5 -t

ログ。

削除

docker-compose down
docker-compose down --rmi all
docker-compose down -v
  • downのみ: コンテナ・ネットワーク
  • v: コンテナ・ネットワーク・ボリューム
  • rmi: イメージ

save, load

docker image save centos:6.9 > centos-6.9.tar
# 移動
scp centos-6.9.tar node02:/root/
docker image load -i centos-6.9.tar
docker run -it --rm centos:6.9 cat /etc/redhat-release

driver

driver supports
overlay2, overlay xfx(-n ftype=1が必須), ext4
aufx xfs, ext4
devicemapper direct-lvm
btrfs btrfs
zfs zfs
vfs どのシステムでも利用可能

container

docker container run -it --name c0001 -h c0001 --mount type=bind,src/hostdir0001,dst=/root/ctdir0001,readonly centos:6.9 /bin/bash
// 確認
docker container inspect c0001 | less

type=volumeなど

docker volume ls

コンテナで実行

docker container exec -it c0002 cat /root/ctdir0002/testfile0002.txt

書き込み不可でボリューム共有

docker container run -i -t --volumes-from c0001:ro --name c0003 -h c0003  centos:7.5.1804 /bin/bash

データ専用コンテナ

budyboxと呼ばれるイメージを利用

docker image pull busybox:latest
docker container stats
docker container run -i -t -v /data0001 --name d0001 busybox /bin/sh
# 別コンテナから参照させる
docker container run -i -t --volumes-from d0001 --name c0004 -h c0004 centos:7.5.1804 /bin/bash

ssh

ssh key 鍵ファイルをADDとかするのは、ダメ。

  • --squash というコマンドを利用
  • マルチステージビルド
  • "Secure Mount"
RUN --mount=type=secret,id=ssh,target=/root/.ssh/id_rsa git clone 

問題切り分け

docker build -t test:local .

Network

docker network create --subnet=xxx.xxx.xxx.xxx/24 [ネットワーク名称]
  • network コマンドを使う
  • veth関連
    http://enakai00.hatenablog.com/entry/20140424/1398321672
  • Driver
    Macvlan: フラットなネットワーク

Container to Host

  • host.docker.internal
    mac

(Dockerのコンテナの中からホストOS上のプロセスと通信する方法)[https://qiita.com/ijufumi/items/badde64d530e6bade382]
add-hostextra-host で渡す

データ専用コンテナを使ったボリュームのバックアップ

docker container run -it -v /datadir --name d0002 -h d0002 busybox /bin/sh
echo "Heoolo data container" > /datadir/datafile.txt

バックアップの実行

docker container run --rm --bolumes-from d0002 -v /hostdir:/ctdir busybox:latest tar cvf /ctdir/backup.tar /datadir

リストア

# リストア先コンテナ生成
docker container run -i -t -v /datadir --name c0005 centos:7.5.1804 /bin/bash
# リストア
docker container run --rm --volumes-from c0005 -v /hostdir:/ctdir busybox:latest tar xvf /ctdir/backup.tar -C /

qcow2からイメージのインポートができたりする  ``virt-tar-out```

コンテナのエクスポート

docker container export xxxxxxxx > xxxxxx.tar
cat xxxxxx.tar | docker image import - repository名:タグ名
````

save, load  
saveでtarにしてloadでtarを読み込む 

export,importとsave,loadはバックアップされる範囲が異なる  
exportはvolumeを除外  

docker container inspect db01

basic認証で.netrcとか効かないっぽい

docker login -u xxxx -p xxxxx https://docker-repository

が必要。

### Log

docker container logs -t container_name

 実体は、ホストOS上の ``/var/lib/dockercontainers/<コンテナID>/<コンテナID>-json.log

コンテナIDを確認

docker container ls --no-trunc

該当ファイルがログになる  
よく煩雑になるらしい  

rsyslogを使用する
host側にrsyslogをインストール.

docker container run -itd --log-driver=syslog --name logtet01 -h logtest01 centos:7.5.1804 /bin/bash

#### Dockerfile

ARG http_proxy ARG https_proxy

Dockerfileに変数のみ定義

docker image build -f ./Dockerfile -t c75:apache01 --build-arg http_proxy=proxyaddress --build-arg https_proxy=proxyaddress .

ビルド時に指定するやり方  

docker container inspect c75-apache01

な感じで確認。  
この場合は、proxy_addressが表示されないため、隠蔽できる。  

containerが実行中の時のコピー  

docker container cp

buildfile

* ADD  
  tarを指定した場合は、解凍しイメージに追加。   
  URLを指定した場合は、ダウンロードし追加。
* COPY  
  そのままcopy.

確認  

docker container exec -it nginx0001 systemctl status nginx docker container exec -it nginx0001 ip a s eth0

など

ホストOS以外から

route add -net 172.17.0.0 netmask 255.255.0.0 gw 172.16.1.170 eth0

としてルートを作成し、名前解決は、hostsなどで対応。  

## OS

* CoreOS
* Atomic Host
* RancherOS
* Snappy Ubuntu Core

p146

## コマンド

 shellにattach.  

sudo docker exec -i -t コンテナ名 bash /etc/init.d/apache2 status

run option

  • d: デタッチ
  • it: 標準出力

Docker run リファレンス

Registry

curl -n https://[docker.registry.server]/v2/_catalog
curl -n https://[docker.registry.server]/v2/[name]/tags/list
curl -n -i -H "Accept: application/vnd.docker.distribution.manifest.v2+json" https://[docker.registry.server]/v2/[name]/manifests/latest
curl -n -X DELETE  https://[docker.registry.server]/v2/[name]/manifests/sha256:[digest]
docker exec -it [container id] bin/registry garbage-collect /etc/docker/registry/config.yml
47 blobs marked, 0 blobs and 0 manifests eligible for deletion

Delete

  • curl DELETEでマニフェストを削除(ぶら下がっているlayerも削除)
  • garbage collectをする
  • registryが使用しているvolumeの該当リポジトリを削除
  • 削除されていることを確認 _catalog

再起動ポリシー

sudo docker inspect -f "{{.Name}} {{.HostConfig.RestartPolicy.Name}}" $(sudo docker ps -aq) | grep always
docker update --restart=always [name]
docker update --restart=no [name]

変更する場合

sudo docker inspect -f "{{.Name}} {{.HostConfig.RestartPolicy.Name}}" $(docker ps -aq) | grep always
sudo docker update --restart=no [name]

Docker Hub

基本イメージはここから https://hub.docker.com/_/python

Compose

差し替え

docker-compose down
docker-compose build --pull サービス名
docker-compose up -d

Scaleに関して https://pspdfkit.com/blog/2018/how-to-use-docker-compose-to-run-multiple-instances-of-a-service-in-development/

docker-compose exec サービス名 /bin/bash

Log

docker-compose logs --tail=5  [サービス名]?

Version

https://matsuand.github.io/docs.docker.jp.onthefly/compose/compose-file/

Prune

https://docs.docker.jp/config/pruning.html

docker image prune
docker builder prune
docker system df

DNS

v3

 dns:
  - 8.8.8.8
  - 9.9.9.9
  dns_search:
  - dc1.example.com
  - dc2.example.com  
  extra_hosts:
  - "somehost:127.0.0.1"

docker scan

Docker ローカルイメージに対するぜい弱性スキャン

  • dockerhuのアカウント(無料など)
  • snykのアカウント(無料など)
  • docker login
  • docker scan [image name]
Package manager:   apk
Project name:      docker-image| [image name]
Docker image:      [image name]
Platform:          linux/amd64

✓ Tested 68 dependencies for known vulnerabilities, no vulnerable paths found.

For more free scans that keep your images secure, sign up to Snyk at https://dockr.ly/??????

ping permission

-u 0

DNS
http://docs.docker.jp/engine/userguide/networking/dockernetworks.html

externel
https://docs.docker.com/compose/compose-file/compose-file-v2/#network-configuration-reference compose network
https://docs.docker.jp/compose/networking.html

Check

docker stats
docker-sync