Docker memo
目的
初心者目線が書けるのは初心者のうちだけ
わかばちゃん視点大事
そもそも
「Dockerが使えると何がいいの?」
「どんなことができるの?」
どんな人向けの内容にするか?
開発環境としてのDocker導入
参考:
さわって理解するDocker入門
Dockerコンテナの作成、起動〜停止まで
Dockerのコンテナイメージを作成してみよう
Dockerホストを複数サーバで運用しよう
DockerをWebUIで管理しよう(Rancher)
https://gyazo.com/04695a434ade4c499f1dd2bde7e39c4f
KAWAII🐋
アプリをダブルクリックして起動
https://gyazo.com/b2fe64b7eb6ab9ae089826c99ab05040
https://gyazo.com/6ccc1bcfcc0b4357a200d7ec25721156
https://gyazo.com/a30dc8a9d59616a98d5c2c962f24524c
こんな感じになります
https://gyazo.com/40fa3aff1d422b1b5efa694b7c993b3b
Dockerがインストールされたか確認しよう
デーモンが動いてるか確認するコマンドを打ってみましょう
$ docker ps
https://gyazo.com/8948a6c8f56b22751e4d69cb3a4d208d
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
こんな感じに表示されたらデーモンが動いている証拠。
項目しか表示されてないんですけど・・・! これどういう意味があるのか
docker psは、現在起動または存在しているコンテナを表示するコマンドで、今は何も起動していないから、項目のタイトルしか表示されていない。
わかばちゃん:デーモンって何? →解説へ
DockerでHello Worldしてみよう
$ docker run hello-world
https://gyazo.com/a4abfb3f885c6aebf9a444ae0bc59cc7
「hello-worldっていうイメージを見つけられなかった」って言ってるよ
わかばちゃん:なんで?
docker runはイメージからコンテナを起動するコマンド
「docker run hello-world」=「hello-worldというイメージを起動してね」という意味
でもhello-worldというイメージがローカル(自分のPC)の中に見つからなかった(当たり前だね)
わかばちゃん:じゃあどうしたらいいんだ…?インターネットから探してきてダウンロードしてローカルに置くとか?
なんとDockerデーモンが
hello-worldイメージをDocker Hubというところからダウンロードしてきてくれる!
気がきくね!🐟💖
Docker Hubとは? Docker社が運営するPaaS型のDocker Registry
そしてhello-worldイメージからコンテナが起動する
$ docker run hello-world
実行結果はこんな感じ
code:Command line
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
ca4f61b1923c: Pull complete
Digest: sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
For more examples and ideas, visit:
$ docker run
ひとつのコマンドで
イメージの取得
コンテナ起動
両方できるんですね〜🐟ラクチン
コンテナでLinuxを動かしてみよう
基本的なコマンド
イメージの取得(pull)
イメージの一覧表示(images)
コンテナのライフサイクル管理
作成(create) ←
起動(start)
停止(stop)
削除(rm)
存在しているコンテナの一覧表示(ps)
Alpine Linux
コンテナ向けに開発されている軽量Linuxディストリビューションのコンテナ
Alpineのイメージをダウンロードする
code:Command line
$ docker pull alpine
Using default tag: latest
latest: Pulling from library/alpine
2fdfe1cd78c2: Pull complete
Digest: sha256:ccba511b1d6b5f1d83825a94f9d5b05528db456d9cf14a1ea1db892c939cda64
Status: Downloaded newer image for alpine:latest
今までにダウンロードしたイメージ一覧を見る
imagesコマンドで取得済みのイメージ一覧を確認できる
code:Command line
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest e21c333399e0 7 days ago 4.14MB
hello-world latest f2a91732366c 2 weeks ago 1.85kB
ubuntu latest 20c44cd7596f 3 weeks ago 123MB
runコマンドでAlphinを起動し、hello from alpineと表示してみる
$ docker run <イメージ名> <コンテナで起動するコマンド>
code:Command line
$ docker run alpine echo "hello from alpine"
hello from alpine
<コンテナで起動するコマンド>として、echoコマンドを指定したため、コンテナを起動した直後にechoコマンドを実行し、コンテナは終了している。
わかばちゃん:なんでコンテナ終了してしまうん?
本当に終了してるかpsコマンドで確認してみる。
code:Command line
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ちゃんと終了している。
---
これまではコンテナ起動時に1個だけコマンドを実行して、終了する例ばかりだった
コンテナの中で対話的に作業をしたい場合はどうすればいいのん?
runコマンドにオプション -it をつけ、コンテナに接続する
code:Command line
$ docker run -it alpine bin/sh
/#
Alpineにログインした
lsしたら仮想マシンの中が見られる
code:Command line
$ls
Applications Music product
Desktop Pictures pull-request-practice
Documents Public
別窓を立ち上げてdocker psしてみる
code:Command line
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0857844ca604 alpine "bin/sh" 35 seconds ago Up 33 seconds nifty_jang
ちゃんと起動しているのが確認出来る
コンテナを停止するには
を使う
code:Command line
$ docker stop 0857844ca604
0857844ca604
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
stopはコンテナを終了するわけではなく、あくまで停止状態にするだけ
停止したコンテナは、startコマンドで再開可能
停止したコンテナを見るには、$ docker ps -a
code:Command line
$ docker start 0857844ca604
0857844ca604
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0857844ca604 alpine "bin/sh" 8 minutes ago Up 4 seconds nifty_jang
わかばちゃん:なんかログインしてるときとしてないときでコマンド違うから混乱してきたんだが?
コンテナを取得して起動:run
コンテナを起動:start / コンテナを停止:stop
ログイン:attach
ログインしたまま抜ける:controlを押した状態で"P→Q"(dettach)
(ログインしている状態で)ログアウトして停止:exit
コンテナを削除:rm
Google Kubernetes Engineでコンテナ化されたウェブアプリケーションのデプロイ
やってみた
https://gyazo.com/e0517d3dc2a832d6e2b1269565003107
https://gyazo.com/608523fdf524223587933e77e84b23ab
https://gyazo.com/725b7a1be2c1add3de27937829337e48
https://gyazo.com/2825457dd6cf29a43038fdd5a3470831
https://gyazo.com/9840ff1ee3057bdebe32d6628881f84bhttps://gyazo.com/11fd25c332b4acdb716ef24ea915d1d9
https://gyazo.com/06c0f39a8104173ca1d267990f294ee8
export PROJECT_ID="$(gcloud config get-value project -q)"
これでPROJECT_IDに代入して
docker build -t gcr.io/${PROJECT_ID}/hello-app:v1 .
こんな感じでそのまま使えるんだな
ステップ 4: コンテナ クラスタを作成する
次のコマンドを実行して、hello-cluster という名前の 3 ノードクラスタを作成します。
gcloud container clusters create hello-cluster --num-nodes=3
しかしエラーが!
ERROR: (gcloud.container.clusters.create) One of --zone must be supplied: Please specify zone. ふむふむ
--zoneとは・・・
あっこれか
gcloud コマンドライン ツールのデフォルトの設定
次のコマンドを実行してデフォルトの設定値を設定しておくと、gcloud コマンドライン ツールでプロジェクト ID と Compute Engine ゾーン オプションを入力する時間を節約できます。
gcloud config set project PROJECT_ID
gcloud config set compute/zone us-central1-b
zoneはus-central1-bっていうのを使うっぽい
gcloud config set compute/zone us-central1-b これを実行してから gcloud container clusters create hello-cluster --num-nodes=3やると動いた
https://gyazo.com/450aa5749594d04b35d7adfda6b418d8
↑Kubernetes Engineのトップページにhello-clusterができた
ステップ 5: アプリケーションをデプロイする
ポッドってなんや
Kubernetes では、アプリケーションはポッドと表されます。これは、1 つのコンテナ(または密接に結合されたコンテナのグループ)を表す単位です。
へー 1アプリだと思えばいいのかな
ステップ 6: アプリケーションを公開する
kubectl expose deployment hello-world --type=LoadBalancer --port 8080
kubectl get service
EXTERNAL-IPってのが外部 IP
コマンドを実行してすぐはpendingになっていたが、2〜3分待つと表示された
https://gyazo.com/25fbbf6682c025b6809de10333b7930c
https://gyazo.com/de49a21cfbf9dafc9050a5301a740f28
やったね
ステップ 7: アプリケーションをスケールアップする
わかばちゃん:スケールアップとは?
自分で名付けたアプリ名が間違ってたww(hello-web -> 正しくはhello-world)
kubectl scale deployment hello-world --replicas=3
kubectl get deployment hello-world
kubectl get pods
https://gyazo.com/2397c0432de73254470829f82b7638be
おお!
ちゃんとレプリカ様が3つ動いておる
最後に全部消す
ロードバランサーも消す
https://gyazo.com/c88dd93f54d904518e3513893214652a
hello-cluster消えた!
すごいカンタンに消せる
めでたしめでたし
注意事項😵
GCP上に作ったものを完全に消し去らないと、実はしずしずとサーバが起動してて、あとで請求が来た、なんてことがありえます。気をつけてください。
こういう簡単なサンプルアプリでも、ただ単にGCPにクラスタを作って起動してるだけで、1週間で1900円とか普通にいっちゃいます。必ず公式チュートリアルの通りに行ってください。 これは個人の勉強の記録メモです。私自身まだ勉強中なのでメモ書きの中には誤りがあるかもしれません。またバージョンが変わると挙動も変わる可能性があります。何卒ご理解のほどよろしくお願いします。
わかばちゃん: -p <host-port>:<container-port>
ホストポートとコンテナポートってなんやが?
チュートリアルでは基本同じ番号にしてることが多いけど・・
https://pbs.twimg.com/media/DR3qUQoUEAAEaeo.jpg
つづく