Dockerチートシート
イメージ
Docker コンテナを作成する命令が入った読み込み専用のテンプレート。
Dockerレジストリで保存されたイメージを取得したり、Dockerfileを用いて自作、保存が可能。
イメージの取得
docker pull image:tag
イメージの確認
docker images
イメージの削除
docker rmi image_id
イメージのセーブ(エクスポート)
後述のコンテナのエクスポートと異なり、データボリュームも合わせてバックアップされる
docker save image_name:tag | gzip > file_name.tgz
イメージのロード(インポート)
docker load -i file_name.tgz
コンテナ
コンテナとは、イメージが実行状態となったインスタンスを指す。
コンテナ内での変更は再度イメージを作成することで永続化される。
コンテナの起動
docker run -it --name container_name image_name:tag /bin/bash
-
-i
: 標準入力を開き続ける -
-t
: tty(標準入出力先のデバイス)にコンテナを割り当てる
コンテナの確認
docker ps -a
-
-a
: 停止済みコンテナも確認できる
コンテナのコミット
docker commit container_id image_name:tag
コンテナの停止
docker stop container_id
コンテナの削除
docker rm container_id
docker ps -aq | xargs docker rm # 一括削除
コンテナの再起動
**docker start** container_id
起動中のコンテナへの接続
docker attach container_id
コンテナのエクスポート
データボリュームはバックアップされないため別途対応が必要になる
docker export container_id > file_name.tar
コンテナのインポート
cat file_name.tar | docker import - image_name:tag
ホストOSのディレクトリを使用する
bind mount
ボリュームを使わずにホストOSのディレクトリをそのまま参照する
docker run -it --mount type=bind,src=${absolute_path_to_directory},dst=${absolute_path_to_directory} image_name:tag /bin/bash
# readonly
docker run -it --mount type=bind,src=${absolute_path_to_directory},dst=${absolute_path_to_directory},readonly image_name:tag /bin/bash
volume
ホストOSのボリューム(/var/lib/docker/volumes)をDockerに提供する
docker run -it --mount type=volume,src=${valume_name},dst=${absolute_path_to_directory} image_name:tag /bin/bash
# readonly
docker run -it --mount type=volume,src=${valume_name},dst=${absolute_path_to_directory},readonly image_name:tag /bin/bash
ボリュームの確認
docker volume ls
ボリュームの情報を確認
docker volume inspect volume_name
tmpfs mount
ホストのメモリをファイルシステムとしてコンテナに提供する
高速な処理ができるが永続化には適さない
docker run -it --mount type=tmpfs,dst=${absolute_path_to_directory},tmpfs-mode=${permission_with_stikcy_bit},tmpfs-size=${bite} image_name:tag /bin/bash
データ専用コンテナ
アプリケーションを稼働させない専用コンテナを作成できる
- バックアップやリストアが容易になる
- busyboxを使用
docker pull busybox:latest
docker run -it -v /directory_name busybox:latest /bin/sh
echo Hello > /directory_name/sample.txt
異なるコンテナ間でボリュームを共有する
docker run -it --volumes-from container_id image_name:tag /bin/bash
# 上記で作成したbusyboxのコンテナを指定した場合
cat /directory_name/sample.txt
起動中のコンテナからホストにファイルをコピーする
docker cp container_ip:path_to_file_in_container /path_to_directory_in_host
その他
リソースの状況を確認する
docker stats
コンテナの詳細情報を表示
docker inspect
ログを確認する
docker logs container_id
Dockerfile
イメージを作成する作業を集約することができる設定ファイル。
Dockerイメージを自作する際に使用する。
Build
Dockerfileからイメージを構築するコマンド
docker build . #ファイル名がDockerfileの場合
docker build - < Dockerfile2
命令
FROM
イメージの指定
FROM amazonlinux:latest
RUN
コマンドを実行する
FROM amazonlinux:latest
RUN dnf install -y nginx
ARG
build時に値を格納する変数
FROM amazonlinux:latest
ARG midlleware_name
RUN dnf install -y ${midlleware_name}
docker build . --build-arg midlleware_name=nginx -t image_name:tag
# RUN dnf install -y nginx
ENV
ホスト内の環境変数を設定する
FROM amazonlinux:latest
ENV ENV="TEST"
docker build . -t image_name:tag
docker run -it image_name:tag echo $ENV
# TEST
COPY
ホストOSからファイルをコピーする
後述のADDと異なりアーカイブファイルも展開されずそのままコピーされる
FROM amazonlinux:latest
COPY ./sample.txt /tmp/sample.txt
docker build . -t image_name:tag
docker run -it image_name:tag ls /tmp
# sample.txt
ADD
ホストOSからファイルをコピー、アーカイブファイルは解凍する
URLを指定してリモートのファイルを取得することも可能
FROM amazonlinux:latest
ADD ./sample.txt /tmp/sample.txt
docker build . -t image_name:tag
docker run -it image_name:tag ls /tmp
# sample.txt
CMD
カスタムスクリプトやコマンドをコンテナ実行時に自動的に実行される様にする
docker runコマンドでコマンドを引数に入れた場合上書きされる
FROM amazonlinux:latest
COPY ./test.sh /usr/local/bin/test.sh
RUN chmod +x /usr/local/bin/test.sh
# 直接実行
CMD ["echo", "hello world!"]
# shell介して実行
# CMD echo "hello world!"
docker build . -t image_name:tag
# echo "hello world!"が実行される
docker run -it image_name:tag
# echo "hello world from run"が実行される
docker run -it image_name:tag echo "hello world from run"
ENTRYPOINT
カスタムスクリプトやコマンドをコンテナ実行時に自動的に実行される様にする
docker runコマンドでコマンドを引数に入れた場合も実行される(※ docker run --entrypoint="”で上書きは可能)
systemdを使わずにデーモンを稼働させることなどもできる。
FROM amazonlinux:latest
COPY ./test.sh /usr/local/bin/test.sh
RUN chmod +x /usr/local/bin/test.sh
# 直接実行
ENTRYPOINT [ "/usr/local/bin/test.sh" ]
# shell介して実行
# ENTRYPOINT /usr/local/bin/test.sh
#! /bin/sh
cat "Hello, World!" >> /var/log/test.log
docker build . -t image_name:tag
docker run -it -v /tmp:/var/log/ image_name:tag
SHELL
使用するシェルを変更できる
FROM amazonlinux:latest
SHELL [ "/bin/sh", "--login"]
Chips
- サイズの大きいファイルやディレクトリを置かない
- buildに時間がかかる
- 削除できない場合は.dockerignoreを使用する
- キャッシュが効いてコマンドが実行されない
-
dnf update
など実行すべきコマンドも、変更がないと判断されてキャッシュが利用される - キャッシュを利用しないようにする場合
—no-cache=true
を付与する
-
- RUN命令の数が多くなると生成されるイメージサイズが肥大化する
- 命令が実行されるたびに中間イメージが作成されるため
- ヒアドキュメントや
\ &&
を使用してRUN命令をまとめる
Docker Compose
ymlを使用して複数のコンテナの定義をまとめて行うことができる。
起動や削除も定義されたファイルごとにまとめて行うことができる。
docker-compose.yml
定義ファイル
version: '3.3'
services:
web:
build:
context: .
dockerfile: Dockerfile
args:
- name=value
ports:
- "8001-8010:80"
volumes:
- app_volume:/var/www/html
environment:
- env=env_value
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: app
MYSQL_USER: app
MYSQL_PASSWORD: app
ports:
- "3306:3306"
volumes:
- test:/var/lib/mysql
volumes:
test: # compose外で作成されたボリュームを参照する場合は、名前を指定する
external: true # 外部ボリュームを参照する場合は、external: trueを指定する
app_volume:
driver_opts:
type: none # ホストマシンのディレクトリをマウントする場合は、type: noneを指定する
device: ./app # ホストマシンのディレクトリを指定する
o: bind # マウントするディレクトリの権限を指定する
イメージ作成
docker compose build
起動
指定のymlで定義されたコンテナの起動
docker compose up -d
docker compose -f ./file_name.yml up -d # docker-compose.yml以外のファイルは指定が必要
サービス名を指定して、コンテナを多重起動
docker compose up --scale web=8 -d
確認
指定のymlで定義されたコンテナの確認
docker compose ps
一時停止
コンテナの停止
docker compose pause service_name
再開
コンテナの再開
docker compose unpause service_name
削除
指定のymlで定義されたコンテナの削除
docker compose down
ログの表示
指定のymlで定義されたコンテナのログ確認
docker compose logs
最後に
Dockerコマンドちょいちょい忘れるのでチートシート作りました。
なんか活用しきれていない気がしていたので整理できてよかったです。
Docker実践ガイドではDockerの仕組みが解説されていますが、Linuxとかもう少し低レイヤーについて知らないとだめだなーと改めて痛感しました。
参考
Discussion