Docker ハンズオン - 基本コマンド編

  • 163
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

Docker ハンズオン - 基本コマンド編

Docker コマンドを実際に実行してもらうために作った資料になります。

目的

Docker? なにそれ美味しいの?
Docker? 便利そうだけどお高いんでしょ?
という方々にDocker のコマンドをひと通り実行してもらうための手順になります。

環境

ソフトウェア バージョン
OS CentOS Linux release 7.1.1503 (Core)
Docker 1.8.1

ハンズオンの前にさらっとお勉強

Docker とは?

Docker は、コンテナ技術を使い、アプリケーションの開発・実行をするためのプラットフォームです。
※くわしくはWhat is Docker? をお読みください。

コンテナとは?

コンテナ化とは、ホストOS 上のkernel を使い、複数のルート・ファイルシステムを実行することです。

  • 各々のファイルシステムをコンテナと呼びます。
  • 各々のコンテナは自身のリソースを持ちます。

ココらへんを参考にしてあります。

ここで大事なのはホストOS 上のkernel を使用しているということです。つまりカーネルの違うOS でbuild されたコンテナは動かすことができません。
Docker もまた然り

ハンズオン手順

  • Docker のインストール
  • Docker の起動
  • イメージ取得・確認
  • コンテナの起動・プロセスの確認・停止
  • コンテナの詳細情報確認
  • コンテナの削除
  • イメージの変更・保存
  • イメージの削除
  • Dockerfile でコンテナ構築
  • レポジトリへのイメージ登録

Docker のインストール

手順は公式サイトから。(Win, Mac その他のインストール手順も乗っています。)

$ wget -qO - https://get.docker.com/ | sh
$ curl -sSL https://get.docker.com/ | sh

上記どちらかのコマンドでシェルを実行するだけでDocker が実行できる環境が整います。

Docker の起動

$ systemctl start docker

※ centos7 での起動方法になります。他の環境の際には環境にあった起動をお願いします。

ここまででDocker を実行するための環境が整いました。
以降から、Docker コマンドを実際にたたいていきます。

イメージ取得・確認

docker search

Usage:  docker search [OPTIONS] TERM

Docker Hub 上のイメージを探すコマンド。
今回はCentOS のイメージを探してみます。

$ docker search centos
  # NAME                            DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
  # centos                          The official build of CentOS.                   1288      [OK]
  # ansible/centos7-ansible         Ansible on Centos7                              54                   [OK]
  # jdeathe/centos-ssh-apache-php   CentOS-6 6.6 x86_64 / Apache / PHP / PHP m...   11                   [OK]
  # blalor/centos                   Bare-bones base CentOS 6.5 image                9                    [OK]

CentOS から公式レポジトリとしてcentos が提供されていることがわかります。CentOS7 上でAnsible のレポジトリがansible から提供されていることなどもわかります。
イメージにはタグが付いていることもあるのですが、ここでは確認することができません。Docker Hub 上のレポジトリで確認するしかできない?

docker pull

Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Docker Hub や他のレジストリからイメージをダウンロードするコマンド。
今回はホストと同じCentOS Linux release 7.1.1503 を取得してみます。

$ docker pull centos:7.1.1503
  # 7.1.1503: Pulling from library/centos
  # f1b10cd84249: Pull complete
  # c43c1996cf18: Pull complete
  # f1dade627e25: Already exists
  # library/centos:7.1.1503: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
  # Digest: sha256:81254d2112bb3b3850b158b3f8ff7177481bc15e984b55b73e7b218f1458b3f8
  # Status: Downloaded newer image for centos:7.1.1503

docker images

Usage:  docker images [OPTIONS] [REPOSITORY]

Docker コンテナの一覧を表示するためのコマンド。

$ docker images
  # REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  # centos              7.1.1503            f1dade627e25        4 months ago        212.1 MB

先ほどpull してきたcentos:7.1.1503 だけあることがわかります。

イメージの取得・確認については終了になります。
ここで実行したコマンドをまとめると

docker search でイメージを検索して、
docker pull でイメージを取得して、
dokcer images でイメージが取得できていることの確認。

以上になります。

コンテナの起動・プロセスの確認・停止

docker run

Usage:  docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

Docker コンテナの起動のためのコマンド。

最初に画面に「Hello Docker」と表示するコンテナを起動してみます。

$ docker run centos:7.1.1503 echo "Hello Docker"
  # Hello Docker

