読者です 読者をやめる 読者になる 読者になる

フルスタックエンジニアを目指して

いろいろやってみるブログ

ドットインストールの Docker入門 やってきた

はじめに

  • Dockerをドットインストールで勉強し直してきました。

目次

#03 Dockerをインストールしよう

Ubuntu Trustyに、Dockerをインストールします。

  • アップデート
$ sudo apt-get update 
  • dockerのインストール
$ sudo apt-get install docker.io
$ sudo ln -sf /usr/bin/docker.io /usr/local/bin/docker

#06 Containerを操作してみよう

  • ここからは、Docker専用OSであるbargeeに移動して、コマンドの実行をしました。
  • Dockerコンテナを起動するには、「run」コマンドを使用します。
  • イメージ名のあとに実行したいコマンドを指定することで、そのコンテナで実行した結果が出力されます。
[bargee@barge ~]$ docker run centos echo "hello world"
hello world
  • 「ps」コマンドは、現在実行されているコンテナの一覧を表示するものなので、「-a」オプションをつけないと、過去に実行したコンテナは表示されません。
[bargee@barge ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[bargee@barge ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS                      PORTS               NAMES
7627b5330356        centos              "echo 'hello world'"   12 seconds ago      Exited (0) 12 seconds ago                       hungry_bell
  • コンテナを削除するには、rmコマンドを使用します。引数には、コンテナIDを指定します。一意の値が決まれば問題ないので、はじめの3桁くらい指定してあげればOKなようです。
[bargee@barge ~]$ docker rm 762
762
[bargee@barge ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

#07 実行中のContainerを操作しよう

  • docker runに「-d」オプションを付けるとバックグラウンドでコンテナを起動することができます。
  • 例では、「free」というメモリ使用量を表示するコマンドを3秒おきに実行しました。
[bargee@barge ~]$ docker run -d centos free -s 3
121cf2bf56509150788e0d34e5b43e0165ecfa57b27a3c5072946d0400647e23
[bargee@barge ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
121cf2bf5650        centos              "free -s 3"         8 seconds ago       Up 7 seconds                            pensive_yalow
[bargee@barge ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
121cf2bf5650        centos              "free -s 3"         13 seconds ago      Up 12 seconds                           pensive_yalow
  • コンテナIDを指定することで、そのコンテナの実行ログを出力することができます。
[bargee@barge ~]$ docker logs 121cf2bf5650
              total        used        free      shared  buff/cache   available
Mem:        1023228       27800      927568       44084       67860      880048
Swap:        987960           0      987960

              total        used        free      shared  buff/cache   available
Mem:        1023228       27748      927444       44112       68036      880012
Swap:        987960           0      987960
  • 「attach」コマンドを使うことで、指定したコンテナの実行状況を出力させる事ができます。
  • 「--sig-proxy=」オプションは、シグナルをアタッチしているコンテナに渡すかどうかを指定します。
  • --sig-proxy=true -> すべての受信シグナルをプロセスに渡す
  • --sig-proxy=false -> attach 後 Ctrl+C で抜けてもコンテナは実行を続ける
[bargee@barge ~]$ docker attach --sig-proxy=false 121cf2bf5650

              total        used        free      shared  buff/cache   available
Mem:        1023228       35308      919800       44112       68120      872420
Swap:        987960           0      987960

              total        used        free      shared  buff/cache   available
Mem:        1023228       36488      918616       44112       68124      871240
Swap:        987960           0      987960
^C
[bargee@barge ~]$
  • 実行されているdockerコンテナを終了させるには、「stop」コマンドを使用します。
[bargee@barge ~]$ docker stop 121cf2bf5650
121cf2bf5650
[bargee@barge ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[bargee@barge ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                        PORTS               NAMES
121cf2bf5650        centos              "free -s 3"         2 minutes ago       Exited (137) 15 seconds ago                       pensive_yalow
  • 停止しているコンテナを起動するには「start」コマンドを利用します。
[bargee@barge ~]$ docker start 121cf2bf5650
121cf2bf5650
[bargee@barge ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
121cf2bf5650        centos              "free -s 3"         2 minutes ago       Up 5 seconds                            pensive_yalow

#08 ContainerからImageを作ってみよう

  • コンテナをインタラクティブモードで起動して、何か変更を加えたものをイメージとして保存してみます。
  • 今回は、touchコマンドで、「hello.txt」を作成しました。
  • 作成したら、exitコマンドで、コンテナから抜けることができます。
[bargee@barge ~]$ docker run -i -t centos /bin/bash
[root@d5ad00c0ea32 /]#
[root@d5ad00c0ea32 /]#
[root@d5ad00c0ea32 /]# cd ~
[root@d5ad00c0ea32 ~]# touch hello.txt
[root@d5ad00c0ea32 ~]# ls
anaconda-ks.cfg  hello.txt
[root@d5ad00c0ea32 ~]#
[root@d5ad00c0ea32 ~]#
[root@d5ad00c0ea32 ~]# exit
exit
  • 「/bin/bash」を実行したコンテナ「d5ad00c0ea32」をイメージとして保存してみます。
[bargee@barge ~]$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
d5ad00c0ea32        centos              "/bin/bash"         46 seconds ago      Exited (0) 9 seconds ago                         insane_northcutt
121cf2bf5650        centos              "free -s 3"         26 minutes ago      Exited (137) 9 minutes ago                       pensive_yalow
  • イメージとして保存するには、「commit」コマンドを使用します。
  • 引数にはコンテナID、名前を指定します。
  • 名前は、慣習的に「ユーザ名/イメージ名」で指定します。
  • docker imagesでイメージの一覧を見てみると、新しいイメージIDで、イメージが作成されていることがわかります。
[bargee@barge ~]$ docker commit d5ad00c0ea32 naoto/hello
sha256:4b9f1ba195a74454e15dcecef96731bdd2a373d6b916081262d51457b26772e4
[bargee@barge ~]$
[bargee@barge ~]$
[bargee@barge ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
naoto/hello         latest              4b9f1ba195a7        6 seconds ago       196.7 MB
centos              6                   8315978ceaaa        3 weeks ago         194.6 MB
centos              latest              980e0e4c79ec        11 weeks ago        196.7 MB
  • 作成されてたイメージをコンテナとして実行してみると、最初に別イメージ、別コンテナで作成したhello.txtが存在していることがわかります。
[bargee@barge ~]$ docker run -it naoto/hello /bin/bash
[root@4c0567c022a0 /]# cd ~
[root@4c0567c022a0 ~]# ls
anaconda-ks.cfg  hello.txt

#09 Dockerfileを使ってみよう

  • イメージをもとに変更を加えた新しいイメージを自動的に作成することができます。
  • イメージの作成手順は、Dockerfileという構成ファイルに記述します。
  • FROM -> もとになるイメージファイルをしているする
  • MAINTENER -> 慣習的に記述する。名前とメールアドレス程度は書いておくと良いらしい。
  • RUN -> buildされるときに実行される
  • CMD -> run(コンテナ実行)されるときに実行される
[bargee@barge ~]$ vi Dockerfile
[bargee@barge ~]$ cat Dockerfile
FROM centos
MAINTAINER naoto
RUN echo "now loading..."
CMD ["echo", "now running..."]
  • buildコマンドを使って、新しいイメージを作成します。
  • 「-t」オプションでイメージ名を指定できます。
  • 「.」は、Dockerfileの所在を表します。※今回は、カレントディレクト
  • 実行してみると、build中に「now loading...」と出ていることがわかります。
[bargee@barge ~]$ docker build -t naoto/echo .
Sending build context to Docker daemon 7.168 kB
Step 1 : FROM centos
 ---> 980e0e4c79ec
Step 2 : MAINTAINER naoto
 ---> Using cache
 ---> 6f67c12c5618
Step 3 : RUN echo "now loading..."
 ---> Running in 7b396e8425e3
now loading...
 ---> 63161dc62978
Removing intermediate container 7b396e8425e3
Step 4 : CMD echo now running...
 ---> Running in 953b5d630180
 ---> bd028db0142a
Removing intermediate container 953b5d630180
Successfully built bd028db0142a
  • buildが完了すると、新しいイメージが作成されていることがわかります。
  • イメージIDも、元となったcentos:latestとは異なります。
[bargee@barge ~]$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
naoto/echo          latest              bd028db0142a        9 seconds ago       196.7 MB
naoto/hello         latest              4b9f1ba195a7        21 minutes ago      196.7 MB
centos              6                   8315978ceaaa        3 weeks ago         194.6 MB
centos              latest              980e0e4c79ec        11 weeks ago        196.7 MB
  • 「docker run」で新しく作ったイメージを実行すると、Dockerfileで指定した「now running...」が表示されます。
[bargee@barge ~]$ docker run naoto/echo
now running...

#10 Webサーバーを立ち上げてみよう

  • Dockerfileを編集します。
  • ADDは、ファイルを追加するコマンドです。
  • EXPOSEは、ポート開放コマンドです。
[bargee@barge ~]$ vi Dockerfile
[bargee@barge ~]$
[bargee@barge ~]$ cat Dockerfile
FROM centos
MAINTAINER naoto
RUN yum -y install httpd
ADD ./index.html /var/www/html/
EXPOSE 80
CMD ["/usr/sbin/httpd", "-D", "FORGROUND"]
  • 追加するHTMLファイルを作成します。
[bargee@barge ~]$ vi index.html
[bargee@barge ~]$
[bargee@barge ~]$ cat index.html
<html>
hello from docker!
</html>
  • buildします。
[bargee@barge ~]$ docker build -t naoto/httpd .
Sending build context to Docker daemon 8.192 kB
Step 1 : FROM centos
 ---> 980e0e4c79ec
Step 2 : MAINTAINER naoto
 ---> Using cache
 ---> 6f67c12c5618
Step 3 : RUN yum -y install httpd
 ---> Running in 155372d415c6
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
 * base: ftp.iij.ad.jp
 * extras: ftp.iij.ad.jp
 * updates: ftp.iij.ad.jp
Resolving Dependencies
--> Running transaction check
---> Package httpd.x86_64 0:2.4.6-40.el7.centos.4 will be installed
--> Processing Dependency: httpd-tools = 2.4.6-40.el7.centos.4 for package: httpd-2.4.6-40.el7.centos.4.x86_64
--> Processing Dependency: system-logos >= 7.92.1-1 for package: httpd-2.4.6-40.el7.centos.4.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-40.el7.centos.4.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit) for package: httpd-2.4.6-40.el7.centos.4.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit) for package: httpd-2.4.6-40.el7.centos.4.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.4.8-3.el7 will be installed
---> Package apr-util.x86_64 0:1.5.2-6.el7 will be installed
---> Package centos-logos.noarch 0:70.0.6-3.el7.centos will be installed
---> Package httpd-tools.x86_64 0:2.4.6-40.el7.centos.4 will be installed
---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package           Arch        Version                       Repository    Size
================================================================================
Installing:
 httpd             x86_64      2.4.6-40.el7.centos.4         updates      2.7 M
Installing for dependencies:
 apr               x86_64      1.4.8-3.el7                   base         103 k
 apr-util          x86_64      1.5.2-6.el7                   base          92 k
 centos-logos      noarch      70.0.6-3.el7.centos           base          21 M
 httpd-tools       x86_64      2.4.6-40.el7.centos.4         updates       83 k
 mailcap           noarch      2.1.41-2.el7                  base          31 k

Transaction Summary
================================================================================
Install  1 Package (+5 Dependent packages)

Total download size: 24 M
Installed size: 31 M
Downloading packages:
warning: /var/cache/yum/x86_64/7/base/packages/apr-util-1.5.2-6.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for apr-util-1.5.2-6.el7.x86_64.rpm is not installed
Public key for httpd-tools-2.4.6-40.el7.centos.4.x86_64.rpm is not installed
--------------------------------------------------------------------------------
Total                                              7.7 MB/s |  24 MB  00:03
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
 Userid     : "CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>"
 Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
 Package    : centos-release-7-2.1511.el7.centos.2.10.x86_64 (@CentOS)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : apr-1.4.8-3.el7.x86_64                                       1/6
  Installing : apr-util-1.5.2-6.el7.x86_64                                  2/6
  Installing : httpd-tools-2.4.6-40.el7.centos.4.x86_64                     3/6
  Installing : centos-logos-70.0.6-3.el7.centos.noarch                      4/6
  Installing : mailcap-2.1.41-2.el7.noarch                                  5/6
  Installing : httpd-2.4.6-40.el7.centos.4.x86_64                           6/6
  Verifying  : apr-1.4.8-3.el7.x86_64                                       1/6
  Verifying  : httpd-tools-2.4.6-40.el7.centos.4.x86_64                     2/6
  Verifying  : apr-util-1.5.2-6.el7.x86_64                                  3/6
  Verifying  : httpd-2.4.6-40.el7.centos.4.x86_64                           4/6
  Verifying  : mailcap-2.1.41-2.el7.noarch                                  5/6
  Verifying  : centos-logos-70.0.6-3.el7.centos.noarch                      6/6

Installed:
  httpd.x86_64 0:2.4.6-40.el7.centos.4

Dependency Installed:
  apr.x86_64 0:1.4.8-3.el7
  apr-util.x86_64 0:1.5.2-6.el7
  centos-logos.noarch 0:70.0.6-3.el7.centos
  httpd-tools.x86_64 0:2.4.6-40.el7.centos.4
  mailcap.noarch 0:2.1.41-2.el7

Complete!
 ---> 520995e7f14f
Removing intermediate container 155372d415c6
Step 4 : ADD ./index.html /var/www/html/
 ---> 1a415a832e8a
Removing intermediate container 02cbec02c1c5
Step 5 : EXPOSE 80
 ---> Running in a398f8ee5147
 ---> df69aaedb865
Removing intermediate container a398f8ee5147
Step 6 : CMD /usr/sbin/httpd -D FORGROUND
 ---> Running in 8ee1afc06bea
 ---> 8d8f0c6b1c40
Removing intermediate container 8ee1afc06bea
Successfully built 8d8f0c6b1c40
[bargee@barge ~]$
  • コンテナを起動します。
  • 「-p」オプションは、ポートフォワード設定です。ここでは、ホスト側を8080、Dockerマシン側を80で紐付けます。
  • 実際にブラウザでアクセスすると、index.htmlに記載した「hello from docker!」が表示されます。
  • ブラウザでアクセスする場合は、VagrantホストのIPアドレスに対して、ポート8080でアクセスします。
[bargee@barge ~]$ docker run -p 8080:80 -d naoto/httpd
548ef09594f77d73238d7eb72789ac71fc9bd120b3cefc097eb23eda3b1b9909

まとめ

本だけでは腑に落ちていなかった部分がよく理解できた。