LoginSignup
27
35

More than 5 years have passed since last update.

Docker コマンドチートシート

Last updated at Posted at 2019-03-11

イントロダクション

1. この記事の目的

  • Docker を初めて使う人に, 基本的な使い方がパッとわかるように説明する
    • ちなみに私自身も Docker 初心者なので間違えていたら指摘していただけると嬉しいです

2. 対象読者

  • Docker の概念は他の記事などで知っているけれど, 実際にはこれから初めて使う方
  • 他の記事を見たけれど, 使い方がいまいちよくわからない方
  • 細かいことはいいからすぐに使いたい方

3. 動作環境

  • Ubuntu 18.04
  • Docker 18.09.2
  • Nvidia Docker 2.0.3

4. この記事で書かないこと

本編

1. docker の使い方の基本

ほとんどの場合、1つのコンテナの中で1つのプロセスだけ実行すべきです。アプリケーションを複数のコンテナに分離することは、水平スケールやコンテナの再利用を簡単にします。サービスとサービスに依存関係がある場合は、 コンテナのリンク を使います。

2. docker コマンド全体像

  • 図のほうがわかりやすいと思ったので作ってみた
  • 初めて使う人は, pull -> run あたりの解説を読んで, とりあえず動かしてみると理解が進むと思います

DockerOverview.png

3. 解説するコマンド一覧

注意:図中に存在しないコマンドもある

  • image の操作
    • images
    • search
    • pull
    • tag
    • rmi
  • conteiner の操作
    • ps
    • create
    • start
    • stop
    • restart
    • run
    • attach
    • exec
    • status
    • top
    • rm
  • image の保存と再構築
    • build
    • commit
    • Dockerfile

4. 本記事における表記ルール

  • {param}
    • 必須の引数
  • [param]
    • option の引数

5. コマンド詳細

5.1 image の操作

docker images

  • ホストに存在するイメージを確認する
$ docker images

#-----------------------------------------------------
# 例
#-----------------------------------------------------
$ docker images
# 結果 -> ホストに存在するイメージの一覧が表示される
REPOSITORY          TAG                  IMAGE ID            CREATED             SIZE
ubuntu              latest               47b19964fb50        3 weeks ago         88.1MB
nvidia/cuda         9.0-cudnn7-runtime   17c50af840b7        4 weeks ago         1.21GB

docker search

  • 公開されているイメージを検索する
$ docker search {image}

#-----------------------------------------------------
# 例
#-----------------------------------------------------
$ docker search ubuntu
# 結果 -> リポジトリで公開されているイメージの一覧が表示される
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                 Ubuntu is a Debian-based Linux operating sys…   9265                [OK]                
dorowu/ubuntu-desktop-lxde-vnc                         Docker image to provide HTML5 VNC interface …   274                                     [OK]

etc.

docker pull

  • 公開されているイメージをリポジトリから取得する
$ docker pull {image}[:tag]

#-----------------------------------------------------
# 例
#-----------------------------------------------------
$ docker pull hello-world:latest
# 結果 -> REPOSITORY=hello-world, TAG=latest のイメージが追加される.
$ docker images
REPOSITORY          TAG                  IMAGE ID            CREATED             SIZE
hello-world         latest               fce289e99eb9        8 weeks ago         1.84kB
ubuntu              latest               47b19964fb50        3 weeks ago         88.1MB
nvidia/cuda         9.0-cudnn7-runtime   17c50af840b7        4 weeks ago         1.21GB

docker tag

  • ホストに存在するイメージのイメージ名とタグ名を変更する
  • 元イメージを別名で呼べるようになる
    • イメージの実体は共通である点に注意
$ docker tag {image} {new_image}{:new_tag_name}