画面に「Hello Docker」が表示されました。
このコンテナは echo "Hello Docker" を実行して終了しています。
この時、ローカルにイメージが存在しない場合、自動的に Docker Hub からイメージを取得した後、コンテナを起動します。

docker run を実行するときに-i-t のオプションをつけるとターミナルでコンテナを実行することができます。

$ docker run -i -t centos:7.1.1503 /bin/bash
[root@6bfc1d3dce46 /]$ uname -a
  # Linux 6bfc1d3dce46 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

exit を入力すると、ターミナルを終了し、ホストターミナルに戻ります。
ただし、ターミナルを終了した場合、コンテナも停止します。
コンテナを停止せずにターミナルを抜けるにはCTRL + p + q で抜けます。

docker ps

Usage:  docker ps [OPTIONS]

Docker コンテナの一覧を表示するためのコマンド。
オプションを指定しないでdocker ps を実行すると 稼働中 のコンテナのみ表示されます。

$ docker ps
  # CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

今はコンテナが起動していないため、なにも表示されません。
停止したコンテナも含めて表示したい場合は-a オプションを使います。

$ docker ps -a
  # CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS                     PORTS               NAMES
  # 55ca9592e692        centos:7.1.1503     "/bin/bash"             19 seconds ago      Exited (127) 10 seconds ago                        hopeful_engelbart
  # ab9c04bb875c        centos:7.1.1503     "echo 'Hello Docker'"   8 minutes ago       Exited (0) 8 minutes ago                       backstabbing_yalow

先ほど「Hello Docker」を表示したコンテナの情報を見れることがわかります。
※ この時コンテナの名前は指定しないとdocker/pkg/namesgenerator で自動生成されています。_ の後ろは著名な科学者、ハッカーになっています。ソースコードを見るとwikipedia へのリンクも貼ってありますので見ると面白いと思います。

ここまでは、コンテナを実行して終了するか、直接コンテナを操作してきました。
それ以外にも、バッググラウンドまたはデーモンとして実行するデタッチド・モードでの実行ができます。
デタッチド・モードでの実行は-d オプションを使います。

$ docker run -d centos:7.1.1503 ping 127.0.0.1 -c 50
  # 3bc4c7db392b040984bb9d4acaf201fa019a10448dce144feeffe91e98a0892e

デタッチド・モードで実行すると、画面にコンテナID が出力されます。
この、コンテナID はdocker ps を実行したい際に出力されるコンテナID と同一になります。
今後、コンテナIDは色々なコマンドで使われます。

$ docker ps
  # CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  # 3bc4c7db392b        centos:7.1.1503     "ping 127.0.0.1 -c 50"   4 seconds ago       Up 3 seconds                            angry_leakey

このコンテナは50回自分自身にping を実行すると自動的に停止します。
デタッチドモードで起動しているコンテナにはアタッチすることができます。

docker attach

Usage:  docker attach [OPTIONS] CONTAINER

起動中のコンテナにアタッチするコマンド。
コンテナにアタッチすると、バックグラウンドで実行しているコンテナをフォアグラウンドにします。
ターミナルにはPID 1 のプロセスの出力が表示されます。
ターミナルから抜ける際にCTRL + p + q ではなく、CTRL + c またはexit で抜けてしまった際にはプロセスと一緒にコンテナも停止してしまいます。

$ docker run -d centos:7.1.1503 ping 127.0.0.1 -c 50
  # 038437cdf8c096c1d22452f81d4f156d6fd4592b1884fd1957b2acc8abb7d0ee
$ docker attach 038437cdf8c096c1d22452f81d4f156d6fd4592b1884fd1957b2acc8abb7d0ee
  # 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.040 ms
  # 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.041 ms
  # ...
  # 64 bytes from 127.0.0.1: icmp_seq=49 ttl=64 time=0.038 ms
  # 64 bytes from 127.0.0.1: icmp_seq=50 ttl=64 time=0.048 ms
  # 
  # --- 127.0.0.1 ping statistics ---
  # 50 packets transmitted, 50 received, 0% packet loss, time 48999ms
  # rtt min/avg/max/mdev = 0.017/0.031/0.059/0.012 ms

docker exec

Usage:  docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

起動中のコンテナに追加プロセスを実行するコマンド。
典型的な使い方は、ターミナルへのアクセスになります。
docker attach とは違い、ターミナルを終了しても、コンテナを停止しません。

