Kubernetes勉強1:Docker概要(まずは試してみる)

この記事は約29分で読めます。
スポンサーリンク

Kubernetes勉強の第一弾です。

まずはKubernetesの裏で動いているDockerについて解説します。

なにはともあれ、まずは試してみましょう

KubernetesはDockerのオーケストレーションツールです。(厳密にはDocker以外のコンテナツールも対応)

と言っても「なんじゃそりゃ!」って感じでしょう。

 

この手の製品は実際に試してみたほうが感覚がわかると思います。また、Kubernetesより先にDockerを使ってみたほうが結果的に理解が深まります。

なので、まずは実際にDockerを触ってみましょう。

以前の記事「Kubernetesのラボ、初期構築」で既に環境を構築している方は、全てコピペで試すことができます。

Kubernetesのラボ、初期構築(前編)
あくまでも試みレベルですが、「Kubernetes勉強記事」の連載を始めてみようと思います。 はじめに ラボの構築について、以下のリンクの記事を参考にさせていただきました。決して全ての手順が私の独自アイデアで完成できた訳ではあり...

 

ちなみに今回は「Node1」を使っていきます。前回の初期構築で既にDockerをインストール済です。

Docker1

nginxを入れてみる

Dockerを使用してnginxをインストールしてみます。

nginxとはオープンソースのウェブサーバーです。Apacheみたいなものです。

(YahooやGoogleみたいにウェブブラウザで画面を表示させるサーバー)

 

sshで「192.168.1.81」にログインします。

root@192.168.1.81's password:
Last login: Fri Dec  7 09:08:12 2018 from test.mylab.local
[root@node1 ~]#

以下のコマンドを実行してください。コピペでも構いません。

docker run -d -p 8880:80 nginx

結果はこんな感じになるはずです。

[root@node1 ~]# docker run -d -p 8880:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
Digest: sha256:5d32f60db294b5deb55d078cd4feb410ad88e6fe77500c87d3970eca97f54dba
Status: Downloaded newer image for nginx:latest
011dde9c4b6974717b0406e13521123db958b7b1e6a19d3143748b8fbf3a2668

「unable」とか言われると不安になりますが、大丈夫です。

 

なんと、これだけでnginxが導入できました。

実際に確認してみます。192.168.1.0/24の端末のブラウザから「http://192.168.1.81:8880」を入力して、アクセスしてみます。

Docker2

上記の画面が表示されたら成功です。先程Dockerでインストールしたnginxが画面を出しています。

何が起こったか

では、何が起こっていたかを解説します。今回実行したコマンドは「docker run」だけなので、このコマンドを実行した結果を解説します。

図を交えて解説します。今回はNode1以外は関係ないので、Node1を拡大して解説します。

ちなみにアプリケーションのアイコンが灰色なのは意図的です。後ほど解説します。

Docker5

左に「Docker Hub」なるものが登場しましたが、今は無視してください。この後すぐに解説します。

ステップ1:イメージを取得する

実行した「docker run」コマンドをもう一度見てみます。

docker run -d -p 8880:80 nginx

 

一番最後に「nginx」を入力してますね。これによって、まずはnginxのイメージを探します

「イメージ」という言葉が出てきました!

この「イメージ」は、Dockerを理解する上で非常に重要な要素です。

(Dockerの重要な構成要素は「イメージ」と「コンテナ」だけです。この2つを理解することがとても重要です)

イメージとは?

実行したいアプリケーションの「種」みたいなものだと思ってください。

  • この中にアプリケーションのバイナリ、設定ファイルなど全てが入っています
  • 仮想マシンのvmdkファイルみたいなモノです
  • もしくはOVF/OVAファイルみたいなモノです

つまり、イメージは、アプリケーションを実行する前のファイルみたいなモノです。

まずはローカル(Node1)の中にイメージがあるかを探しますが、当然ながらありません

なので、インターネットにアクセスして、nginxイメージがあるかを探しに行きます

探しに行く先が「Docker Hub」です。Docker HubのURLを入力する必要はありません。予めデフォルトで入っています。

そして、見つけたらローカルに保存します

この「イメージを見つけて持ってくる」作業のことを「Pull(引っ張ってくる)」と言います。gitを使ったことがある方だと理解しやすいかも。

Docker8

 

