sagantaf

なんでも自分の思ったこと、経験したことを書いて生きます。

Docker入門〜基本的な使い方のまとめ

目次



はじめに

Dockerの入門レベルで必要な基本的な使い方をまとめています。
また、Dockerfileの書き方やライフサイクルについても最後の方にまとめています。


Dockerイメージの操作

イメージの取得

user@pc:~$ sudo docker pull nvidia/cuda
Using default tag: latest
latest: Pulling from nvidia/cuda
473ede7ed136: Pull complete
c46b5fa4d940: Pull complete
93ae3df89c92: Pull complete
6b1eed27cade: Pull complete
cb5511f09cc0: Pull complete
4173c1e5c714: Pull complete
221b05733c9e: Pull complete
564d11654322: Pull complete
Digest: sha256:2c7a92b1ca05a770addc715ed247c8235f1d9e96b8b032feaa426cd8f4c7535e
Status: Downloaded newer image for nvidia/cuda:latest



イメージの一覧表示

hoge@PC:~$ docker images
REPOSITORY                                                             TAG                            IMAGE ID            CREATED             SIZE
nvidia/cuda                                                            latest                         1cc6f1613121        6 weeks ago         2.24GB

 -hでヘルプとして使い方を確認できる

hoge@PC:~$ docker images -h
Flag shorthand -h has been deprecated, please use --help

Usage:    docker images [OPTIONS] [REPOSITORY[:TAG]]

List images

Options:
  -a, --all             Show all images (default hides intermediate images)
      --digests         Show digests
  -f, --filter filter   Filter output based on conditions provided
      --format string   Pretty-print images using a Go template
      --no-trunc        Don't truncate output
  -q, --quiet           Only show numeric IDs



イメージの詳細表示

docker inspect [IMAGE ID]
もしくは
docker inspect [REPOSITORY:TAG]

hoge@PC:~$ docker inspect 1cc6f1613121
hoge@PC:~$ docker inspect nvidia/cuda:latest

docker inspect --format=“{{ .[詳細表示の中の項目名]}}” [イメージ名]

infra@P001:~$ sudo docker inspect --format='{{.Created}}' nvidia/cuda:latest
2018-11-13T00:14:31.409404412Z
infra@P001:~$ sudo docker inspect --format='{{.ID}}' nvidia/cuda:latest
sha256:1cc6f16131211806e1bebfc07a11b5a2f59d0bee5529f8743bc6211cc6658e0f



イメージのタグ設定

infra@P001:~$ sudo docker tag nvidia/cuda:latest cuda-test:0.2
infra@P001:~$ sudo docker images
REPOSITORY                                                             TAG                            IMAGE ID            CREATED             SIZE
cuda-test                                                              0.2                            1cc6f1613121        6 weeks ago         2.24GB
nvidia/cuda                                                            latest                         1cc6f1613121        6 weeks ago         2.24GB



イメージの削除

infra@P001:~$ sudo docker rmi nvidia/cuda:latest
Untagged: nvidia/cuda:latest
Untagged: nvidia/cuda@sha256:2c7a92b1ca05a770addc715ed247c8235f1d9e96b8b032feaa426cd8f4c7535e
infra@P001:~$ sudo docker images
REPOSITORY                                                             TAG                            IMAGE ID            CREATED             SIZE
cuda-test                                                              0.2                            1cc6f1613121        6 weeks ago         2.24GB

タグ設定したcuda-testは残る



イメージの作成(Dockerfileから)

docker build -t test ./(Dockerfileが存在するディレクトリ)

書き方は後述




Dockerコンテナの生成、起動、停止


コンテナの状態確認

docker ps
docker ps -a


コンテナの生成

docker create [IMAGE ID]

infra@P001:~$ docker create cuda-test:0.2
f28e686dc171ddeb493928f0a118c0d1c64fce58a14aa330d70c9a84915b39ad
infra@P001:~$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
f28e686dc171        cuda-test:0.2       "/bin/bash"              7 seconds ago       Created                                        kind_khorana

ただ生成するだけで、実行はしない


コンテナの生成と起動

docker run -it --name=[コンテナ名] [コンテナイメージ名] /bin/bash

docker run -it --name="test-login" ubuntu:16.04 /bin/bash

シェルを実行してコンテナの環境にログインできる

-i : コンテナの標準入出力を有効にする
-t:擬似ターミナルを有効にする(ttyの確保)
--name:コンテナに好きな名前をつける


コンテナの削除

docker rm kind_khorana

コンテナの全消しする場合は以下

docker rm $(docker ps -q -a)


停止したコンテナの起動