$ docker run -d nginx
  # ceee8e94971c70b53d62abde824778af79c85c6caf7f66cc1320e035fe02df03
$ docker exec -i -t ceee8e94971c70b53d62abde824778af79c85c6caf7f66cc1320e035fe02df03 /bin/bash
root@ceee8e94971c:/# ps -el
  # F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
  # 4 S     0     1     0  0  80   0 -  7874 sigsus ?        00:00:00 nginx
  # 5 S   104     6     1  0  80   0 -  7968 ep_pol ?        00:00:00 nginx
  # 4 S     0     7     0  0  80   0 -  5052 wait   ?        00:00:00 bash
  # 0 R     0    11     7  0  80   0 -  2268 -      ?        00:00:00 ps
root@ceee8e94971c:/# exit
  # exit
$ docker ps
  # CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  # ceee8e94971c        nginx               "nginx -g 'daemon off"   2 minutes ago       Up 2 minutes        80/tcp, 443/tcp     pensive_ptolemy

この通りexit をしても、コンテナは停止しません。

docker logs

Usage:  docker logs [OPTIONS] CONTAINER

コンテナのlog を表示するコマンド。
表示されるlog はコンテナが作成されてからのPID 1 のあらゆる標準出力が表示されます。

$ docker run -d centos:7.1.1503 ping 127.0.0.1 -c 5
  # f90abb628b712fb24592d55480785d84239ee039f1373e574ccb8a3ddab7f97a
$ docker ps
  # CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
$ docker logs f90abb628b712fb24592d55480785d84239ee039f1373e574ccb8a3ddab7f97a
  # PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
  # 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.044 ms
  # 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.035 ms
  # 64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.053 ms
  # 64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.019 ms
  # 64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.039 ms
  # 
  # --- 127.0.0.1 ping statistics ---
  # 5 packets transmitted, 5 received, 0% packet loss, time 3999ms
  # rtt min/avg/max/mdev = 0.019/0.038/0.053/0.011 ms

よく使われるオプションとして、-f--tail があります。
-f: 直近のログを表示し続ける。Linux のtail -f コマンドと類似。
--tail : ログの末尾から「何」行目を指定して表示できる。

docker stop / docker kill

Usage:  docker stop [OPTIONS] CONTAINER [CONTAINER...]
Usage:  docker kill [OPTIONS] CONTAINER [CONTAINER...]

両方共コンテナを停止するためのコマンド。
docker stop はメインのコンテナ・プロセスに SIGTERM を送信後、一定期間が経過したらSIGKILL を送信。期間の指定は-f を使用。(デフォルトは10秒)
docker kill はメインのコンテナ・プロセスにSIGKILL を直ちに送信。

docker start

Usage:  docker start [OPTIONS] CONTAINER [CONTAINER...]

停止したコンテナを再起動するコマンド。
コンテナは以前に指定したものと同じオプションで起動。-a でアタッチすることが可能。

$ docker run -d centos:7.1.1503 ping 127.0.0.1 -c 100
  # b1faa73c450331504f217c13819029274424be422342d9f8bb3c54d999a124c3
$ docker logs -f b1faa73c450331504f217c13819029274424be422342d9f8bb3c54d999a124c3
  # PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
  # 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.060 ms
  # 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.038 ms
  # ...
$ docker stop b1faa73c450331504f217c13819029274424be422342d9f8bb3c54d999a124c3
  # b1faa73c4503
$ docker start -a b1faa73c450331504f217c13819029274424be422342d9f8bb3c54d999a124c3
  # PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
  # 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.028 ms
  # 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.041 ms
  # ...

長かったですが、これでひと通りのコンテナの起動・プロセスの確認・停止については終了になります。

ここで実行したコマンドをまとめると

docker run でコンテナの起動をして、
docker ps でコンテナの一覧を表示して、
docker attach でコンテナにアタッチするか、
docker exec でコンテナに追加プロセスを実行させターミナルへアクセス。
docker logs でコンテナのlog を表示し、
docker stop /kill  でコンテナの停止、
docker start で停止したコンテナの再開。

以上になります。
ただ、ここで実行したコマンドにはたくさんのオプションがあります。
ぜひ、自分で色々と試してみてください。

コンテナの詳細情報確認

docker inspect

Usage:  docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE...]

コンテナに関する詳細全てを表示するためのコマンド。出力の詳細はJSON 配列。
先ほど使った、b1faa73c450331504f217c13819029274424be422342d9f8bb3c54d999a124c3 コンテナの中身を確認。

