Chapter 2

Docker

Subsections of Docker

Post Installation Steps for linux

Docker のインストール後の設定

docker group に追加

Docker サービスをデフォルトで起動時に開始するように設定

$ sudo systemctl enable docker.service
$ sudo systemctl enable containerd.service

無効化は以下の通り

$ sudo systemctl disable docker.service
$ sudo systemctl disable containerd.service

インストール後の設定はこちら

Copy and Mount Methods

docker での copy と mount

コピー

ホストとコンテナ間でファイルをコピーするときは次のようにする

$ docker cp <option> <コピー元path> <コピー先path>

コンテナのパスは<container name>:<path>のように書く

マウント

※マウントはコンテナをrunするときにオプションとして指定する

バインドマウント

既存(ホスト側)のファイルやフォルダをマウントする方法のこと。

普通のファイル同様に編集やバックアップが可能となるため、頻繁にアクセスするファイルなどはこちらに置く。

$ docker run (省略) -v <マウント元のパス>:<マウントポイント> (省略)

ボリュームマウント

ボリュームを作成し、マウントする方法のこと。

Dockerホストから変更を加えたくないようなファイルなどはこちらに置く。

  • ボリュームの作成

    $ docker volume create <volume name>
    
  • ボリュームの削除

    $ docker volume rm <volume name>
    
  • マウント方法

    $ docker run (省略) -v <ボリューム名>:<マウントポイント> (省略)
    

    ※ただしボリュームが存在しないときには新規作成される。

  • docker volume コマンドにおけるサブコマンド

    サブコマンド 意味
    create ボリュームの作成
    inspect ボリュームの詳細情報を確認
    ls ボリューム一覧を確認
    prune コンテナからマウントされていないボリュームをすべて削除
    rm ボリュームの削除

ボリュームマウントとバインドマウントを明示的に指定した設定方法

$ --mount type=<bind or volume>,src=<マウント元>,dst=<マウント先>

※この方法ではバインドマウントとボリュームマウントが明示的に指定されているためわかりやすく、 ボリュームが存在しない場合には新規作成されずエラーが出力される。そのため-vオプションより --mountオプションを使用することが推奨されている。

  • src は source でもOK
  • dst は destination でもOK
  • type=tmpfs としてメモリーを特定のマウント先に指定することもできる。

appendix

ボリュームのバックアップ方法

$ docker run --rm -v <volume name>:/src -v <バックアップ先のフォルダ名>:/dest busybox tar czf /dest/backup.tar.gz -C /src .
  1. 軽量なLinux イメージの busybox を起動
  2. バックアップ対象をコンテナの /src にボリュームマウント
  3. Docker ホストの任意のディレクトリを /dest にバインドマウント
  4. /src 以下の全ファイルが /dest/backup.tar.gz にバックアップされる
  5. コンテナが破棄される

※ただしこの方法ではバックアップしたいボリュームのボリューム名がわかっていなければならない。 バックアップ対象をボリューム名ではなくコンテナのディレクトリ名で指定したい場合は--volume-fromオプションを使用する!

$ docker run --rm --volume-from <container name> -v <バックアップ先>:/dest busybox tar czf /dest/bachup.tar.gz -C /var/lib/mysql .

バックアップのリストア

バックアップを取っておいたデータを任意のvolumeに復元する方法

$ docker run --rm -v <volume名>:/dest -v <バックアップデータの置かれているディレクトリ>:/src busybox tar xzf /src/backup.ta.gz -C /dest

データボリュームコンテナ

How to install Docker

1. Dockerのインストールの仕方

  1. 古いバージョンをアンインストール

    $ sudo apt-get remove docker docker-engine docker.io containerd runc
    

    It’s OK if apt-get reports that none of these packages are installed.

1.1 Install methods

Dockerのリポジトリをセットアップしてそこからインストール方法が推奨されている。