#-----------------------------------------------------
# 例
#-----------------------------------------------------
$ docker tag hello-world hello-world2:latest2
# 結果 -> 同一 ID の別名が生成される
$ docker images
REPOSITORY          TAG                  IMAGE ID            CREATED             SIZE
hello-world2        latest2              fce289e99eb9        8 weeks ago         1.84kB
hello-world         latest               fce289e99eb9        8 weeks ago         1.84kB
ubuntu              latest               47b19964fb50        3 weeks ago         88.1MB
nvidia/cuda         9.0-cudnn7-runtime   17c50af840b7        4 weeks ago         1.21GB

docker rmi

  • イメージを削除する
    • イメージ名かイメージIDを指定可能
  • option
    • -f: イメージを強制的に削除する
$ docker rmi [opiton] {iamge1} {image2} ...

#-----------------------------------------------------
# 例
#-----------------------------------------------------
$ docker rmi hello-world2
# 結果 -> イメージが削除される
$ docker images
REPOSITORY          TAG                  IMAGE ID            CREATED             SIZE
hello-world         latest               fce289e99eb9        8 weeks ago         1.84kB
ubuntu              latest               47b19964fb50        3 weeks ago         88.1MB
nvidia/cuda         9.0-cudnn7-runtime   17c50af840b7        4 weeks ago         1.21GB

5.2 conteiner の操作

docker ps

  • ホストに存在する稼働中のコンテナを表示する
  • option
    • -a: 停止中のコンテナも含めて全て表示する
$ docker ps # 稼働中のコンテナ一覧表示
$ docker ps -a # 停止中のコンテナも含めて一覧表示

#-----------------------------------------------------
# 例
#-----------------------------------------------------
$ docker ps
# 結果
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
76368d6f5feb        ubuntu:latest       "/bin/bash"         2 minutes ago       Up 2 minutes                            test2

$ docker ps -a
# 結果 -> 停止中のコンテナも見えるようになる
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
76368d6f5feb        ubuntu:latest       "/bin/bash"         About a minute ago   Up About a minute                                   test2
ce64ec84b470        ubuntu:latest       "/bin/bash"         2 minutes ago        Exited (0) About a minute ago                       test1

docker create

  • コンテナを作成する(起動はしない)
  • run コマンドとほぼ同じコマンドルールなので詳細は割愛する
$ docker create [option] {image}[:tag] [コンテナで実行するコマンド]

docker start

  • 停止中のコンテナを起動する
  • コンテナ名 or コンテナID を指定する
$ docker start [option] {container} [container]
  • 主な option
option 説明
-a, --attach STDOUT、STDERR にアタッチする
-i, --interactive コンテナの STDIN にアタッチ
#-----------------------------------------------------
# 例
#-----------------------------------------------------
# 事前条件
$ docker ps -a

CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                          PORTS               NAMES
76368d6f5feb        ubuntu:latest       "/bin/bash"         About a minute ago   Up About a minute                                   test2
ce64ec84b470        ubuntu:latest       "/bin/bash"         2 minutes ago        Exited (0) About a minute ago                       test1

# コマンド実行
$ docker start test1
$ docker ps
# 停止していたコンテナが稼働する
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
76368d6f5feb        ubuntu:latest       "/bin/bash"         16 minutes ago      Up 16 minutes                           test2
ce64ec84b470        ubuntu:latest       "/bin/bash"         17 minutes ago      Up 3 seconds                            test1

docker stop

  • 起動中のコンテナを停止する
  • コンテナ名 or コンテナID を指定する
$ docker stop {container} [conteiner]

#-----------------------------------------------------
# 例
#-----------------------------------------------------
# 事前条件
$ docker ps

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
76368d6f5feb        ubuntu:latest       "/bin/bash"         31 minutes ago      Up 10 seconds                           test2
ce64ec84b470        ubuntu:latest       "/bin/bash"         32 minutes ago      Up 3 seconds                            test1

# コマンド実行
$ docker stop test2
$ docker ps -a
# test2 が停止する
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                     PORTS               NAMES
76368d6f5feb        ubuntu:latest       "/bin/bash"         32 minutes ago      Exited (0) 7 seconds ago                       test2
ce64ec84b470        ubuntu:latest       "/bin/bash"         32 minutes ago      Up 33 seconds                                  test1