$ docker inspect b1faa73c450331504f217c13819029274424be422342d9f8bb3c54d999a124c3
  # [
  # {
  #     "Id": "b1faa73c450331504f217c13819029274424be422342d9f8bb3c54d999a124c3",
  #     "Created": "2015-09-08T13:06:53.616052821Z",
  #     "Path": "ping",
  #     "Args": [
  #         "127.0.0.1",
  #         "-c",
  #         "100"
  #     ],
  #     "State": {
  #         "Running": false,
  #         "Paused": false,
  # ...

特定の項目を見つけるには、パイプでつないでgrep をするか、--format でフォーマットして表示をします。
フォーマットは Go 言語のtext/template を参照してください。

$ docker inspect --format='{{.Args}}' b1faa73c450331504f217c13819029274424be422342d9f8bb3c54d999a124c3
  # [127.0.0.1 -c 100]

JSON 形式で表示するには以下のように実行します。

$ docker inspect --format='{{json .Args}}' b1faa73c450331504f217c13819029274424be422342d9f8bb3c54d999a124c3
  # ["127.0.0.1","-c","100"]

これで、コンテナの詳細情報確認は終了となります。
ここで実行したコマンドをまとめると

docker inspect でコンテナの詳細情報を確認。
--format オプションで、フィルタ、フォーマットを行う。

以上になります。

コンテナの削除

docker rm

Usage:  docker rm [OPTIONS] CONTAINER [CONTAINER...]

コンテナを削除するためのコマンド。
先ほど、使っていたb1faa73c450331504f217c13819029274424be422342d9f8bb3c54d999a124c3 コンテナを削除してみます。

$ docker ps -a | grep 'b1faa73c4503'
  # b1faa73c4503        centos:7.1.1503     "ping 127.0.0.1 -c 10"   37 minutes ago      Exited (0) 36 minutes ago                       sleepy_darwin
$ docker rm b1faa73c450331504f217c13819029274424be422342d9f8bb3c54d999a124c3
  # b1faa73c450331504f217c13819029274424be422342d9f8bb3c54d999a124c3
$ docker ps -a | grep 'b1faa73c4503'

削除されました。
ここで、いつもならまとめに入りますが今回は違います。
docker rm を実行する際には、コンテナID を指定もしますが、停止しているコンテナ全てを削除、コンテナのstatus がexited のもののみ削除、最後に実行したコンテナの削除などを指定したい場合があります。
そこで、docker ps のオプションをもう少しだけ勉強したいと思います。

docker ps -q

コンテナIDのみ表示。
-aq にすることですべてのコンテナID の表示が可能。

docker ps --filter='status=exited'

--filter オプションを使うことでフィルタリングすることもできます。
この例ですと、status がexited のコンテナのみ表示されます。

docker ps -l

最後に実行したコンテナの表示。

ここで紹介したようなdocker ps コマンドのオプションを使うことによって、1つ1つコンテナを指定するのではなく、いっぺんにコンテナの削除をすることが可能になります。
例として、status がexited のコンテナ(停止したコンテナ) のみ削除します。

$ docker run -d centos:7.1.1503 ping 127.0.0.1 -c 200
  # 3b557c8a26e369f40e8435656a473398e624db39ba502930469d983da3dff6e0
$ docker ps
  # CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  # 3b557c8a26e3        centos:7.1.1503     "ping 127.0.0.1 -c 20"   4 seconds ago       Up 3 seconds                            happy_nobel
$ docker ps -a
  # CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
  # 3b557c8a26e3        centos:7.1.1503     "ping 127.0.0.1 -c 20"   9 seconds ago       Up 8 seconds                                     happy_nobel
  # 671d9e6acb16        centos:7.1.1503     "ping 127.0.0.1 -c 5"    2 minutes ago       Exited (0) 2 minutes ago                         tender_kilby
  # bcde82a7bf21        nginx               "nginx -g 'daemon off"   4 minutes ago       Exited (137) 2 minutes ago                       jolly_raman
  # 2f646270433c        centos:7.1.1503     "ping 127.0.0.1 -c 50"   5 minutes ago       Exited (0) 5 minutes ago                         furious_brattain
  # 8cc5871bc318        centos:7.1.1503     "ping 127.0.0.1 -c 50"   6 minutes ago       Exited (0) 5 minutes ago                         prickly_khorana
  # d1a3d3f4d980        centos:7.1.1503     "/bin/bash"              6 minutes ago       Exited (0) 6 minutes ago                         kickass_wilson
  # aa94e9595dd5        centos:7.1.1503     "echo 'Hello Docker'"    6 minutes ago       Exited (0) 6 minutes ago                         sleepy_poincare