異なる方法もあるが、ここではリポジトリからインストールを行う。

  1. リポジトリの設定

    $ sudo -E apt-get update
    $ sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    
  2. Dockerの公式GPGキーを追加

    $ sudo mkdir -p /etc/apt/keyrings
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    
  3. 次のコマンドを使用して、リポジトリを設定

    $ echo \
     "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
     $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    

1.2 DockerEngineのインストール

  1. aptパッケージインデックスを更新し、Docker Engine、containerd、Docker Composeの最新バージョンをインストールするか、次の手順に進んで特定のバージョンをインストールする
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
  1. Docker Engineの特定のバージョンをインストールするには、リポジトリに使用可能なバージョンをリストしてから、以下を選択してインストールを行う
    1. リポジトリで利用可能なバージョンを一覧表示

      $ apt-cache madison docker-ce
      
    2. たとえば、2番目の列のバージョン文字列を(5:20.10.16~3-0~ubuntu-jammy)使用して特定のバージョンをインストールするならば、次のようなコマンドを実行する

      $ sudo apt-get install docker-ce=5:20.10.13~3-0~ubuntu-hirsute docker-ce-cli=5:20.10.13~3-0~ubuntu-hirsute containerd.io docker-compose-plugin
      

1.3 proxyの設定

  1. Docker Engine の proxy 設定 docker pull などでイメージを落としてくる場合はDocker Engine にプロキシ設定をする必要がある。

    /lib/systemd/system/docker.serviceで環境変数を指定。[Service]の欄の下にEnvironmentを追記すればOK!

    [Service]
    Environment=HTTP_PROXY=http://{HOST}:{port}
    Environment=HTTPS_PROXY=http://{HOST}:{port}
    
  2. Docker コンテナ起動時の proxy 設定 ~/.docker/config.json を書いておくとコンテナ内に HTTP_PROXY などを自動で設定してくれる

    ※Docker Compose のときにはつかえない?

    {
    "proxies": {
        "default": {
        "httpProxy": "http://{HOST}:{port}",
        "httpsProxy": "http://{HOST}:{port}"
        }
    }
    }
    
  3. proxy設定の反映とDockerを再起動

    $ sudo systemctl daemon-reload
    $ sudo systemctl restart docker
    

やってみたけどあまり意味のなかった設定

  • upstartの人

    $ sudo cat /etc/default/docker
    (省略)
    export no_proxy='export no_proxy=127.0.0.1,localhost,xxx.xxx.xxx.xxx'
    export NO_PROXY="${no_proxy}"
    export http_proxy='http://your.proxy.url:port/'
    export HTTP_PROXY="${http_proxy}"
    export https_proxy='https://your.proxy.url:port/'
    export HTTPS_PROXY="${https_proxy}"
    
  • Systemdの人

    $ sudo cat /etc/systemd/docker.service
    (省略)
    [Service]
    Environment="HTTP_PROXY=http://your.proxy.url:port/" "HTTPS_PROXY=https://your.proxy.url:port/"
    

    ※ /lib/systemd/system/docker.serviceと併用しようとするとDockerが起動しなくなるので注意!2つの設定が競合するのかな?

  • docker.service.dにファイルの追加

    $ cd /etc/systemd/system/
    $ mkdir docker.service.d
    $ sudo nano http-proxy.conf
        -> 内容の書き込み
    
    $ cat /etc/systemd/system/docker.service.d/http-proxy.conf
    [Service]
    Environment="HTTP_PROXY=http://proxy.example.com:8080/"
    Environment="HTTPS_PROXY=http://proxy.example.com:8080/"
    

1.4 確認

  1. hello-worldイメージを走らせ、Dockerが正しくインストールされていることを確認
    $ sudo docker run hello-world
    

2. Dockerのアンインストール方法

  1. Docker Engine、CLI、Containerd、およびDockerComposeパッケージをアンインストール

    $ sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-compose-plugin
    
  2. ホスト上のイメージ、コンテナー、ボリューム、またはカスタマイズされた構成ファイルは自動的に削除ない。すべてのイメージ、コンテナー、およびボリュームを削除するには下記を実行

    $ sudo rm -rf /var/lib/docker
    $ sudo rm -rf /var/lib/containerd
    