ローカル(Node1の中)に取得したイメージは以下のコマンドで確認できます。

docker image ls

Linuxを触ったことがある方だと「ls」のコマンドはご存知でしょう。dockerのimageをlsするって感じです。

ラボ環境のNode1で実行すると以下の結果になるはずです。

[root@node1 ~]# docker image ls
REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
metallb/speaker                             master              a10f2275c88e        3 days ago          39.6MB
metallb/controller                          master              7bfd3521940f        6 days ago          38.7MB
metallb/speaker                             <none>              f326efe67ade        6 days ago          39.6MB
nginx                                       1                   568c4670fa80        10 days ago         109MB
nginx                                       latest              568c4670fa80        10 days ago         109MB
k8s.gcr.io/kube-proxy                       v1.12.3             ab97fa69b926        11 days ago         96.5MB
k8s.gcr.io/pause                            3.1                 da86e6ba6ca1        11 months ago       742kB
quay.io/coreos/flannel                      v0.9.1-amd64        2b736d06ca4c        12 months ago       51.3MB
gcr.io/google-samples/kubernetes-bootcamp   v1                  8fafd8af70e9        2 years ago         211MB

「nginx」のイメージがNode1に存在することがわかります。ちなみにそれ以外にも沢山ありますが、これはKubernetesの初期構築時に入ったものです。

ステップ2:イメージを起動する(コンテナ生成)

上記の「docker run -d -p 8880:80 nginx」を実行すると、自動的にイメージの起動も行われます

これを「コンテナを生成する」と言います。

この「コンテナ」が、イメージの次に重要なDocker用語。

 

コンテナとは?

イメージから生成する「アプリケーションの実態」の事です。

イメージは「種」にすぎないので、アプリケーションは実行されていません。

イメージからコンテナを作成することで、初めてコンテナの中でアプリケーションが実行され、サービスを使用することが出来る。

オブジェクト指向の「クラス(イメージ)」と「インスタンス(コンテナ)」みたいなモノです。あれも事前に定義したクラスをインスタンス化してメモリに配置(アロケート)しますよね。

 

図にするとこんな感じ。

Docker9

オブジェクト指向のインスタンスと違うのは、コンテナは停止しても残り続けることです。

重要です。コンテナは停止しても残り続けます。

その辺も交えてコンテナを確認してみましょう。

コンテナの確認コマンドは・・・想像できるかと。

イメージの確認は「docker image ls」だったので、コンテナは。

docker container ls

ですね!

わかりやすい!

 

・・・実際に実行してみます。

[root@node1 ~]# docker container ls
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS                  NAMES
011dde9c4b69        nginx                                       "nginx -g 'daemon ..."   4 hours ago         Up 4 hours          0.0.0.0:8880->80/tcp   agitated_hodgkin
7a99fc7c912c        gcr.io/google-samples/kubernetes-bootcamp   "/bin/sh -c 'node ..."   21 hours ago        Up 21 hours                                k8s_kubernetes-bootcamp_kubernetes-bootcamp-598f57b95c-mcp6l_default_88cc0fd9-f9ff-11e8-bd32-0050569194d4_0
d4f94c06f343        k8s.gcr.io/pause:3.1                        "/pause"                 21 hours ago        Up 21 hours                                k8s_POD_kubernetes-bootcamp-598f57b95c-mcp6l_default_88cc0fd9-f9ff-11e8-bd32-0050569194d4_0
3c3c062a24fc        2b736d06ca4c                                "/opt/bin/flanneld..."   21 hours ago        Up 21 hours                                k8s_kube-flannel_kube-flannel-ds-tc7lm_kube-system_e1d6d51f-f565-11e8-9654-0050569194d4_2
491163c36525        metallb/speaker                             "/speaker --port=7..."   21 hours ago        Up 21 hours                                k8s_speaker_speaker-hfpsq_metallb-system_24ffa595-f6c7-11e8-9654-0050569194d4_1
554c02c09b72        ab97fa69b926                                "/usr/local/bin/ku..."   21 hours ago        Up 21 hours                                k8s_kube-proxy_kube-proxy-m6hld_kube-system_e1d6e005-f565-11e8-9654-0050569194d4_1
59ca493e97b3        k8s.gcr.io/pause:3.1                        "/pause"                 21 hours ago        Up 21 hours                                k8s_POD_kube-proxy-m6hld_kube-system_e1d6e005-f565-11e8-9654-0050569194d4_1
bc064a583c6e        k8s.gcr.io/pause:3.1                        "/pause"                 21 hours ago        Up 21 hours                                k8s_POD_speaker-hfpsq_metallb-system_24ffa595-f6c7-11e8-9654-0050569194d4_1
f11d0207c11f        k8s.gcr.io/pause:3.1                        "/pause"                 21 hours ago        Up 21 hours                                k8s_POD_kube-flannel-ds-tc7lm_kube-system_e1d6d51f-f565-11e8-9654-0050569194d4_1