$ docker rm $(docker ps -aq --filter='status=exited')
  # 671d9e6acb16
  # bcde82a7bf21
  # 2f646270433c
  # 8cc5871bc318
  # d1a3d3f4d980
  # aa94e9595dd5
$ docker ps -a
  # CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  # 3b557c8a26e3        centos:7.1.1503     "ping 127.0.0.1 -c 20"   51 seconds ago      Up 50 seconds                           happy_nobel

起動中のコンテナを削除しようとするとエラーになります。

$ docker run -d centos:7.1.1503 ping 127.0.0.1 -c 120
  # a8d789407cfbe31f9c5ff37f3107687ad14470b5260267c8bbd258ee1252e714
$ docker ps
  # CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  # a8d789407cfb        centos:7.1.1503     "ping 127.0.0.1 -c 12"   4 seconds ago       Up 3 seconds                            ecstatic_elion
$ docker rm $(docker ps -q)
  # Error response from daemon: Cannot destroy container a8d789407cfb: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f
  # Error: failed to remove containers: [a8d789407cfb]

メッセージに書いてあるように、docker rm-f オプションを付ければ削除できますが起動中のコンテナはdocker stop した後にdocker rm をした方が良いと思います。

これで、コンテナの削除は終了となります。
ここで実行したコマンドをまとめると

docker rm でコンテナの削除。
docker ps コマンドを使ってフィルタリングしたコンテナID の削除ができる。

以上になります。

イメージの変更・保存

コンテナを起動しなおすとコンテナの中身が初期化されることを確認します。
まず、centos:7.1.1503 のコンテナを立ち上げ、/root/hoge.txttouch します。
その後、exit でコンテナを終了します。

$ docker run -i -t centos:7.1.1503 /bin/bash
[root@729cd1f0315a /]$ touch /root/hoge.txt
[root@729cd1f0315a /]$ ls -l /root/hoge.txt
  # -rw-r--r-- 1 root root 0 Sep  9 10:50 /root/hoge.txt
[root@729cd1f0315a /]$ exit
  # exit

再び、centos:7.1.1503 のコンテナを立ち上げ、/root/hoge.txt があるか確認します。

$ docker run -i -t centos:7.1.1503 /bin/bash
[root@78d5ee90a874 /]$ ls -l /root/hoge.txt
  # ls: cannot access /root/hoge.txt: No such file or directory
[root@78d5ee90a874 /]$ exit

ファイルが無いことがわかります。
もう1度 /root/hoge.txttouch します。

$ docker run -i -t centos:7.1.1503 /bin/bash
[root@5023f3c8bedc /]$ touch /root/hoge.txt
[root@5023f3c8bedc /]$ ls -l /root/hoge.txt
  # -rw-r--r-- 1 root root 0 Sep  9 10:54 /root/hoge.txt
[root@5023f3c8bedc /]$ exit
  # exit

docker diff

Usage:  docker diff [OPTIONS] CONTAINER

コンテナへの変更内容を確認するためのコマンド。

docker ps -lq でさきほど実行した、コンテナID を取得し、変更内容を確認します。

$ docker diff $(docker ps -lq)
  # C /root
  # A /root/hoge.txt
  # A /root/.bash_history

/root が変更され、/root/hoge.txt/root/.bash_history が追加されたことが分かります。
※ 先頭のC が変更、A が追加、D が削除を表します。

docker commit

Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

コンテナを変更し新しいイメージを作成するためのコマンドになります。
REPOSITORYDocker Hub ユーザ名/アプリ名 にすると後々Docker Hub へのコミットが楽になります。

先ほどの、/root/hoge.txt を作成したイメージをコミットしてみます。

$ docker commit 5023f3c8bedc hihihiroro/hoge:1.0
8321174ef33803c9423e5c4f4fd5b2cb6da1811208d355f453276ab37132ef49

docker images コマンドでコミットしたイメージができていることが確認できます。

$ docker images
  # REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  # hihihiroro/hoge     1.0                 8321174ef338        3 minutes ago       212.1 MB
  # nginx               latest              cd3cf76a61ee        2 weeks ago         132.8 MB
  # centos              7.1.1503            f1dade627e25        4 months ago        212.1 MB

