Kubernetes勉強の第一弾です。
まずはKubernetesの裏で動いているDockerについて解説します。
なにはともあれ、まずは試してみましょう
KubernetesはDockerのオーケストレーションツールです。(厳密にはDocker以外のコンテナツールも対応)
と言っても「なんじゃそりゃ!」って感じでしょう。
この手の製品は実際に試してみたほうが感覚がわかると思います。また、Kubernetesより先にDockerを使ってみたほうが結果的に理解が深まります。
なので、まずは実際にDockerを触ってみましょう。
以前の記事「Kubernetesのラボ、初期構築」で既に環境を構築している方は、全てコピペで試すことができます。
ちなみに今回は「Node1」を使っていきます。前回の初期構築で既にDockerをインストール済です。
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」を入力して、アクセスしてみます。
上記の画面が表示されたら成功です。先程Dockerでインストールしたnginxが画面を出しています。
何が起こったか
では、何が起こっていたかを解説します。今回実行したコマンドは「docker run」だけなので、このコマンドを実行した結果を解説します。
図を交えて解説します。今回はNode1以外は関係ないので、Node1を拡大して解説します。
ちなみにアプリケーションのアイコンが灰色なのは意図的です。後ほど解説します。
左に「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を使ったことがある方だと理解しやすいかも。
ローカル(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用語。
コンテナとは?
イメージから生成する「アプリケーションの実態」の事です。
イメージは「種」にすぎないので、アプリケーションは実行されていません。
イメージからコンテナを作成することで、初めてコンテナの中でアプリケーションが実行され、サービスを使用することが出来る。
オブジェクト指向の「クラス(イメージ)」と「インスタンス(コンテナ)」みたいなモノです。あれも事前に定義したクラスをインスタンス化してメモリに配置(アロケート)しますよね。
図にするとこんな感じ。
オブジェクト指向のインスタンスと違うのは、コンテナは停止しても残り続けることです。
重要です。コンテナは停止しても残り続けます。
その辺も交えてコンテナを確認してみましょう。
コンテナの確認コマンドは・・・想像できるかと。
イメージの確認は「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の重要な特色なのですが、今は省略します)。
これで演習で使用したイメージとコンテナは全て削除できました!当然同じことを繰り返すことも可能です!
まとめ
今回の演習のまとめは、こんな感じ。
概念的なもの
- Dockerを使用してアプリケーションを動かすには「イメージ」と「コンテナ」を理解する
- イメージ:アプリを起動する「種」。VMでのOVA/OVFみたいなモノ。オブジェクト指向のクラスみたいなモノ。
- コンテナ:イメージから生成する「実際にアプリが動く器」。オブジェクト指向のインスタンスみたいなモノ。
コマンド
- docker run:イメージを取得して、コンテナを作成するお手軽コマンド。
- docker image ls:取得したイメージの一覧
- docker container ls:作ったコンテナの一覧(起動していないコンテナは表示されない)
- docker ps -a:作ったコンテナの一覧(起動していないコンテナも表示される)
- docker stop コンテナID:コンテナの停止
- docker container rm コンテナID:コンテナの削除
- docker rmi イメージ名:イメージの削除
コメント