ちょっと長いので・・・先程作った「nginx」だけに注目してみましょう。

[root@node1 ~]# docker container ls
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS                  NAMES
011dde9c4b69        nginx                                       "nginx -g 'daemon ..."   4 hours ago         Up 4 hours          0.0.0.0:8880->80/tcp   agitated_hodgkin

「IMAGE」が起動に利用したイメージ名です。「NAMES」は指定しなければ自動的に名前が付きます。それ以外については頃合いを見計らって説明します。

重要なのは「STATUS」です。Upと書いていたら、そのコンテナは可動しているということです。

可動していなければ「Exited」と表示されます。

 

ちなみに、コンテナの確認は「docker container ls」以外にも「docker ps」という確認でも確認できます。Linuxのpsコマンドでプロセス確認するのと似てますね。

でですね、「docker ps -a」もあります。このコマンドで「可動してないコンテナ」も確認することが可能。

[root@node1 ~]# docker ps -a
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS                      PORTS                  NAMES
011dde9c4b69        nginx                                       "nginx -g 'daemon ..."   4 hours ago         Up 4 hours                  0.0.0.0:8880->80/tcp   agitated_hodgkin
7a99fc7c912c        gcr.io/google-samples/kubernetes-bootcamp   "/bin/sh -c 'node ..."   21 hours ago        Up 21 hours                                        k8s_kubernetes-bootcamp_kubernetes-bootcamp-598f57b95c-mcp6l_default_88cc0fd9-f9ff-11e8-bd32-0050569194d4_0
d4f94c06f343        k8s.gcr.io/pause:3.1                        "/pause"                 21 hours ago        Up 21 hours                                        k8s_POD_kubernetes-bootcamp-598f57b95c-mcp6l_default_88cc0fd9-f9ff-11e8-bd32-0050569194d4_0
3c3c062a24fc        2b736d06ca4c                                "/opt/bin/flanneld..."   21 hours ago        Up 21 hours                                        k8s_kube-flannel_kube-flannel-ds-tc7lm_kube-system_e1d6d51f-f565-11e8-9654-0050569194d4_2
491163c36525        metallb/speaker                             "/speaker --port=7..."   21 hours ago        Up 21 hours                                        k8s_speaker_speaker-hfpsq_metallb-system_24ffa595-f6c7-11e8-9654-0050569194d4_1
a103f1cb9200        2b736d06ca4c                                "/opt/bin/flanneld..."   21 hours ago        Exited (1) 21 hours ago                            k8s_kube-flannel_kube-flannel-ds-tc7lm_kube-system_e1d6d51f-f565-11e8-9654-0050569194d4_1
554c02c09b72        ab97fa69b926                                "/usr/local/bin/ku..."   21 hours ago        Up 21 hours                                        k8s_kube-proxy_kube-proxy-m6hld_kube-system_e1d6e005-f565-11e8-9654-0050569194d4_1
59ca493e97b3        k8s.gcr.io/pause:3.1                        "/pause"                 21 hours ago        Up 21 hours                                        k8s_POD_kube-proxy-m6hld_kube-system_e1d6e005-f565-11e8-9654-0050569194d4_1
8033c10da1e5        2b736d06ca4c                                "cp -f /etc/kube-f..."   21 hours ago        Exited (0) 21 hours ago                            k8s_install-cni_kube-flannel-ds-tc7lm_kube-system_e1d6d51f-f565-11e8-9654-0050569194d4_1
bc064a583c6e        k8s.gcr.io/pause:3.1                        "/pause"                 21 hours ago        Up 21 hours                                        k8s_POD_speaker-hfpsq_metallb-system_24ffa595-f6c7-11e8-9654-0050569194d4_1
f11d0207c11f        k8s.gcr.io/pause:3.1                        "/pause"                 21 hours ago        Up 21 hours                                        k8s_POD_kube-flannel-ds-tc7lm_kube-system_e1d6d51f-f565-11e8-9654-0050569194d4_1
b144c9f51196        metallb/speaker                             "/speaker --port=7..."   4 days ago          Exited (255) 21 hours ago                          k8s_speaker_speaker-hfpsq_metallb-system_24ffa595-f6c7-11e8-9654-0050569194d4_0
1b84bbdb66a0        k8s.gcr.io/pause:3.1                        "/pause"                 4 days ago          Exited (255) 21 hours ago                          k8s_POD_speaker-hfpsq_metallb-system_24ffa595-f6c7-11e8-9654-0050569194d4_0
3a70370a9ef5        k8s.gcr.io/kube-proxy                       "/usr/local/bin/ku..."   6 days ago          Exited (255) 21 hours ago                          k8s_kube-proxy_kube-proxy-m6hld_kube-system_e1d6e005-f565-11e8-9654-0050569194d4_0
3d61e3069c85        k8s.gcr.io/pause:3.1                        "/pause"                 6 days ago          Exited (255) 21 hours ago                          k8s_POD_kube-proxy-m6hld_kube-system_e1d6e005-f565-11e8-9654-0050569194d4_0
[root@node1 ~]#

