2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

[メモ]初心者がコンテナを触ってみる - (2)Dockerイメージの取得・操作

Last updated at Posted at 2023-06-26

はじめに

お疲れ様です。yuki_inkです。

初心者がコンテナを触ってみるシリーズ2回目です。
モチベはまだある。

やったこと

  • Docker Hubアカウントの作成
  • イメージの検索
  • Docker Hubからイメージのダウンロード
  • イメージの内容の確認
  • イメージの削除
  • イメージのタグ設定
  • Docker Hubへのイメージのアップロード

Docker Hubアカウントの作成

Docker Hubのページにアクセスし、サインアップ。
なんかCAPTCHAの判定めっちゃ厳しかった。。
image.png
プランはPersonalでヨシ。
image.png
サインアップページで指定したメールアドレスに確認メールが届くので、メール上のリンクをポチって登録完了。

イメージの検索

Docker Hubの画面上部の検索バーでDockerイメージを検索できる。
image.png

docker search [検索キーワード]コマンドで、コマンドラインでも検索できる。

$ docker search nginx
NAME                        DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                       Official build of Nginx.                        18687     [OK]
unit                        Official build of NGINX Unit: Universal Web …   6         [OK]
nginxproxy/nginx-proxy      Automated Nginx reverse proxy for docker con…   90
nginxproxy/acme-companion   Automated ACME SSL certificate generation fo…   116
~以下略~

画面上での検索結果と一致。

コマンドのオプションや出力の見方は公式ドキュメントを参照。

Docker Hubからイメージのダウンロード

docker image pull [イメージ名]コマンドでイメージをダウンロードできる。

そういえば前回も、PCにDockerをインストールした後、docker image pull nginxでNginxのイメージを取得してコンテナ立てたなぁと、今更ながら思い出す。
あれはDocker Hubからイメージを取得していたんですね。

docker pull のイメージは Docker Hub から取得するのがデフォルトです。 取得するレジストリの場所は、手動で指定可能です。 例えば、ローカルにレジストリをセットアップしておけば、そちらを指定してイメージを取得できます。

docker image lsコマンドで取得したイメージの一覧を表示する。
前回やったときにNginxのイメージは取得していたので、docker image ls nignx --digestsで以下のように表示される。
docker image ls [リポジトリ名]で、指定したリポジトリに出力を限定できる。
--digestsオプションでイメージのダイジェストを表示。

$ docker image ls nginx --digests
REPOSITORY    TAG       DIGEST                                                                    IMAGE ID       CREATED       SIZE
nginx         latest    sha256:593dac25b7733ffb7afe1a72649a43e574778bf025ad60514ef40f6b5d606247   eb4a57159180   11 days ago   187MB

この状態でdocker image pull nginxを実行。

$ docker image pull nginx
Using default tag: latest
latest: Pulling from library/nginx
Digest: sha256:593dac25b7733ffb7afe1a72649a43e574778bf025ad60514ef40f6b5d606247
Status: Image is up to date for nginx:latest
docker.io/library/nginx:latest

Docker Hub上に更新版があればそれをダウンロードして、ローカルのイメージを更新してくれるようだが、今回はすでにローカルのイメージが最新だった。
1週間前にダウンロードしたばかりだしなあ。。

[イメージ名] = [リポジトリ名] + [タグ名]
[タグ名]を省略すると、「latest」のイメージが取得される
docker image pull nginxdocker image pull nginx:latestは同じ意味になる

参考:Docker初心者がイメージとリポジトリの違いが分からなくて混乱したこと

リポジトリ/レジストリ/イメージ/タグの概念図は以下が分かりやすかった。

イメージの内容の確認

docker image inspect [イメージ名]コマンドで、イメージの詳細情報を確認できる。
イメージIDや作成日、OS、Dockerのバージョン、CPUのアーキテクチャなどが分かる。