docker restart

  • コンテナを再起動する
  • コンテナ名 or コンテナID を指定する
$ docker restart {container}

docker run

重要なコマンドであるため, 使用頻度の高いオプションを含めて細かく解説する.

  • コンテナを作成・起動する
$ docker run [option] {image}[:tag] [コンテナで実行するコマンド]
  • 代表的な option
option 説明
--detach, -d コンテナを生成し、バックグラウンドで実行する
--interactive, -i コンテナの標準入力を開く
--tty, -t 端末デバイスを使う
--name コンテナに名前をつける. 指定しない場合は, 自動で付与される.
--rm コンテナ実行完了後にコンテナを自動で削除する. つまり, exit でコンテナから抜けたときや stop でコンテナを停止した場合に自動で削除される.
--user {ユーザー名}, -u ユーザー名または UID を指定する.
--add-host={ホスト名:IPアドレス} コンテナの /etc/hosts にホスト名とIPアドレスを定義する
--net={bridge / none / container: / host} コンテナのネットワークを設定する. bridge(default):ブリッジ接続, none: ネットワークに接続しない, container:[name / id]: 別のコンテナのネットワークを使う, host: ホスト OS のネットワークを使う
--hostname, -h コンテナ自身のホスト名を指定する
--publish, -p {host_port}:{container port} ホストとコンテナのポートマッピング
--env, -e {環境変数} 環境変数を設定する
--volume, -v {host_dir}:{container_dir} コンテナにホストのディレクトリをマウントする
--workdir={パス}, -w コンテナの作業ディレクトリを指定する
詳細な説明
  • -it オプション
    • run コマンドでコンテナのコンソール入出力を端末のコンソールに繋げる場合は -it オプションをつける
#-----------------------------------------------------
# 例
#-----------------------------------------------------
# -it オプションをつけた場合 --> root で稼働したコンテナのコンソールに入れる
$ docker run -it --name ubuntu1 ubuntu:latest
# 以下も同じ挙動をする
$ docker run -it --name ubuntu1 ubuntu:latest /bin/bash

# -it オプションをつけない場合 --> ホストのコンソールのまま. コンテナは停止状態
$ docker run --name ubuntu1 ubuntu:latest
  • --rm オプション
    • exit でコンテナから抜けたときや stop でコンテナを停止した場合に自動で削除する
  • -p オプション
    • ホストのポートとコンテナのポートをポートフォワーディングする
#-----------------------------------------------------
# 例
#-----------------------------------------------------
# コンテナの80番ポートをホストの8080番ポートに繋げる
$ docker run -it --name ubuntu1 -p 8080:80 ubuntu:latest
  • -v オプション
#-----------------------------------------------------
# 例
#-----------------------------------------------------
# ホストの /mnt/D をコンテナの /D にマウントする
$ docker run -it --name ubuntu1 -v /mnt/D/:/D/ ubuntu:latest

# 結果 --> マウントされる
root@8d13b1b9dee6:/# ls
D  bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

docker attach

  • 稼働中のコンテナの PIC=0 のプライマリプロセスに接続する
    • exit するとコンテンが停止する
$ docker attach {container}

docker exec

  • 稼働中のコンテナで別プロセスを実行
    • exit するとそのプロセスのみが停止する
$ docker exec [オプション] {container} {コンテナで実行するコマンド}

docker status

  • コンテナの稼働状況を確認する
$ docker status {container}

docker top

  • 稼働コンテナのプロセス確認
$ docker top {container}

docker rm

  • 停止中のコンテナを削除する
$ docker rm {container}

5.3 image の保存と再構築

docker build

  • Dockerfile をビルドしてイメージを作成する
    • Dockerfile という名前で定義している場合, パスはファイルの親ディレクトリで良い
$ docker build -t {image_name}:{new_tag_name} {path/for/Dockerfile}
  • 引数を指定する場合  - --build-arg オプションコマンドで Dockerfile 内で ARG として定義した引数に値を設定できる. プリセットされている場合は, 上書きされる