これで「Exited」のコンテナも確認できます。

作ったモノの後処理

さて、Dockerの概要は以上で終了です。

終わる前に、この記事で作ったモノを消しておきましょう。

いつも思うのですが、この手の演習記事って「オブジェクトを作成したまま」で終わる事が多い。初心者は「作成→削除」まで知りたい事が多いのです。

今回の演習で作ったモノは・・・

  • イメージ
  • コンテナ

ですね。

一個一個消していきましょう。

まずはイメージから消してみましょう(失敗します)。

docker rmi イメージ名

今回はnginx:1を消してみます(:1については後述)

[root@node1 ~]# docker rmi nginx:1
Error response from daemon: conflict: unable to remove repository reference "nginx:1" (must force) - container 011dde9c4b69 is using its referenced image 568c4670fa80

怒られました。理由が書いてます。

つまり、コンテナを作ったイメージは(そのままだと)消せないということです。なので、コンテナから削除する必要があります。

nginxのコンテナを削除します。再度コンテナを確認します。

[root@node1 ~]# docker container ls
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS              PORTS                  NAMES
011dde9c4b69        568c4670fa80                                "nginx -g 'daemon ..."   4 hours ago         Up 4 hours          0.0.0.0:8880->80/tcp   agitated_hodgkin
7a99fc7c912c        gcr.io/google-samples/kubernetes-bootcamp   "/bin/sh -c 'node ..."   21 hours ago        Up 21 hours                                k8s_kubernetes-bootcamp_kubernetes-bootcamp-598f57b95c-mcp6l_default_88cc0fd9-f9ff-11e8-bd32-0050569194d4_0
省略

「CONTAINER ID」が011dde9c4b69のコンテナがnginxのコンテナです。「IMAGE」が568c4670fa80であり、この番号がnginx:1のイメージIDと一致するからです。

[root@node1 ~]# docker image ls
REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
metallb/speaker                             master              a10f2275c88e        3 days ago          39.6MB
metallb/speaker                             <none>              f326efe67ade        6 days ago          39.6MB
metallb/controller                          master              7bfd3521940f        6 days ago          38.7MB
nginx                                       1                   568c4670fa80        10 days ago         109MB
k8s.gcr.io/kube-proxy                       v1.12.3             ab97fa69b926        11 days ago         96.5MB
k8s.gcr.io/pause                            3.1                 da86e6ba6ca1        11 months ago       742kB
quay.io/coreos/flannel                      v0.9.1-amd64        2b736d06ca4c        12 months ago       51.3MB
gcr.io/google-samples/kubernetes-bootcamp   v1                  8fafd8af70e9        2 years ago         211MB

なので、011dde9c4b69を消します。

削除には以下のコマンドを使用します。

docker container rm コンテナID

やってみました。

