コンテンツにスキップ

基本・ネタ帳

dockerコマンド

docker container / image コマンド新旧比較 - Qiita

run

-p | --publish

localでlistenするポート:コンテナに接続するポートを指定する。

-p 8081:80

これでホスト上は8081でListenして、その接続をコンテナの80へ転送する。

ボリューム (-v)

ボリュームの利用 | Docker ドキュメント

ボリュームマウント

$ docker run --name httpd --rm -d -v webvolume:/var/tmp httpd

webvolumeボリュームを(無ければ自動作成して)/var/tmpにマウントしてコンテナ起動。
コンテナを停止・削除してもボリュームは残るので、このボリュームを別コンテナでマウントすればデータを保持できる。

ホストのアドレス(--add-host)

host.docker.internalをホストOSのアドレスに設定するにはhost-gatewayを指定する。

docker run --add-host host.docker.internal:host-gateway --rm -it centos bash

これでコンテナ内の/etc/hostshost.docker.internalのエントリが追加され、ホストOSへのアドレスが設定される。

inspect

コンテナの状態を確認する

docker inspect <container name or ID>

formatでIPアドレス

docker runでデフォルトのネットワークへデプロイしたコンテナであればこの通り。

$ docker inspect <container name or ID> --format '{{ .NetworkSettings.IPAddress }}'
172.17.0.2

デフォルト以外のネットワークはこのパスの値は空になっているので、ネットワークの指定も必要。
Compose使用時もこのパターン。

$ docker inspect <container name or ID> --format '{{ .NetworkSettings.Networks.<network name>.IPAddress }}'
172.18.0.2

save

$ docker save imagename:tag > imagename-tag.tar

または

$ docker save imagename:tag -o imagename-tag.tar

load

$ docker load -i image.tar

あるいは

$ docker load < image.tar

pull

sha256ハッシュ値指定

$ docker pull httpd@sha256:f2179b693cfb49baa6e7500171deea7bef755338bf165b39aedacf2b4ae28455

volume

リストする。

$ docker volume ls

参照されてないボリュームをリストアップする。
ダングリング

$ docker volume ls -f dangling=true

prune

不要オブジェクトを削除するにはdocker pruneを使う。

コンテナのprune

$ docker container prune

デフォルトは停止している全コンテナが削除される。
10日以前に 停止している 作成されて現在停止中のコンテナの場合は、

$ docker container prune --filter "until=240h"

Go duration stringsを使って期間を指定できる。
指定可能なのは以下、かな?

Valid time units are "ns", "us" (or "µs"), "ms", "s", "m", "h"

イメージのprune

$ docker image prune

デフォルトは、タグが設定されずに<none>になっているイメージが削除される。
<none>のイメージをリストアップするだけであれば docker image ls -f "dangling=true" でリストアップできる。

実行サンプル

ローカルのwebコンテンツをhttpdに持たせる

docker run --name http_sample --rm -p 8081:80 -d -v $PWD:/usr/local/apache2/htdocs httpd:latest 

centos:stream8

quayにあるイメージを使う

docker run --name cent-stream --rm -it quay.io/centos/centos:stream8 bash

ビルド

ヘルスチェック

30秒後にhttpdが起動するようになっているコンテナイメージ。

FROM httpd:2.4

COPY index.html /usr/local/apache2/htdocs/
RUN apt-get update; apt-get install curl

HEALTHCHECK --interval=5s --timeout=5s --retries=15 CMD curl -f http://127.0.0.1 || exit 1

#CMD ["httpd-foreground"]
CMD ["sh", "-c", "sleep 30; httpd-foreground"]

起動処理中は

[zaki@node slowstart_httpd]$ docker run --rm -d -p 8080:80 --name slowstart_httpd slowstart_httpd
e5c366cb3bbab10284ab41bd3e23fbf24720c9c371c35a8137d78a3c138844c6
[zaki@node slowstart_httpd]$ docker container ls
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS                            PORTS                                   NAMES
e5c366cb3bba   slowstart_httpd   "sh -c 'sleep 30; ht…"   5 seconds ago   Up 4 seconds (health: starting)   0.0.0.0:8080->80/tcp, :::8080->80/tcp   slowstart_httpd

起動後は

[zaki@node slowstart_httpd]$ docker container ls
CONTAINER ID   IMAGE             COMMAND                  CREATED          STATUS                    PORTS                                   NAMES
e5c366cb3bba   slowstart_httpd   "sh -c 'sleep 30; ht…"   32 seconds ago   Up 31 seconds (healthy)   0.0.0.0:8080->80/tcp, :::8080->80/tcp   slowstart_httpd

GitHub Container Registry

手順は以下。
コンテナレジストリの利用 - GitHub Docs

認証に使用するパスワードは、個人用アクセストークンを作成する。
個人アクセストークンを使用する - GitHub Docs

Personal Access Tokens (Classic)で[Generate new token]押下、Select scopesのwrite:packagesにチェックして[Generate token]押下すればトークンが生成される。
GitHubのユーザー名と、入手したトークンをパスワードとして、

$ docker login ghcr.io

すれば認証できる。

あとはghcr.io/zaki-lknr/squid:5.0.4-alpine-3.13とかの名前のタグをつければpushもできる。
pushされたイメージは、GitHubのweb画面の「Packages」で確認できる。デフォルトはprivate設定。

ECR (Elastic Container Registry)

認証用パスワードは aws CLIを使用。
aws ecr get-login-password を実行するとレジストリ認証に使用するパスワードを取得できる。

$ aws ecr get-login-password --region ap-northeast-1
eyJwYXls ......

ログイン時のユーザー名は AWS 固定のため、レジストリログイン用のコマンドは以下の通り。

$ podman login <registry URL> -u AWS -p $(aws ecr get-login-password)

プライベートレジストリの認証 - Amazon ECR

ACR

ポータルからの場合は、レジストリメニューの「トークン」から、「追加」でトークンを作成する。スコープマップに権限を入力。
作成したトークンの「詳細」からパスワードを生成できる。
生成されるのはjdocker loginで指定するパスワード、およびDockerコマンド列全体(docker login -u ... -p ...)も得られる。(ユーザー名はトークン名になる)