better to use one process per container.
アプリケーションにフォーカスした
- ホストに左右されない実行環境(Docker Engineによる実行環境の標準化)
- DSL(Dockerfile)によるコンテナの構成やアプリケーション配置定義
- イメージのバージョン管理
- レイヤ構造を持つイメージフォーマット(差分ビルドが可能)
- Dockerレジストリ(イメージの保管サーバのようなもの)
- プログラマブルな各種API
メリット
- 不変な実行環境に冪等性の確保
Immutable Infrastructure
いろいろ
- 公式イメージ URL
- Install Compose
- http://port.us.org/
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)
- Dockerコンテナが遅くなるもう一つの原因
ロギングに関して注意する必要が出てくる可能性がある記事、デバッグなど
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 の bridge と host ネットワークについて勉強する
既存をしようしない場合net=hostip=xxx.xxx.xxx.xxxと
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-host
や extra-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: 標準出力
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
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
- 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