Heavy Watal

Docker

https://docs.docker.com/

ホストOSから隔離された環境でアプリケーションを動かすためのプラットフォーム。 ゲストOSを丸ごと動かす仮想マシンとは異なり、ホストLinuxのカーネルを使うので軽い。 LinuxじゃないホストOSでは仮想化が挟まるぶんのコストが結局かかる。

管理者権限を持っている状況でサービスを開発・運用するのに向いている。 HPCにおけるCLIツール導入や一般ユーザーからの利用が目的なら Apptainer のほうが便利。

Get Started

Glossary

container
ホストOSから隔離されたプロセスやファイルシステムを持つ実行環境。 目的のアプリケーションを動かすのに必要な構成要素のうちkernelより上をすべて含む。 imageを読み込んで起動したインスタンス。
image
containerの構成要素を集めて固めたファイル。
Docker独自の形式をベースにOCIとして標準化されている。
dockerfile
imageのレシピ。

Linux

https://docs.docker.com/engine/install/ubuntu/

apt repository を追加してインストール。

sudo なしで実行できるようにするには:

sudo gpasswd --add $(whoami) docker
sudo chgrp docker /var/run/docker.sock
sudo systemctl restart docker
exit
# login again
docker --version

Mac

Docker Desktop より Orbstack のほうが軽くて使いやすい。 いずれにせよ Homebrew で入れるのが簡単:

brew install --cask orbstack
open -a OrbStack

OrbStack.app を起動するとシェルの設定を勝手にいじってパスを通してくれる:

orb --help
docker --version
docker-compose --version

Hello world

docker image pull hello-world
docker image ls
docker container run hello-world
docker container ls --all

run で手元にimageが見つからなければ勝手に pull される。 containerは実行終了後も残る。

CLI

操作対象がcontainerかimageかなどによってサブコマンドを使う。 前は docker pull, docker run のようにフラットなコマンド体系だった。

docker container subcommands

https://docs.docker.com/engine/reference/commandline/container/

docker container ls
実行中のcontainerを表示。
-a: 終了後のものも表示。
-q: IDのみ表示。
docker container rm CONTAINER
containerを削除。
停止中のものを一括削除するなら docker container prune
docker container run [OPTIONS] IMAGE [COMMAND]
新しいcontainerを走らせてコマンドを実行。
-i, --interactive: 標準入力を開けておく。
-t, --tty: 標準出力を開けておく。
-d, --detach: バックグラウンドで実行させておく。 うっかりフォアグラウンドで起動してしまっても ^p^q でデタッチできる。
--rm: 終了後に削除。これを指定しないと ls -a のリストに残る。
--name string: コンテナに名前を付ける。 exec で指定するときに便利。
--mount: containerから外のファイルシステムにアクセスできるように割り当てる。
  • type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>: Docker管理下に場所を確保する。 container再起動やcontainer間共有のための永続化にはこっちを使う。 Docker外でも使うデータを読み書きするのには向かない。
  • type=bind,src=<HOST-PATH>,dst=<CONTAINER-PATH>: ホスト側の場所を直接指定する。 古い -v オプションによる指定は非推奨。
  • --mount type=bind,src="$PWD",dst="$PWD"
    --workdir "$PWD"
    --user "$(id -u):$(id -g)"
    のようにするとcontainer内のプログラムにカレント以下を渡せる。 Apptainerならこのへんの設定をデフォルトでやってくれる。
docker container exec [OPTIONS] IMAGE COMMAND
既に走ってるcontainerでコマンドを実行。

docker container stats

docker image subcommands

https://docs.docker.com/engine/reference/commandline/image/

docker image ls
手元にあるimageを一覧表示。
docker image pull NAME:TAG
Docker Hub などからimageをダウンロード。

misc.

docker system info
docker system df

Registry

BioContainers
BioConda recipes を使っているらしい。
実際のregistry機能をホストしているのは他所のサーバー:
Docker Hub
100 pulls / 6 hours の制限がある。 無料のPersonalアカウントで認証していれば200。
Quay.io
無料アカウントは無い。pull制限は?
Google Container Registry
シェルさえ含まず軽量セキュアな distroless を提供。

GitHub Container Registry (GitHub Packages)

GitLab Container Registry