このイメージを使えば、先ほどcentos:7.1.1503 を実行した時とは違い、コンテナを起動すると/root/hoge.txt が置かれているイメージになっていることが分かります。

$ docker run -i -t centos:7.1.1503 ls -l /root/hoge.txt
  # ls: cannot access /root/hoge.txt: No such file or directory
$ docker run -i -t hihihiroro/hoge:1.0 ls -l /root/hoge.txt
  # -rw-r--r-- 1 root root 0 Sep  9 10:54 /root/hoge.txt

docker history

Usage:  docker history [OPTIONS] IMAGE

イメージの更新内容を確認するためのコマンド。
nginx の更新内容を見てみます。

$ docker history cd3cf76a61ee
  # IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
  # cd3cf76a61ee        2 weeks ago         /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon o   0 B
  # 491aec45eaf8        2 weeks ago         /bin/sh -c #(nop) EXPOSE 443/tcp 80/tcp         0 B
  # 3ac9cfbdf572        2 weeks ago         /bin/sh -c #(nop) VOLUME [/var/cache/nginx]     0 B
  # f9bff7d0d06e        2 weeks ago         /bin/sh -c ln -sf /dev/stderr /var/log/nginx/   0 B
  # 8c7e9b6e3131        2 weeks ago         /bin/sh -c ln -sf /dev/stdout /var/log/nginx/   0 B
  # a53219dc4d2f        2 weeks ago         /bin/sh -c apt-get update &&     apt-get inst   7.671 MB
  # 5dde53921c3f        2 weeks ago         /bin/sh -c #(nop) ENV NGINX_VERSION=1.9.4-1~j   0 B
  # 12a77b8bf89a        2 weeks ago         /bin/sh -c echo "deb http://nginx.org/package   221 B
  # ff0618bc0767        2 weeks ago         /bin/sh -c apt-key adv --keyserver hkp://pgp.   1.997 kB
  # 08ecf065655b        2 weeks ago         /bin/sh -c #(nop) MAINTAINER NGINX Docker Mai   0 B
  # 4a5e6db8c069        2 weeks ago         /bin/sh -c #(nop) CMD ["/bin/bash"]             0 B
  # 2c49f83e0b13        2 weeks ago         /bin/sh -c #(nop) ADD file:b770303e11edaa0ad0   125.1 MB

これで、イメージの変更・保存は終了となります。
ここで実行したコマンドをまとめると

docker diff で元のイメージとの変更の箇所を確認し、
docker commit で新しいイメージの作成をする。
docker history で更新内容の確認をする。

以上になります。

イメージの削除

docker rmi

Usage:  docker rmi [OPTIONS] IMAGE [IMAGE...]

イメージを削除するためのコマンド。

Docker ではコンテナやイメージを削除しないと、ディスクの消費が増えていきエラーになってしまうことがあります。使わなくなったイメージなどは定期的に削除しておくと良いと思います。

以下の例では、nginx のイメージを削除する流れになります。

$ docker images
  # REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  # hihihiroro/hoge     1.0                 8321174ef338        19 hours ago        212.1 MB
  # nginx               latest              cd3cf76a61ee        2 weeks ago         132.8 MB
  # centos              7.1.1503            f1dade627e25        4 months ago        212.1 MB
$ docker rmi cd3cf76a61ee
  # Untagged: nginx:latest
  # Deleted: cd3cf76a61eed2094db241cc47185d04320671b2e5db360baf5956aebdbdf82c
  # Deleted: 491aec45eaf837a2f08212075b17c7b869861dcc26ca99d8827e132657177c49
  # Deleted: 3ac9cfbdf572dd789cac65bfce6141f36564de1bd4266f6b51ae6eb19080a6dc
  # Deleted: f9bff7d0d06e65f89dce91e43caefc3fe090818bae24d67c9732bd4a7ada19dc
  # Deleted: 8c7e9b6e31310dacde0b5a97fd4478a75942ef12bd3753f3ed294a14a0f1c6bb
  # Deleted: a53219dc4d2f5503158eddbec871430dc3f29146fdf9b7b99ce1678484f16902
  # Deleted: 5dde53921c3f1adbee72d4bdf4a67b9a2b361a89304c6f841722b4fa87492ac9
  # Deleted: 12a77b8bf89a61d8bfc52c0ceee37e3e627187330d20bff5b091915a90959a61
  # Deleted: ff0618bc0767411abb6b6f28200a67614fea418483f3faa5d649d92b53627e43
  # Deleted: 08ecf065655b44634e66f45201a7d379d30ba877791b1765322dabf57e993f11
  # Deleted: 4a5e6db8c0693a16de88b7559ded7c1cb804018571b137e13abb1713ce6a71cf
  # Deleted: 2c49f83e0b13f73bf3d276c9fe26ba9aa94d2a1614e866642b95cb0245d0cdab
