はとのーと

エジソンノート(アイデア、思い付き、メモ)として使っています。誰かの役に立つかもしれないので公開しています。

Dockerについてのメモ

目次:

コンテナの状態遷移図

(この図は Mermaid Live Editor で作成されました)

よく使うコマンド

  • イメージを検索する: docker search {KEYWORD}
  • イメージを Docker HUB 上で検索する: Docker Hub の検索ボックスにキーワードを入れる
  • イメージをダウンロードする: docker pull {IMAGE}
  • ダウンロード済のイメージを表示する: docker images
  • ダウンロード済のイメージを削除する: docker rmi {IMAGE}
  • コンテナを実行する: docker start {CONTAINER}
  • 標準入出力をアタッチしてコンテナを実行する: docker start --attach {CONTAINER}
  • 実行中のコンテナを表示する: docker ps
  • すべてのコンテナを表示する: docker ps --all
  • コンテナを削除する: docker rm {CONTAINER}
  • Docker のディスク使用状況を表示する: docker system df
  • イメージに別名(タグ)をつける: docker tag {ID} {NAME}

docker ps のオプション

docker ps には様々なオプションがある。

docker ps — Docker-docs-ja 20.10 ドキュメント

# mysql:8 イメージで動作しているコンテナ (停止中も含む) の一覧
$ docker ps --all --filter "ancestor=mysql:8"

# mysql:8 イメージで動作しているコンテナの名前の一覧
$ docker ps --all --filter "ancestor=mysql:8" --format="{{.Names}}"

# mysql:8 イメージで動作しているコンテナを削除する
$ docker ps --all --filter "ancestor=mysql:8" --format="{{.Names}}" | xargs docker rm

特定のユーザで実行する

docker run 時に以下のオプションを付けるとホストと同じユーザで実行される。

  • -u `id -u`:`id -g` - 現在のユーザのユーザID、グループIDを使う
  • -v /etc/passwd:/etc/passwd - ユーザ名をホストから取得する
  • -v /etc/group:/etc/group - グループ名をホストから取得する

複数コマンドを実行する

docker run 時に複数のコマンドを実行するにはコマンドとして {SHELL} -c "COMMAND1 && COMMAND2 && ..." を指定する。

例 (Alpineコンテナでインストールされているパッケージを表示する):

docker run --rm alpine:latest /bin/sh -c "apk update && apk list -I"

イメージの中身を確認する

hello-world イメージを調べてみる。

イメージを取得する:

$ docker pull hello-world
Using default tag: latest
latest: Pulling from library/hello-world
0e03bdcc26d7: Pull complete
Digest: sha256:e7c70bb24b462baa86c102610182e3efcb12a04854e8c582838d92970a09f323
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

イメージの中身を確認する:

$ docker image inspect hello-world
[
    {
        "Id": "sha256:bf756fb1ae65adf866bd8c456593cd24beb6a0a061dedf42b26a993176745f6b",
        "RepoTags": [
            "hello-world:latest"
(中略)
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"/hello\"]"
            ],
(中略)
        "GraphDriver": {
            "Data": {
                "MergedDir": "/var/lib/docker/overlay2/9317ae56b93c9a7ae9459380e7b0af1b5914824bc034ee9c01e4f68182bf131d/merged",
                "UpperDir": "/var/lib/docker/overlay2/9317ae56b93c9a7ae9459380e7b0af1b5914824bc034ee9c01e4f68182bf131d/diff",
                "WorkDir": "/var/lib/docker/overlay2/9317ae56b93c9a7ae9459380e7b0af1b5914824bc034ee9c01e4f68182bf131d/work"
            },
            "Name": "overlay2"
        },
(後略)
  • /bin/sh -c /hello を実行している
  • ディレクトリは /var/lib/docker/overlay2/9317ae56b93c9a7ae9459380e7b0af1b5914824bc034ee9c01e4f68182bf131d

ディレクトリを確認する:

$ cd /var/lib/docker/overlay2/9317ae56b93c9a7ae9459380e7b0af1b5914824bc034ee9c01e4f68182bf131d
$ ls -F
diff/  link
$cd diff
$ ls -F
hello*
$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped

docker-compose

docker-compose.yml に複数のコマンドを書きたい場合には次のようにする。

例: alpine Linux で SQLite3 をインストールしてから PHP の内蔵サーバを実行する場合

command: >
    /bin/sh -c "
    apk update && apk add sqlite &&
    php -S 0.0.0.0.:8080 -t public"

参考リンク