※編集した構成ファイルは手動で削除する必要がある

3. 問題とその解決策

3.1 $ sudo docker run hello-worldを実行するとタイムアウトしてしまう

インターネットに接続できない

-> proxyを設定(上記参照)

proxy 設定してもDockerイメージが取得できない(conectできない)…

おそらく公開鍵の問題!

apt updateなどを実行すると、「公開鍵を利用できないため、以下の署名は検証できませんでした」というエラーが出る。

つまりGPGエラーが問題だった!

ということでOpenGPG鍵をインポート

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-k

DockerのインストールでもGPG鍵キーのインストールはしているが、おそらく以下のどちらかが問題だった…

  • Install methodの 2. でもインストールしてるけどetcのところをusrにしなければならなかった
  • 1.2 DockerEngineのインストールはどちらも実行してしまい、DockerイメージをダウングレードしてしまったためGPGエラーが起こった(?)

補足(やってみたけど意味のなかったこと)

GPGエラーについて

W: 署名照合中にエラーが発生しました。 リポジトリは更新されず、過去のインデックスファイルが使われます。 GPG エラー: http://packages.cloud.google.com/apt cloud-sdk-xenial InRelease: 公開鍵を利用できないため、 以下の署名は検証できませんでした: NO_PUBKEY 6A030B21BA07F4FB

と出力されたため、apt-keyコマンドでパブリックキーを追加した(パブリックキーの有効期限切れだと思った…)

$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 6A030B21BA07F4FB

-> apt-keyではproxyにうまく接続できない問題が発生…

-> --keyserver-optionを使用してproxyサーバを指定

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --keyserver-option http-proxy=http://x:y@proxy:port --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
Executing: gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /tmp/tmp.oqJcUg9wwq --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg --keyserver hkp://keyserver.ubuntu.com:80 --keyserver-option http-proxy=http://x:y@proxy:port --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
gpg: 鍵A88D21E9をhkpからサーバーkeyserver.ubuntu.comに要求
gpg: 鍵A88D21E9: 公開鍵“Docker Release Tool (releasedocker) <docker@dotcloud.com>”を読み込みました
gpg: 処理数の合計: 1
gpg:               読込み: 1  (RSA: 1)

3.2 インターネットに(ブラウザで)接続できない

proxyの設定とGPG鍵のインストールで$ sudo docker run hello-worldは実行できるようになったが、未だChromeやFireFoxが使えない(インターネットに接続できない)…

  1. docker ではUbuntuの以下4つのバージョンでしか正常に動作することが保証されてなかったため、Ubuntu21.04ではうまく行かなかった

    • Ubuntu Jammy 22.04 (LTS)
    • Ubuntu Impish 21.10
    • Ubuntu Focal 20.04 (LTS)
    • Ubuntu Bionic 18.04 (LTS)
  2. 22.04 に upgrade したら使えるように! → Ubuntu22.04 のproxy設定を手動にしたら使えるようになった!

参考

Dockerのインストール

proxy設定

問題

GPGエラーについて

Docker Container for Cuda

docker の cuda コンテナの追加設定

1. .bashrc の変更

  • /home//root/ 以下に保存
    • /home/ はボリュームマウントしているので、新しくコンテナを作成する場合は設定ファイルを /home/ の保存し、作成したコンテナで /home/ 以下の設定ファイルをコピーすること!

2. python のライブラリの追加

ライブラリを追加するディレクトリにパスを通す

$ export PYTHONPATH="/root/.local/lib/python3.8/site-pachages/:$PYTHONPATH"
  • moysnn ライブラリのシンボリックリンクを"/root/.local/lib/python3.8/site-pachages/“以下に作成

3. コマンドのインストール

  • tree
  • trash

Connect to Container via ssh

dockerでsshを行う場合にはopensshd-serverをインストールし、設定を行う必要がある。

settings.sh