$ docker images
  # REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  # hihihiroro/hoge     1.0                 8321174ef338        19 hours ago        212.1 MB
  # centos              7.1.1503            f1dade627e25        4 months ago        212.1 MB

docker rmidocker rm と同様に起動中のコンテナで使われているイメージは削除することができません。

$ docker run -d centos:7.1.1503 ping 127.0.0.1 -c 120
  # c8a801a7ffe05cb36fe338445fff2dc9ca7a046f22c91e7d868f78ba68d50fe9
$ docker ps
  # CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
  # c8a801a7ffe0        centos:7.1.1503     "ping 127.0.0.1 -c 12"   2 seconds ago       Up 2 seconds                            drunk_khorana
$ docker images
  # REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
  # hihihiroro/hoge     1.0                 8321174ef338        19 hours ago        212.1 MB
  # centos              7.1.1503            f1dade627e25        4 months ago        212.1 MB
$ docker rmi f1dade627e25
  # Error response from daemon: Conflict, cannot delete f1dade627e25 because the running container c8a801a7ffe0 is using it, stop it and use -f to force
  # Error: failed to remove images: [f1dade627e25]

こちらも、-f オプションを付ければ削除することはできますが、起動中のイメージを消すのはやめた方が良いと思います。

これで、イメージの削除は終了となります。
ここで実行したコマンドをまとめると

docker rmi でイメージの削除をする。

以上になります。

Dockerfile でコンテナ構築

Dockerfile とはDocker イメージ構築時の命令を記述した設定ファイルになります。
Dockerfile で使えるコマンドには以下のものがあります。
くわしくはコチラ

コマンド名 説明
FROM ベースイメージの指定
MAINTAINER イメージの作成者
RUN コマンドの実行
CMD docker run 時に起動するコマンド
LABEL コンテナとイメージにユーザ定義の付与できるラベル
EXPOSE コンテナ内のプロセスがListen するポート
ENV 環境変数
ADD HostOS からコンテナへファイルを配置
COPY HostOS からコンテナへファイルを配置
ENTRYPOINT docker run 時に起動するコマンド
VOLUME 外部からマウント可能なボリューム
USER RUN, CMD, ENTRYPOINT を実行するユーザ
WORKDIR 作業ディレクトリ
ONBUILD 次のビルドで実行させるコマンド

今回は、Dockerfile を用いてapache を動かし、動作確認をするまでを試します。

Dockerfile の作成

$ mkdir httpd-work; cd httpd-work
$ cat << EOS > Dockerfile
  FROM centos:7.1.1503
  MAINTAINER hihihiroro@gmail.com

  RUN yum update && yum -y install httpd && yum clean all

  EXPOSE 80

  COPY index.html /var/www/html/index.html
  COPY run-httpd.sh /run-httpd.sh
  RUN chmod -v +x /run-httpd.sh

  CMD ["/run-httpd.sh"]
  EOS
