💻

Dockerチートシート

2024/02/16に公開

イメージ

https://docs.docker.jp/get-started/overview.html#id16

Docker コンテナを作成する命令が入った読み込み専用のテンプレート。

Dockerレジストリで保存されたイメージを取得したり、Dockerfileを用いて自作、保存が可能。

イメージの取得

https://docs.docker.jp/engine/reference/commandline/pull.html

docker pull image:tag

イメージの確認

https://docs.docker.jp/engine/reference/commandline/images.html

docker images

イメージの削除

https://docs.docker.jp/engine/reference/commandline/rmi.html

docker rmi image_id

イメージのセーブ(エクスポート)

後述のコンテナのエクスポートと異なり、データボリュームも合わせてバックアップされる

https://docs.docker.jp/engine/reference/commandline/save.html

docker save image_name:tag | gzip > file_name.tgz

イメージのロード(インポート)

https://docs.docker.jp/engine/reference/commandline/load.html

docker load -i file_name.tgz

コンテナ

https://docs.docker.jp/get-started/overview.html#id17

コンテナとは、イメージが実行状態となったインスタンスを指す。
コンテナ内での変更は再度イメージを作成することで永続化される。

コンテナの起動

https://docs.docker.jp/engine/reference/commandline/run.html#docker-run

docker run -it --name container_name image_name:tag /bin/bash
  • -i: 標準入力を開き続ける
  • -t: tty(標準入出力先のデバイス)にコンテナを割り当てる

コンテナの確認

https://docs.docker.jp/engine/reference/commandline/ps.html

docker ps -a 
  • -a: 停止済みコンテナも確認できる

コンテナのコミット

https://docs.docker.jp/engine/reference/commandline/commit.html

docker commit container_id image_name:tag 

コンテナの停止

https://docs.docker.jp/engine/reference/commandline/stop.html#docker-stop

docker stop container_id

コンテナの削除

https://docs.docker.jp/engine/reference/commandline/rm.html

docker rm container_id

docker ps -aq | xargs docker rm # 一括削除

コンテナの再起動

https://docs.docker.jp/engine/reference/commandline/start.html

**docker start** container_id

起動中のコンテナへの接続

https://docs.docker.jp/engine/reference/commandline/attach.html

docker attach container_id

コンテナのエクスポート

データボリュームはバックアップされないため別途対応が必要になる

https://docs.docker.jp/engine/reference/commandline/export.html

docker export container_id > file_name.tar

コンテナのインポート

https://docs.docker.jp/engine/reference/commandline/import.html

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

ボリュームの確認

https://docs.docker.jp/engine/reference/commandline/volume_ls.html#volume-ls-options

docker volume ls

ボリュームの情報を確認

https://docs.docker.jp/engine/reference/commandline/volume_inspect.html

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

起動中のコンテナからホストにファイルをコピーする

https://docs.docker.jp/engine/reference/commandline/cp.html

docker cp container_ip:path_to_file_in_container /path_to_directory_in_host

その他

リソースの状況を確認する

https://docs.docker.jp/engine/reference/commandline/stats.html

docker stats

コンテナの詳細情報を表示

https://docs.docker.jp/engine/reference/commandline/inspect.html

docker inspect

ログを確認する

https://docs.docker.jp/engine/reference/commandline/logs.html

docker logs container_id

Dockerfile

イメージを作成する作業を集約することができる設定ファイル。

Dockerイメージを自作する際に使用する。

Build

https://docs.docker.jp/engine/reference/commandline/build.html

Dockerfileからイメージを構築するコマンド

docker build . #ファイル名がDockerfileの場合

docker build - < Dockerfile2

命令

https://docs.docker.jp/engine/reference/builder.html

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

定義ファイル

https://docs.docker.jp/compose/compose-file/index.html

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で定義されたコンテナの起動

https://docs.docker.jp/compose/reference/up.html

docker compose up -d

docker compose -f ./file_name.yml up -d # docker-compose.yml以外のファイルは指定が必要

サービス名を指定して、コンテナを多重起動

docker compose up --scale web=8 -d

確認

指定のymlで定義されたコンテナの確認

https://docs.docker.jp/engine/reference/commandline/compose_ps.html

docker compose ps

一時停止

コンテナの停止

https://docs.docker.jp/compose/reference/pause.html

docker compose pause service_name

再開

コンテナの再開

https://docs.docker.jp/compose/reference/unpause.html

docker compose unpause service_name

削除

指定のymlで定義されたコンテナの削除

https://docs.docker.jp/compose/reference/down.html

docker compose down

ログの表示

指定のymlで定義されたコンテナのログ確認

https://docs.docker.jp/compose/reference/logs.html

docker compose logs

最後に

Dockerコマンドちょいちょい忘れるのでチートシート作りました。
なんか活用しきれていない気がしていたので整理できてよかったです。

Docker実践ガイドではDockerの仕組みが解説されていますが、Linuxとかもう少し低レイヤーについて知らないとだめだなーと改めて痛感しました。

参考

https://www.amazon.co.jp/Docker実践ガイド-第3版-impress-top-gear/dp/429501589X

https://docs.docker.jp/index.html

Discussion