コマンドの出力結果はかなり長いので折りたたむ。
$ docker image inspect nginx
[
    {
        "Id": "sha256:eb4a57159180767450cb8426e6367f11b999653d8f185b5e3b78a9ca30c2c31d",
        "RepoTags": [
            "nginx:latest"
        ],
        "RepoDigests": [
            "nginx@sha256:593dac25b7733ffb7afe1a72649a43e574778bf025ad60514ef40f6b5d606247"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2023-06-14T07:16:35.543292113Z",
        "Container": "20a63bb857cabbde744d031c670a18470ddff9bc46c712bc3eaecbea49df55f8",
        "ContainerConfig": {
            "Hostname": "20a63bb857ca",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.25.1",
                "NJS_VERSION=0.7.12",
                "PKG_RELEASE=1~bookworm"
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) ",
                "CMD [\"nginx\" \"-g\" \"daemon off;\"]"
            ],
            "Image": "sha256:88c36fc25777ef22f947c314610b2852daaa20bdc25b10b7b4cad93d20b46ef7",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "DockerVersion": "20.10.23",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "80/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "NGINX_VERSION=1.25.1",
                "NJS_VERSION=0.7.12",
                "PKG_RELEASE=1~bookworm"
            ],
            "Cmd": [
                "nginx",
                "-g",
                "daemon off;"
            ],
            "Image": "sha256:88c36fc25777ef22f947c314610b2852daaa20bdc25b10b7b4cad93d20b46ef7",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/docker-entrypoint.sh"
            ],
            "OnBuild": null,
            "Labels": {
                "maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
            },
            "StopSignal": "SIGQUIT"
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 186854870,
        "VirtualSize": 186854870,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/var/lib/docker/overlay2/4461900a2deb70a9539f4738a6bf5a677e5eb6271555498915f6974ceae620fb/diff:/var/lib/docker/overlay2/2a885ecae7789b14fe952080573530f20bdbea86db29fa8208d3ca0fe6896c28/diff:/var/lib/docker/overlay2/167b574dde1fb180c02450a4785b606ece4b4cf695a7bd5a504a63eb82eac405/diff:/var/lib/docker/overlay2/d6f1073591a995357b8c4afd9d9500eb142c5f3d2799eb609eb270cad5b38990/diff:/var/lib/docker/overlay2/a174bca077ed55e6b6fb68e02a3ce086a4111c3adce9fe90d0af44b1a00d4035/diff:/var/lib/docker/overlay2/d0c3cbf125e31a09651a53a717c804b3a468b368db75ca251c6bb04296e28882/diff",
                "MergedDir": "/var/lib/docker/overlay2/81d7641a81cadbc15e6dbca64fb06e1b7350669fa6fecc3ed29eb4680ce269c0/merged",
                "UpperDir": "/var/lib/docker/overlay2/81d7641a81cadbc15e6dbca64fb06e1b7350669fa6fecc3ed29eb4680ce269c0/diff",
                "WorkDir": "/var/lib/docker/overlay2/81d7641a81cadbc15e6dbca64fb06e1b7350669fa6fecc3ed29eb4680ce269c0/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:ac4d164fef90ff58466b67e23deb79a47b5abd30af9ebf1735b57da6e4af1323",
                "sha256:a8311013964725a288e00b53cfcf67d9303c4b3bc2ad7475cfc3b25867580ace",
                "sha256:4ca29ffc4a01ee651811c21b457cea0f2f5d5b0270d258208391a17998675a79",
                "sha256:bf8b62fb2f13ed1f2da4fd11f8136180c3284e88af95d7f00d21c8064f99f3b1",
                "sha256:7757099e19d2d8f2e1c09c9076524f912de42e6c76bc8a082ff178d74b5f54a6",
                "sha256:12a568acc014fad0d74cfa5509c6f55e80db2afb199ad5c1bdff05e2b6d1e5c7",
                "sha256:9e96226c58e7d2ab330522f49a51eb25037d4f89bfc53fa2c10b910184fa6b78"
            ]
        },
        "Metadata": {
            "LastTagTime": "0001-01-01T00:00:00Z"
        }
    }
]