$ echo "docker test apache server." > index.html
$ cat << EOS > run-httpd.sh
  #!/bin/bash

  rm -rf /run/httpd/* /tmp/httpd*

  exec /usr/sbin/apachectl -D FOREGROUND
  EOS

DockerfileCOPY するファイル、実行するコマンドを作成しました。
実際に実行してみます。

docker build

Usage:  docker build [OPTIONS] PATH | URL | -

新しいイメージを作成するためのコマンド。
'hihihiroro/httpd-test' という名前で1.0 のタグが付いたイメージを作成してみます。

$ docker build -t hihihiroro/httpd-test:1.0 .
  # Sending build context to Docker daemon 4.096 kB
  # Step 0 : FROM centos:7.1.1503
  # 7.1.1503: Pulling from library/centos
  # f1b10cd84249: Pull complete
  # c43c1996cf18: Pull complete
  # f1dade627e25: Pull complete
  # library/centos:7.1.1503: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
  # Digest: sha256:4c02104e053f98cb9f9f18871eaa34e65e2dbd78afe5e22500b334b770da7b7c
  # Status: Downloaded newer image for centos:7.1.1503
  #  ---> f1dade627e25
  # Step 1 : MAINTAINER hihihiroro@gmail.com
  #  ---> Running in ea0c121431c3
  #  ...
  # Step 6 : RUN chmod -v +x /run-httpd.sh
  #  ---> Running in 849be47f1acc
  # mode of '/run-httpd.sh' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)
  #  ---> 8bb7346e9632
  # Removing intermediate container 849be47f1acc
  # Step 7 : CMD /run-httpd.sh
  #  ---> Running in 752b4a3c4bdf
  #  ---> 9cd960f26b80
  # Removing intermediate container 752b4a3c4bdf
  # Successfully built 9cd960f26b80

無事にイメージができあがりました。

$ docker images
  # REPOSITORY              TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
  # hihihiroro/httpd-test   1.0                 9cd960f26b80        About a minute ago   330.1 MB
  # centos                  7.1.1503            f1dade627e25        4 months ago         212.1 MB

FROMcentos:7.1.1503 を指定しているので、centos:7.1.1503 のイメージも取得されていることが分かります。

では、作ったイメージをdocker run で動かしてみようと思います。

docker run -d -p 80:80 hihihiroro/httpd-test:1.0
  # 5e918f6f9afbc26582dfd11af88d9cbae4c60dff570af2472c5efca9f168150c

ここで使っている-p オプションはホスト側とコンテナ側のポートをマッピングするためのオプションになります。
使い方は、-p ホスト側IP:コンテナ側IP になります。

docker port

Usage:  docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]

コンテナ側のポートがホスト側のどのポートにマッピングされているか調べるコマンドになります。

$ docker port $(docker ps -q) 80
  # 0.0.0.0:80

-p オプションで指定した通りに、コンテナ側の80番ポートがホスト側の80番ポートにマッピングされていることが分かります。

コンテナが指定した、index.html で動いていることを確認します。

$ curl http://xxx.xxx.xxx.xxx
  # docker test apache server.

指定した通りのindex.html が表示されています。
これで、Dockerfile でコンテナ構築は終了となります。
ここで実行したことをまとめると

Dockerfile を作成し、
docker build でイメージを作成。
docker run で作成したイメージを実行。

以上になります。

レポジトリへのイメージ登録

いよいよ最後になります。

docker login

Usage: docker login [OPTIONS] [SERVER]

レポジトリサーバへログインするためのコマンドになります。
[SERVER] を指定していない時はDocker Hub に接続します。

$ docker login
$ Username: hihihiroro
$ Password:
$ Email: hihihiroro@gmail.com
  # Login Succeeded

docker push

Usage:  docker push [OPTIONS] NAME[:TAG]

イメージやレポジトリをレジストリに登録するためのコマンドになります。
実際に、作ったapache のイメージをDocker Hub に登録してみます。

docker push hihihiroro/httpd-test:1.0
  # The push refers to a repository [docker.io/hihihiroro/httpd-test] (len: 1)
  # 9cd960f26b80: Image successfully pushed
  # 8bb7346e9632: Image successfully pushed
  # 489686ede596: Image successfully pushed
  # d22e71b95cfc: Image successfully pushed
  # f33c519ac00e: Image successfully pushed
  # b097e847ed78: Image successfully pushed
  # 14fc6e4ee97a: Image successfully pushed
  # 9747ba9c2882: Image successfully pushed
  # f1dade627e25: Image already exists
  # c43c1996cf18: Image successfully pushed
  # f1b10cd84249: Image already exists
  # 1.0: digest: sha256:a8b08735924a454417358fa33002ee901f49f41ec6cdac4d2e5310d15dd5a6a6 size: 19761

これで、レポジトリへのイメージ登録は終了となります。
ここで実行したコマンドをまとめると

docekr login でレポジトリにログインし、
docker push でイメージをレポジトリに登録する。

今回は、apache を自分でインストールしましたが、Docker Hub 上にはApache が提供しているオフィシャルのイメージが登録されています。
他にも様々な、ミドルウェアやデータベースなど幅広いイメージが登録されています。

ハンズオン手順は以上で終了となります。
使ってないオプションがいっぱいあります。是非自分でどんどん試してみてください。
おつかれさまでした。

参考