export DEBIAN_FRONTEND=noninteractive
apt-get install -y openssh-server 
export mkdir /var/run/sshd
export ENV=NOTVISIBLE "in users profile"
echo "export VISIBLE=now" >> /etc/profile
echo "service ssh start" >> /etc/profile

Dockerfile

RUN bash /tmp/setting.sh

EXPOSE <port>
CMD ["/usr/sbin/sshd", "-D"]

ただしssh-serverが起動していなければ接続できない。そのため、コンテナ内で以下のコマンドを使用し、サーバーが止まっていないかを確認すること。

$ service ssh status

start or stop ssh

$ service ssh start
$ service ssh stop

trouble

何度もuser名などを変えているとssh接続できない…

known_hostsファイルの情報と異なるためsshできなくなる

$ ssh-keygen -f "<path of known-hosts file>" -R "[<host>]:<port>"

と実行すればOK! (log標準出力でも表示されるのでそちらを参照!)

参照

How to install Docker Compose

  1. update
$ sudo apt update
$ sudo apt upgrade
  1. file のダウンロード
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  1. 権限の付与
$ sudo chmod +x /usr/local/bin/docker-compose
  1. 動作確認
$ docker-compose --version

docker compose のアップグレード

docker compose の v1 系をインストールしてしまっていたので v2 系にグレードアップ

1系のDocker compose の削除

/usr/local/bin/にあるdocker-composeディレクトリを削除

$ sudo trash docker-compose 

新しいDocker compose のインストール

  1. 以下のコマンドを実行して Docker Compose の現時点での最新安定版をダウンロードします。

    $ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
    $ mkdir -p $DOCKER_CONFIG/cli-plugins
    $ curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
    

    このコマンドによって、アクティブユーザーの$HOMEディレクトリ配下に Compose がインストールされます。 システム上の全ユーザー向けに Docker Compose をインストールする場合は、~/.docker/cli-pluginsの部分を/usr/local/lib/docker/cli-pluginsに置き換えます。

    別のバージョンをインストールする場合はv2.4.1 の部分を書き換える

  2. 実行バイナリに対して実行権限を与えます。

    $ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
    
  3. インストール結果をテストします。

    $ docker compose version
    

アンインストールする場合

  • curlを使って Docker Compose をインストールしていた場合は、次のようにしてアンインストールします。
    $ rm $DOCKER_CONFIG/cli-plugins/docker-compose
    

参考

Docker Compose

dockerでcudaコンテナの作成

cuda の GPG key 登録

  1. 古いキーの削除

    $ sudo apt-key del 7fa2af80
    
  2. ヘルパーパッケージを利用したキーの登録 nvidia が提供している、nvidia リポジトリ用の新しい署名キーのインストールを自動化する新しいヘルパーパッケージを利用して鍵を登録

    $ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
    $ sudo dpkg -i cuda-keyring_1.0-1_all.deb
    

    ubuntu2204x86_64は該当のものに書き換える

  3. remove の仕方 ※インストール時にターミナルに表示された文

    A deprecated public CUDA GPG key appear to be installed.
    To remove the key, run this command:
    sudo apt-key del 7fa2af80
    

結局必要だったのかわからなかったけどとりあえずやったこと

Setting up NVIDIA Container Toolkit

  1. パッケージリポジトリと GPG key のセットアップ

    $ distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
        && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
        && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
                sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
                sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
    
  2. nvidia-docker2 パッケージのインストール

    $ sudo apt-get update
    $ sudo apt-get install -y nvidia-docker2
    
  3. Docker demon のリスタート

    $ sudo systemctl restart docker
    
  4. ベースとなるCUDAコンテナを実行することによって、動作するセットアップをテスト

    $ sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
    

    以下のような出力ならOK!

    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 450.51.06    Driver Version: 450.51.06    CUDA Version: 11.0     |
    |-------------------------------+----------------------+----------------------+
    | GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
    |                               |                      |               MIG M. |
    |===============================+======================+======================|
    |   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
    | N/A   34C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |
    |                               |                      |                  N/A |
    +-------------------------------+----------------------+----------------------+
    
    +-----------------------------------------------------------------------------+
    | Processes:                                                                  |
    |  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
    |        ID   ID                                                   Usage      |
    |=============================================================================|
    |  No running processes found                                                 |
    +-----------------------------------------------------------------------------+
    