docker start hoge


稼働しているコンテナの停止

docker stop hoge


バックグラウンド実行
コンテナは、サーバ起動やオンライン処理など一つの処理を実行するために生成されるのが一般的
→バックグラウンドで動かす(シェルでのログインはしない)
→バックグラウンド実行は docker run に -d オプションをつけるだけ

docker run ubuntu:16.04 hoge.sh

hoge.shを実行するためのコンテナということになる


ネットワーク関連の設定をしてコンテナ実行

root@node1:~# docker run -p 8080:80 httpd


-p:ホストのポートとコンテナのポートのマッピング
--expose=:指定したレンジのポートを割り当てる
--dns=XXX.XXX.XXX.XXX:DNSサーバを設定
--add-host=<ホスト名>:<IPアドレス>:コンテナのhostsにホスト名とIPアドレスを指定
--hostname:コンテナ自身のホスト名を指定
--link=<コンテナ名:エイリアス>:他のコンテナからアクセスするときの名前を指定
--net=host:コンテナがホストOSのネットワークを使う → ホストOSに接続できる端末はコンテナにもアクセスできる


共有ディレクトリを指定
ホストOSとコンテナでディレクトリを共有するための設定は-vオプションをつける
 -v [ホストのディレクトリ]:[コンテナのディレクトリ]

docker run -v /home/testprod/:/home/docker_test/ ubuntu


コンテナの稼働状況を見る

docker stats [コンテナ名]

稼働しているDockerコンテナの操作


稼働しているコンテナへの接続

docker attach [コンテナ名]


コンテナ内のプロセスのみ終了
ctl + q を実行すると、コンテナは終了させずに、コンテナ内で動くプロセスのみ終了させることができる(例えば/bin/bashのみ)
bashなどからexitしてしまうとコンテナごと終了してしまう


稼働しているコンテナでプロセスの実行 上記などで終了させたプロセスをもう一度実行したいときなどに使う
実行中のコンテナにログインする時などに使う

docker exec -it [コンテナ識別子] /bin/bash


稼働しているコンテナの状況をtopで確認できる

docker top [コンテナ識別子]


コンテナ名を変更する

docker rename [元の名前] [変更したい名前]


コンテナ差分を確認する コンテナイメージで生成されたときからの環境の差分を表示できる

docker diff [コンテナ識別子]

このdiffを監視しておいて、検知したらイメージを作成する、とすれば変更に対して自動でイメージ作成することができる


生成したコンテナをイメージとして保存する

docker commit [コンテナ識別子] [イメージ名:タグ]

-aで作成者、-mでメッセージを残すことができる


イメージのレイヤー構造を保った形でのイメージ保存&その読み込み

docker save [保持ファイル名] [イメージ名]

読み込みはloadコマンドになる

docker load < [保持ファイル名]


レイヤー構造は保たずにイメージ保存&その読み込み

docker export [コンテナ識別子] > [保持ファイル名]

その読み込みはimportコマンドになる

cat [保持ファイル名] | docker import - [イメージ名:タグ]



Dockerfileについて

Dockerfileの書き方

  • FROMには構築時の元になるイメージを指定する
  • RUNにはコンテナ環境として実行しておきたいコマンドを指定する(インストールや諸処の設定)
  • CMDにはコンテナ実行時に実行したいコマンドを指定する(ただしdocker runに引数があった場合は、CMDのコマンドは実行されない)
  • ENTRYPOINTにはdocker run時に実行されるコマンドを指定する
  • COPYはファイルコピーの元ファイルと先ディレクトリを指定する
  • ADDはCOPYと似ているが圧縮ファイルなどを全て展開した形でコピーする

CMDとENTRYPOINTについて
CMDとENTRYPOINT の両方の記載がある場合は、CMD が ENTRYPOINT に指定したコマンドのオプションとなる
また、コンテナ実行時にオプションがあれば、ENTRYPOINT の引数となる
docker inspectコマンド結果のCmdの部分を確認することで、イメージファイルにて何が実行されるかを事前に把握することが可能


参考ページ

Dockerfile リファレンス — Docker-docs-ja 17.06.Beta ドキュメント

Dockerfile を書くベスト・プラクティス — Docker-docs-ja 17.06.Beta ドキュメント

ライフサイクル

Dockerfileを書く

 vim Dockerfile


イメージをビルドする

 docker build


イメージを確認する

 docker images


コンテナをランする

 docker run


スタートする

 docker start


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

 docker ps
 docker ps -a


ストップする

 docker stop


コンテナ削除する

 docker rm


イメージ削除する

 docker rmi