docker build --build-arg USER=SOMEONE

docker commit

  • コンテナからイメージを生成する
  • コンテナ上で実施した設定などを反映した image として保存できる
# 事前条件: ctl+p ctl+q でコンテナから抜ける
$ docker commit {container} {iamge_name}

Dockerfile

  • 作成方法の基本
    • ベースとなるイメージを記録しておく
    • コンテナ内で行った操作を記録しておく
    • 環境変数などの設定を記録しておく
    • 設定を再現するための Dockerfile を記載する
  • 参考
  • Dockerfile の基本構文 bash # Comment {命令} {引数}
  • 命令の一覧
名前 説明
FROM ベースイメージの設定
RUN コマンド実行
CMD コンテナでのコマンド
LABAL ラベルを設定
EXPOSE ポートのエクスポート
ENV 環境変数
ADD ファイル/ディレクトリの追加
COPY ファイルのコピー
ENTRYPOINT コンテナの実行コマンド
VOLUME ボリュームのマウント
USER ユーザーの指定
WORKDIR 作業ディレクトリ
ARG Dockefile 内の変数
ONBUILD ビルド完了後に実行される命令
STOPSIGNAL システムコールシグナルの設定
HEALTHCHECK コンテナのヘルスチェック
SHELL デフォルトのシェルの設定
ARG cuda_version=9.0
ARG cudnn_version=7
FROM nvidia/cuda:${cuda_version}-cudnn${cudnn_version}-devel

# Install system packages
RUN apt-get update && apt-get install -y --no-install-recommends \
      bzip2 \
      g++ \
      git \
      graphviz \
      libgl1-mesa-glx \
      libhdf5-dev \
      openmpi-bin \
      wget && \
    rm -rf /var/lib/apt/lists/*

# Install conda
ENV CONDA_DIR /opt/conda
ENV PATH $CONDA_DIR/bin:$PATH

RUN wget --quiet --no-check-certificate https://repo.continuum.io/miniconda/Miniconda3-4.2.12-Linux-x86_64.sh && \
    echo "c59b3dd3cad550ac7596e0d599b91e75d88826db132e4146030ef471bb434e9a *Miniconda3-4.2.12-Linux-x86_64.sh" | sha256sum -c - && \
    /bin/bash /Miniconda3-4.2.12-Linux-x86_64.sh -f -b -p $CONDA_DIR && \
    rm Miniconda3-4.2.12-Linux-x86_64.sh && \
    echo export PATH=$CONDA_DIR/bin:'$PATH' > /etc/profile.d/conda.sh

# Install Python packages and keras
ENV NB_USER keras
ENV NB_UID 1000

RUN useradd -m -s /bin/bash -N -u $NB_UID $NB_USER && \
    chown $NB_USER $CONDA_DIR -R && \
    mkdir -p /src && \
    chown $NB_USER /src

USER $NB_USER

ARG python_version=3.6

RUN conda config --append channels conda-forge
RUN conda install -y python=${python_version} && \
    pip install --upgrade pip && \
    pip install \
      sklearn_pandas \
      tensorflow-gpu \
      cntk-gpu && \
    conda install \
      bcolz \
      h5py \
      matplotlib \
      mkl \
      nose \
      notebook \
      Pillow \
      pandas \
      pydot \
      pygpu \
      pyyaml \
      scikit-learn \
      six \
      theano \
      mkdocs \
      && \
    git clone git://github.com/keras-team/keras.git /src && pip install -e /src[tests] && \
    pip install git+git://github.com/keras-team/keras.git && \
    conda clean -yt

ADD theanorc /home/keras/.theanorc

ENV LC_ALL=C.UTF-8
ENV LANG=C.UTF-8

ENV PYTHONPATH='/src/:$PYTHONPATH'

WORKDIR /data

EXPOSE 8888

CMD jupyter notebook --port=8888 --ip=0.0.0.0
27
35
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
27
35