Docker
インストール(Windows)
Windows10 Pro
Hyper-V有効化
Docker Desktop for Windowsインストール
注意点
WindowsでSettingsからリソース割り当てを弄るとイメージが消える?
インストール(RaspberryPi)
Docker入門
これ読めば基本操作がわかる
さくらの解説記事(docker-composeも含む)
イメージ取得
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 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オプションで出力内容の変更が可能
cpコマンドでファイル転送
code:bash
# コンテナ -> ホスト
# ホスト -> コンテナ
マウントでファイル転送
bind方式
WindowsだとDocker for desktopのSettingsのShared Drivesでドライブ共有をONにする必要あり
ホスト上のファイルパスをコンテナ上でマウントする
複数コンテナで同じファイルパスをマウント可能
code:bash
$ docker container run -it --name コンテナ名 -h ホスト名 \ # readonlyオプションで読み取り専用マウント
$ docker container run -it --name コンテナ名 -h ホスト名 \ マウント情報確認
code:bash
# inspectでマウント情報も確認可能
$ docker container inspect コンテナ名 | grep -A10 -e Mounts volume方式
docker管理のボリュームを作成してマウントする
複数コンテナで同じボリュームをマウント可能
code:bash
$ docker container run -it --name コンテナ名 -h ホスト名 \ # ボリューム一覧
$ 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 ubuntu:df01 ./
FROM Dockerイメージ
WORKDIR 作業ディレクトリ
RUN build時に実行されるコマンド、複数記述可能、順番に実行
&&使ってつなげて記述する。直前のコマンドのエラーをチェックできる
ENV 環境変数
EXPOSE ポート
ADD ファイルコピー
コピー元ソースとしてURL、tarが指定可能(tarは自動展開される)
ワイルドカードを使用可能
ソースにディレクトリが指定された場合、ディレクトリの中身をコピーする
複数ソースを指定可能
COPY ファイルをそのままコピー(URL不可、展開とかはしない)
ソースにディレクトリが指定された場合、ディレクトリの中身をコピーする
複数ソースを指定可能
ENTRYPOINT
[ ]で指定するとシェルを介さない
docker run --entrypoint=""で上書きが可能
CMD
[ ]で指定するとシェルを介さない
ENTRYPOINTのデフォルト引数になる
docker run時の引数で内容が上書きされる
Dockerイメージビルド
code:bash
RUNコマンド毎に中間的なDockerコンテナが生成されて実行される。 => レイヤー
実行済みコマンドはキャッシュされ、変更が無ければキャッシュが利用される。=> ビルド時間短縮
Dcoker イメージ
Alpineを使うと容量が小さくなるのでオススメ
パッケージ管理はapkコマンド apk add、apk del
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
コンテナ間通信
none
ネットワークなし
host
ホストと同じネットワーク、NIC
brdidge
Docker用NAT(デフォルト)
code:bash
# --netでネットワークを指定して実行
$ docker run -it -d --network ネットワーク名 --name net-test1 イメージ名 $ docker run -it -d --network ネットワーク名 --name net-test2 イメージ名 # 後から接続させる
# ネットワークの情報(コンテナとIPアドレス)
# ネットワークから切断
$ docker network prune # 未使用ネットワーク削除
同一ネットワークに参加してるコンテナ間はホスト名で通信可能(docker run --aliasでホスト名の別名指定)
コンテナ内ポートで通信可能
overlay network
異なるホスト間のコンテナで通信するネットワーク(実装はVXLAN L2 over L3)
link
同一ホスト上でのコンテナ間通信(レガシー、廃止の可能性あり、非推奨)
Dockerコマンド一覧チートシート