Docker
インストール(Windows)
Windows10 Pro
Hyper-V有効化
Docker Desktop for Windowsインストール
https://hub.docker.com/editions/community/docker-ce-desktop-windows
注意点
WindowsでSettingsからリソース割り当てを弄るとイメージが消える?
インストール(RaspberryPi)
https://qiita.com/musaprg/items/fe614083124c44a7d5e9
Docker入門
https://qiita.com/shiro01/items/04ca672a93384b463701
これ読めば基本操作がわかる
さくらの解説記事(docker-composeも含む)
https://knowledge.sakura.ad.jp/13265/
イメージ取得
code:bash
# 検索
$ docker search --filter "is-official=true" イメージ名
$ docker search --filter "is-official=true" イメージ名:タグ
$ docker search --filter "is-official=true" ubuntu # デフォルトでubuntu:latest
# ダウンロード
$ docker image pull イメージ名
$ docker image pull ubuntu
# 一覧
$ docker image ls
# 削除
$ docker image rm ubuntu # -fで強制削除(コンテナ停止中のみ)
イメージ削除後もコンテナは残る。起動中コンテナのあるイメージは削除できない(削除しても残る)
コンテナ起動
code:bash
# 起動してログイン
$ docker container run --rm -it --name コンテナ名 -h ホスト名 ubuntu /bin/bash
--rm : 停止時にコンテナ自動削除
--name: コンテナ名
ubuntu: イメージ名
# コンテナ一覧(起動中のみ)
$ docker container ls
# 停止中コンテナも表示
$ docker container ls -a
コンテナをデーモン起動
code:bash
# -dオプションを付ける
$ docker container run -itd --name testd1 -h testd1 ubuntu /bin/bash
バックグランド実行される
起動中コンテナでコマンド実行
code:bash
$ docker container exec -it コンテナ名 ps -ef
# shell実行でログインも可能
$ docker container exec -it コンテナ名 /bin/bash
起動中コンテナからの離脱
code:bash
# 起動してログイン
$ docker container run --rm -it --name test1 -h test1 ubuntu /bin/bash
# Ctrl+p、Ctrl+qを入力
# -> 離脱
起動中コンテナに再接続
code:bash
$ docker container attach コンテナ名
コンテナ停止
code:bash
$ docker container stop コンテナ名
コンテナ再起動
code:bash
$ docker container restart コンテナ名
停止中コンテナの起動
code:bash
$ docker container start コンテナ名
停止中のコンテナ削除
code:bash
$ docker container rm コンテナ名
# 全コンテナ削除
$ docker container prune
$ docker container prune -f # 確認なし
起動中コンテナ削除
code:bash
$ docker container rm -f コンテナ名
コンテナからイメージ作成
code:bash
$ docker container commit コンテナ名 イメージ名
$ docker container commit test1 ubuntu:test1
# 作成したイメージから起動
$ docker container run -it --name test2 -h test2 ubuntu:test1 /bin/bash
コンテナ作業ログ
code:bash
$ docker container logs コンテナ名
標準出力、入力が全て記録され、コンテナ削除時に自動削除。
保存先:/var/lib/docker/containers/<CONTAINER ID>/<CONTAINER ID>-json.log
コンテナ情報
code:bash
$ docker container inspect コンテナ名
JSON形式
コンテナID、イメージIDなど、ホスト名、IPも取れる
ホスト名:Config.Hostname
IP:NetworkSettings.Networks.bridge.IPAddress
リソース使用量
code:bash
$ docker container stats -a --no-stream
$ docker container stats コンテナ名
--formatオプションで出力内容の変更が可能
https://docs.docker.com/engine/reference/commandline/stats/
cpコマンドでファイル転送
code:bash
# コンテナ -> ホスト
$ docker container cp コンテナ名:コピー元パス ホストコピー先
# ホスト -> コンテナ
$ docker container cp ホストコピー元 コンテナ名:コピー先パス
マウントでファイル転送
bind方式
WindowsだとDocker for desktopのSettingsのShared Drivesでドライブ共有をONにする必要あり
ホスト上のファイルパスをコンテナ上でマウントする
複数コンテナで同じファイルパスをマウント可能
code:bash
$ docker container run -it --name コンテナ名 -h ホスト名 \
--mount type=bind,src=ホスト絶対パス,dst=コンテナマウントパス ubuntu /bin/bash
# readonlyオプションで読み取り専用マウント
$ docker container run -it --name コンテナ名 -h ホスト名 \
--mount type=bind,src=ホスト絶対パス,dst=コンテナマウントパス,readonly ubuntu /bin/bash
マウント情報確認
code:bash
# inspectでマウント情報も確認可能
$ docker container inspect コンテナ名 | grep -A10 -e Mounts
volume方式
docker管理のボリュームを作成してマウントする
複数コンテナで同じボリュームをマウント可能
code:bash
$ docker container run -it --name コンテナ名 -h ホスト名 \
--mount type=volume,src=ボリューム名,dst=コンテナマウントパス ubuntu /bin/bash
# ボリューム一覧
$ docker volume ls
DRIVER VOLUME NAME
local volume1
# 別コンテナからマウントも可能
$ docker container run -it --name コンテナ名 -h ホスト名 \
--mount type=volume,src=volume1,dst=コンテナマウントパス ubuntu /bin/bash
# ボリューム削除
$ docker volume rm volume1
ホスト上の保存先:/var/lib/docker/volumes
readonlyオプション対応
tmpfs方式
ホストのメモリ上にファイルシステムを作ってマウントする
コンテナを停止すると消える
code:bash
$ docker container run -it --name コンテナ名 -h ホスト名 --mount type=tmpfs,dst=コンテナマウント先 ubuntu /bin/bash
# tempfs-modeで権限設定が可能
$ docker container run -it --name コンテナ名 -h ホスト名 --mount type=tmpfs,dst=コンテナマウント先,tmpfs-mode=1755 ubuntu /bin/bash
Dockerfile
コマンドなどを実行してイメージを生成するためのファイル
code:Dockerfile
FROM ubuntu
WORKDIR /root
RUN apt update -y && apt install -y iproute2
code:bash
$ docker image build --no-cache -f Dockerfile -t リポジトリ:タグ ビルドに必要なファイルの保存パス(ホスト上)
$ docker image build --no-cache -f Dockerfile -t ubuntu:df01 ./
パラメータ:http://docs.docker.jp/engine/reference/builder.html
FROM Dockerイメージ
WORKDIR 作業ディレクトリ
RUN build時に実行されるコマンド、複数記述可能、順番に実行
&&使ってつなげて記述する。直前のコマンドのエラーをチェックできる
http://docs.docker.jp/engine/articles/dockerfile_best-practice.html#run
ENV 環境変数
EXPOSE ポート
ADD ファイルコピー
コピー元ソースとしてURL、tarが指定可能(tarは自動展開される)
ワイルドカードを使用可能
ソースにディレクトリが指定された場合、ディレクトリの中身をコピーする
複数ソースを指定可能
COPY ファイルをそのままコピー(URL不可、展開とかはしない)
ソースにディレクトリが指定された場合、ディレクトリの中身をコピーする
複数ソースを指定可能
ENTRYPOINT
[ ]で指定するとシェルを介さない
docker run --entrypoint=""で上書きが可能
CMD
[ ]で指定するとシェルを介さない
ENTRYPOINTのデフォルト引数になる
docker run時の引数で内容が上書きされる
ENTYRPOINTとCMDの違い:https://qiita.com/hnakamur/items/afddaa3dbe48ad2b8b5c
Dockerイメージビルド
code:bash
$ docker build -t イメージ名:タグ Dockerfileのあるディレクトリ
RUNコマンド毎に中間的なDockerコンテナが生成されて実行される。 => レイヤー
実行済みコマンドはキャッシュされ、変更が無ければキャッシュが利用される。=> ビルド時間短縮
Dcoker イメージ
Alpineを使うと容量が小さくなるのでオススメ
https://hub.docker.com/_/alpine/
パッケージ管理はapkコマンド apk add、apk del
https://qiita.com/ryuichi1208/items/6020cfabc92bd8153654
https://qiita.com/pottava/items/970d7b5cda565b995fe7
code:Dockerfile
FROM alpine
RUN apk --no-cache add tzdata && \
cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime && \
apk del tzdata
code:bash
$ docker build -t alpine:jst -f Dofckerfile ./
Ubuntu docker
コマンドインストール
code:bash
# ipコマンド
$ sudo apt update
$ sudo apt install iproute2 -y
TIMEZONE変更→https://qiita.com/rururu_kenken/items/972314402d588e073d40
コンテナ間通信
Docker network: https://qiita.com/TsutomuNakamura/items/ed046ee21caca4a2ffd9
none
ネットワークなし
host
ホストと同じネットワーク、NIC
brdidge
Docker用NAT(デフォルト)
code:bash
$ docker network create ネットワーク名
# --netでネットワークを指定して実行
$ docker run -it -d --network ネットワーク名 --name net-test1 イメージ名
$ docker run -it -d --network ネットワーク名 --name net-test2 イメージ名
# 後から接続させる
$ docker network connect ネットワーク名 コンテナ名
# ネットワークの情報(コンテナとIPアドレス)
$ docker network inspect ネットワーク名
# ネットワークから切断
$ docker network disconnect ネットワーク名 コンテナ名
$ docker network rm ネットワーク名 # 削除
$ docker network prune # 未使用ネットワーク削除
同一ネットワークに参加してるコンテナ間はホスト名で通信可能(docker run --aliasでホスト名の別名指定)
コンテナ内ポートで通信可能
overlay network
異なるホスト間のコンテナで通信するネットワーク(実装はVXLAN L2 over L3)
link
同一ホスト上でのコンテナ間通信(レガシー、廃止の可能性あり、非推奨)
Dockerコマンド一覧チートシート
https://qiita.com/curseoff/items/a9e64ad01d673abb6866
https://qiita.com/voluntas/items/68c1fd04dd3d507d4083