containerd

  1. コンテナエンジンとしてcontainerdをシステムにインストールするために、いくつかの前提モジュールをインストール

    $ sudo modprobe overlay \
        && sudo modprobe br_netfilter
    
  2. これらを確実に持続させることができる

    $ cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
    overlay
    br_netfilter
    EOF
    
  3. apt が HTTPS 上でリポジトリを使用できるようにするためのパッケージをインストール

    $ sudo apt update
    $ sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    
  4. リポジトリとGPG key の追加

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/  docker-archive-keyring.gpg
    $ echo \
        "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
        $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    

    ※1回やってたらいらないかも…

Dockerfile and docker-compose.yml の作成

docker compose と Dockerfileを使う場合

コンテナ作成後の設定

  1. 鍵の作成
  2. ssh server の起動
    $ bash ./sterter.sh
    
  3. vscodeのsettings.jsonとkeyboard.jsonの設定
  4. rootのパスワード設定

Dockerfile のみの場合

trouble

apt が使えない…

コンテナにはproxyを通してたけどaptに通すのを忘れてた…

Dockerfile の apt update の前に以下の文を追加

RUN echo 'Acquire::http::proxy "http://proxy.cc.yamaguchi-u.ac.jp:8080"; \
Acquire::https::proxy "https://proxy.cc.yamaguchi-u.ac.jp:8080";' > /etc/apt/apt.conf

nvidia gpg key の更新

$ sudo apt-key del 7fa2af80
$ wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-keyring_1.0-1_all.deb
$ sudo dpkg -i cuda-keyring_1.0-1_all.deb 
$ sudo apt update

cuda version を下げるとapt update が通らなくなる

RUN apt-get update && apt-get install -y \
  bzr \
  cvs \
  git \
  mercurial \
  subversion

みたいな感じで updateinstall をつなげてみたけどだめだった…

nvidiaのドライバが使えなくなった…

  1. nvidia driverのバージョンを落としてインストールし直す
  2. nvidia container toolkitをインストール
  3. proxy設定

参照

CudaをDockerで使用する際のDockerfileの作成

  1. 次のようなDockerfileを作成する

    FROM nvidia/cuda:11.4.0-cudnn8-devel-ubuntu20.04
    
    USER root
    
    COPY ./requirements.txt /tmp
    WORKDIR /code
    
    # ENV DEBIAN_FRONTEND noninteractive
    ENV https_proxy "http://<proxy server>"
    ENV https_proxy "http://<proxy server>"
    
    RUN echo 'Acquire::http::proxy "http://<proxy server>"; \
    Acquire::https::proxy "https://<proxy server>";' > /etc/apt/apt.conf
    
    RUN apt-get update && apt-get install -y \
    curl \
    python3 \
    python3-distutils
    
    RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && python3 get-pip.py
    
    RUN pip install -r /tmp/requirements.txt
    
    • proxy 設定は以下のようにする
      ENV https_proxy "http://~~~"
      ENV http_proxy "http://~~~"
      
    • **cuda の version を下げると apt update が通らなくなったので、RUN apt-get update 以下はコメントアウトして、 pythonなどはコンテナ作成後にアタッチしてインストールした…
  2. 同じ階層に requirememts.txt を作成し、 Dockerfile で呼び出せるようにする。 このファイルには必要なパッケージを記入しておく

    jupyter
    jupyterlab
    numpy
    pandas
    matplotlib
    scikit-learn
    scikit-image
    scipy
    torch
    torchvision
    tqdm
    albumentations
    tensorflow-gpu
    Pillow
    opencv-python
    
  3. 作成したディレクトリ構造は次のようになる

    $ tree my-nvidia-cuda/
    my-nvidia-cuda/
    ├── Dockerfile
    ├── requirements.txt
    └── src
        └── test.ipynb
    
  4. Docker イメージをビルド

    $ cd my-nvidia-cuda
    $ docker build . -t <image name>
    
  5. Docker コンテナを起動

    $ sudo docker run -it --gpus=all -v "$PWD":/code -p 8888:8888 --name <container name> <image name> /bin/bash
    
    • --gpusはgpuのを列挙