[root@node1 ~]# docker container rm 011dde9c4b69
Error response from daemon: You cannot remove a running container 011dde9c4b6974717b0406e13521123db958b7b1e6a19d3143748b8fbf3a2668. Stop the container before attempting removal or force remove

また怒られました!

・・・どうやらコンテナが起動してると削除できないようです。なので停止しますね。

コンテナの停止は以下のコマンドで行います。

docker stop コンテナ名

やってみます。ついでに「docker ps -a」で止まったことを確認します。

[root@node1 ~]# docker stop 011dde9c4b69
011dde9c4b69
[root@node1 ~]# docker ps -a
CONTAINER ID        IMAGE                                       COMMAND                  CREATED             STATUS                      PORTS               NAMES
011dde9c4b69        568c4670fa80                                "nginx -g 'daemon ..."   4 hours ago         Exited (0) 31 seconds ago                       agitated_hodgkin
7a99fc7c912c        gcr.io/google-samples/kubernetes-bootcamp   "/bin/sh -c 'node ..."   21 hours ago        Up 21 hours                                     k8s_kubernetes-bootcamp_kubernetes-bootcamp-598f57b95c-mcp6l_default_88cc0fd9-f9ff-11e8-bd32-0050569194d4_0
省略

STATUSが「Exited」になりました!

では、コンテナを削除します。

[root@node1 ~]# docker container rm 011dde9c4b69
011dde9c4b69
[root@node1 ~]#

削除できました!

では、イメージを削除します。

[root@node1 ~]# docker rmi nginx:1
Untagged: nginx:1
Untagged: nginx@sha256:5d32f60db294b5deb55d078cd4feb410ad88e6fe77500c87d3970eca97f54dba
Deleted: sha256:568c4670fa800978e08e4a51132b995a54f8d5ae83ca133ef5546d092b864acf
Deleted: sha256:ac0442c0fafd48e24a96fa3099ea7ad20012c8759e1dd03dd387dbfbe382984c
Deleted: sha256:6b9d35d8d75115937cd78da275f527cccef672cbd71f34062dffe2e930fd7e13
Deleted: sha256:ef68f6734aa485edf13a8509fe60e4272428deaf63f446a441b79d47fc5d17d3
[root@node1 ~]# docker image ls
REPOSITORY                                  TAG                 IMAGE ID            CREATED             SIZE
metallb/speaker                             master              a10f2275c88e        3 days ago          39.6MB
metallb/controller                          master              7bfd3521940f        6 days ago          38.7MB
metallb/speaker                             <none>              f326efe67ade        6 days ago          39.6MB
k8s.gcr.io/kube-proxy                       v1.12.3             ab97fa69b926        11 days ago         96.5MB
k8s.gcr.io/pause                            3.1                 da86e6ba6ca1        11 months ago       742kB
quay.io/coreos/flannel                      v0.9.1-amd64        2b736d06ca4c        12 months ago       51.3MB
gcr.io/google-samples/kubernetes-bootcamp   v1                  8fafd8af70e9        2 years ago         211MB
[root@node1 ~]#

削除した瞬間に、何行も「Deleted」が出るのでびっくりしたかもしれませんが、そんなものだと思ってください。(裏ではLayer化されてるからなのですが、そしてDockerの重要な特色なのですが、今は省略します)。

これで演習で使用したイメージとコンテナは全て削除できました!当然同じことを繰り返すことも可能です!

まとめ

今回の演習のまとめは、こんな感じ。

Docker10

概念的なもの

  • Dockerを使用してアプリケーションを動かすには「イメージ」と「コンテナ」を理解する
  • イメージ:アプリを起動する「種」。VMでのOVA/OVFみたいなモノ。オブジェクト指向のクラスみたいなモノ。
  • コンテナ:イメージから生成する「実際にアプリが動く器」。オブジェクト指向のインスタンスみたいなモノ。

 

コマンド

  • docker run:イメージを取得して、コンテナを作成するお手軽コマンド。
  • docker image ls:取得したイメージの一覧
  • docker container ls:作ったコンテナの一覧(起動していないコンテナは表示されない)
  • docker ps -a:作ったコンテナの一覧(起動していないコンテナも表示される)
  • docker stop コンテナID:コンテナの停止
  • docker container rm コンテナID:コンテナの削除
  • docker rmi イメージ名:イメージの削除

コメント

タイトルとURLをコピーしました