イメージの削除

docker image rm [イメージ名]コマンドで、ローカルのイメージを削除できる。
Docker導入時に取得した「hello-world」を削除する。

$ docker image ls
REPOSITORY    TAG       IMAGE ID       CREATED       SIZE
nginx         latest    eb4a57159180   12 days ago   187MB
hello-world   latest    9c7a54a9a43c   7 weeks ago   13.3kB

$ docker image rm hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:c2e23624975516c7e27b1b25be3682a8c6c4c0cea011b791ce98aa423b5040a0
Deleted: sha256:9c7a54a9a43cca047013b82af109fe963fde787f63f9e016fdc3384500c2823d
Deleted: sha256:01bb4fce3eb1b56b05adf99504dafd31907a5aadac736e36b27595c8b92f07f1

消えた!

$ docker image ls
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    eb4a57159180   12 days ago   187MB

イメージのタグ設定

Docker Hubにイメージをアップロードして終わろ~と思っていたら、

まず、アップロードしたDockerイメージに決まったフォーマットでタグを付けてあげる必要があります。
docker tag イメージID DockerHubユーザ名/任意のイメージ名でタグをつけてあげます。

とのこと。

既存のNginxのイメージに対して、以下の情報を付与する。

  • ユーザ名:yukiink ※Docker Hubのユーザ名と一緒にする
  • イメージ名:webserver
  • バージョン:1.0 ⇒タグに入れる
$ docker image tag nginx yukiink/webserver:1.0

docker image lsでタグ設定を確認する。

$ docker image ls
REPOSITORY          TAG       IMAGE ID       CREATED       SIZE
nginx               latest    eb4a57159180   12 days ago   187MB
yukiink/webserver   1.0       eb4a57159180   12 days ago   187MB

タグを付与したイメージ(yukiink/webserver:1.0)と元のイメージ(nginx:latest)のIMAGE IDが同じ!(eb4a57159180)
両者の実体が同じであることを意味しているらしい。
※イメージに別名を付けただけで、イメージ自体をコピーしたりリネームしたりしたわけではない。

Docker Hubへのイメージのアップロード

Docker Hubに、先ほどタグ付けしたイメージ(yukiink/webserver:1.0)をアップロードする。

まずはコマンドラインでDocker Hubにログインする。

$ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: yukiink  ##ユーザ名を入力する
Password:  ##パスワードを入力する
Login Succeeded

オプションを利用して、docker login -u (ユーザ名) -p (パスワード)のコマンド一発でも入れるらしい。

docker image push [イメージ名]コマンドで、イメージをDocker Hubにアップロードする。

$ docker image push yukiink/webserver:1.0
The push refers to repository [docker.io/yukiink/webserver]
9e96226c58e7: Mounted from library/nginx
12a568acc014: Mounted from library/nginx
7757099e19d2: Mounted from library/nginx
bf8b62fb2f13: Mounted from library/nginx
4ca29ffc4a01: Mounted from library/nginx
a83110139647: Mounted from library/nginx
ac4d164fef90: Mounted from library/nginx
1.0: digest: sha256:d2b2f2980e9ccc570e5726b56b54580f23a018b7b7314c9eaff7e5e479c78657 size: 1778

完了。
ブラウザからDocker Hubを確認すると、yukiink/webserverのリポジトリが表示されている。
image.png
リポジトリの中を確認すると、1.0のタグを持つイメージが表示されている。
image.png

Docker Hubからログアウトして終了!

$ docker logout
Removing login credentials for https://index.docker.io/v1/

終わりに

今回はDockerイメージを操作するコマンドをいくつか触ってみました。
なるほど、こうやってイメージをリポジトリにアップするのね。。

次回はコンテナを実際に立ててみたり消してみたり、そんなライフサイクル関連のコマンドを触ってみようと思います。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?