Basic docker usage

systemctl の使い方

Docker の起動と停止

$ systemctl start docker.service
$ systemctl stop docker.service
$ systemctl stop docker.socket

設定の反映と再起動

$ systemctl deamon-reload
$ systemctl restart docker.service

docker コマンド

$ docker <上位コマンド> <副コマンド> <オプション> <対象> <引数>

option

オプションの書式 内容
–name <コンテナ名> コンテナ名の指定
-p <ホストのポート番号>:<コンテナのポート番号> ポート番号の指定
-v <ホストのディスク>:<コンテナのディレクトリ> ボリュームのマウント
–net=<ネットワーク> コンテナをネットワークに接続
-e <環境変数名>=<値> 環境変数の指定
-d バックグラウンドで実行(detach: デタッチモードの略)
-i コンテナに操作端末(キーボード)をつなぐ
-t 特殊キーを使用可能にする
-help ヘルプの表示
–rm コンテナ終了時に自動的にコンテナを削除する
–workdir , -w コンテナ内部の作業ディレクトリを変更する

Docker container の作成

$ docker run <option> <container image> <引数>

docker runコマンドは、イメージをダウンロードするdocker pull, コンテナを作成するdocker create, コンテナを起動するdocker startコマンドを一つにまとめたもの。

コンテナを起動せずに作成したい(docker createしたい)場合などに, docker createdocker startを分けて使用する。

Docker 起動と停止

$ docker start <container name or container ID> #container の起動(container ID は他と重複しない先頭数文字だけでOK!)
$ docker stop <container name or container ID> #container のストップ

便利なコマンド

$ docker logs <container name> #logの確認

container の破棄

$ docker container ls #起動中のコンテナの表示(`docker ps`のように省略可)
$ docker container rm <container name> #コンテナの削除(``docker rm`のように省略可)

起動していないコンテナをすべて削除する場合は

$ docker container prune

image の破棄

$ docker image ls #ダウンロードしたイメージ一覧
$ docker image rm <repository>:<tag> #imageの削除(※tag が latest という最新版を表す値の場合は省略可, `docker rmi` のように省略可)

Docker の容量利用状況の確認

$ docker system df

Build Cache の削除

$ docker builder prune

※キャッシュが貯まると容量を大量に食うので注意!

detachとattach

  • detach Ctrl+P, Ctrl+Q

  • attach

    $ docker attach <container name or containerID>
    

shellの実行

コマンド コンテナの状態 シェル終了時
docker run 停止時 コンテナ終了
docker exec 稼働時 稼働のまま
  • 実行中のコンテナの場合

    $ docker exec -it <container name> /bin/bash
    

    を実行することでシェルが起動する

    ※ここでexitしてもdocker exec で実行したものが終了するだけのため、コンテナは終了しない

  • 停止中のコンテナの場合

    $ docker run --name <container name> -it <conteinaer image> /bin/bash
    

    を実行することでシェルが起動する

    ※ここでexitするとコンテナも終了する

  • 補足

    • ここではあくまで/bin/bashというコマンドを実行しているだけのため、/bin/passwd(パスワードの変更画面を表示)のような他のコマンドを実行することもできる。
    • 他のシェルを使用したい場合には /bin/bash でなく /bin/sh/ のように実行することもできる
    • 現在使用しているシェルはecho $SHELL, 使用可能なシェルはcat /etc/shellsで確認することができる。

Appendix

補足

1回限り動かすコンテナの使い方

(例)go言語でコンパイルするためのコンテナを作成する場合

$ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.13 go built -v

ここではgo built -v を実行してコンテナを終了・削除している。