[ 言語選択: English ]

1. Docker を利用する前の準備作業

2023年4月からDockerの実行をユーザー権限で行うように変更しました。

変更前は、docker のように特権ユーザーとして実行していましたが、今後は docker と"sudo"を付けずに実行してください。

このために各自の/.profileにDOCKER_HOST環境変数と、/.config/docker/daemon.json ファイルに作業用の領域をNFS以外のファイルシステム上に確保します。

$ ansible localhost -m lineinfile -a "path=~/.profile regexp=\"^export DOCKER_HOST\" line=\"export DOCKER_HOST=unix:///run/user/$(id -u)/docker.sock\""
$ . ~/.profile
$ mkdir -p ~/.config/docker
$ echo "{ \"data-root\":\"/var/tmp/$(id -un)/\" }" | tee ~/.config/docker/daemon.json
$ killall dockerd
$ dockerd-rootless.sh &

2. 公式Dockerチュートリアル: Part2. Sample application

このContainerizing an applicationのページを開いて、説明を読んでください。ただ、ちゃんと読まないと、うまく動かない場合があるので、うまく動くコマンドのリストを掲載しておきます。

ここでの作業は、ゼミ室10にあるThinkPad(192.168.100.21-27)上か、Dockerをインストールした各自持参のPC上で実行してください。

$ cd
$ git clone -b v1 https://github.com/docker-training/node-bulletin-board
$ cd node-bulletin-board/bulletin-board-app
$ docker image build -t bulletinboard:1.0 .
$ docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0
【Note】
"image build"は"build"と省略することができます。
同様に"container run"は、"run"と、"--publish"は"-p"、"--detach"は"-d"と省略することが可能です。

ドキュメントにも書かれていますが、ここまで無事に実行できたら、http://localhost:8000/ にアクセスをして、bulletinboardアプリが稼動していることを確認してください。

OpenVPNを利用している場合には、http://192.168.100.2x:8000/ のように、コマンドを実行したThinkPadのIPアドレスになります。

最後に書かれているコマンドで、強制停止+削除することができます。

$ docker container rm --force bb

この"rm --force"を利用する方法は停止と削除を同時にする方法です。 これと同等の作業を、丁寧に行なう場合には次のように、stopとrmコマンドを順番に実施することになります。

$ docker container run --publish 8000:8080 --detach --name bb bulletinboard:1.0
$ docker container stop bb
$ docker ps -a

最後に実行した ps -a によって、停止しているが状態が保存されているコンテナが表示されます。

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES
cbc4687ae162        bulletinboard:1.0   "npm start"         5 seconds ago       Exited (0) 1 second ago                       bb

この状態ではファイルシステム上に残っているbbイメージを削除する。

$ docker container rm bb

このように実行後に不要なイメージを削除することを防ぐため、停止するとただちにファイルシステムから削除される、--rmオプションを指定してdockerコマンドを実行することができます。

以下は、省略系を使った、より一般的な書き方をしています。

## "--rm"オプションを使用して、docker container runコマンドを実行
$ docker run --rm -p 8000:8080 -d --name bb bulletinboard:1.0

## 起動したコンテナを停止だけする "docker container rm"コマンドは実行していない
$ docker stop bb

## bbコンテナの情報は表示されないことを確認する
$ docker ps -a

起動時に"--rm"を指定しない場合には、停止しても、まだ名前に"bb"を持つコンテナの残骸が残ります。 この状態であれば、改めて"bb"という名前のコンテナを実行することができます。

## 起動
$ docker run -p 8000:8080 -d --name bb bulletinboard:1.0

## 停止
$ docker stop bb

## 名前"bb"のコンテナが停止していることを確認する
$ docker ps -a

## 改めて"bb"という名前のコンテナを実行するが、エラーになることを確認する
$ docker run -p 8000:8080 -d --name bb bulletinboard:1.0

## 停止したコンテナを再起動する場合には、"start"を利用する
$ docker start bb

## コンテナの状態を"ps"で確認する
$ docker ps

## 改めて停止し、rmコマンドで削除すれば、問題なく実行できる
$ docker stop bb
$ docker ps -a
$ docker rm bb
$ docker run -p 8000:8080 -d --name bb bulletinboard:1.0

## 改めてコンテナを停止し、イメージも削除する
$ docker stop bb
$ docker rm bb

このチュートリアルの次にある、Part 4. Share the application では、DockerHubにイメージを登録する方法が説明されています。("gordon"の部分は自分のID情報に変更する点に注意してください。) Deploy to Kubernetes では、Kubernetesでこのbulletinboard:1.0を実行する方法が掲載されています。

DockerHubについては、Docker, Docker Hub, Docker Composer で説明しています。

公式チュートリアルの内容が難しいと感じた場合は無理せずに、次に進んでください。

3. Kubernetesによるbulletinboard:1.0を実行するもう一つの方法

前述の公式チュートリアルでは、https://hub.docker.com/ を利用して、公開リポジトリに bulletinboard:1.0 を登録していました。

ここではDocker Hub互換環境のHarbor(https://inovtst9.u-aizu.ac.jp/ )を利用する方法を紹介します。

3.1. Harborにプロジェクトを作成する

まず自前のDockerコンテナ(bulletinboard:1.0)を登録するための入れ物となるプロジェクトを作成します。

以下では、"s12xxxxx"は自分のAINS IDで読み替えてください。

  1. https://inovtst9.u-aizu.ac.jp/ にアクセスし、AINS-IDとパスワードでログインします。

  2. "+ NEW PROJECT"ボタンを押し、自分のAINS-IDと同じ名前、s12xxxxx、を入力します。Access LevelはPublicにしておきます。

続いて、Thinkpad上のshellにもどり、dockerコマンドを利用して、この作成したプロジェクト、inovtst9.u-aizu.ac.jp/s12xxxxx (プロジェクト名"s12xxxxx"は自分のAINS ID)、に bulletinboard:1.0 を登録します。

まずdocker loginコマンドで、Harborのログイン情報を /root/.docker/config.jsonに登録します。

$ docker login inovtst9.u-aizu.ac.jp
Username: yasu-abe
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

続いて、ログイン情報を利用して、手元でdocker buildしたコンテナのイメージファイルを、Harbor(inovtst9.u-aizu.ac.jp)に転送します。

$ docker tag bulletinboard:1.0 inovtst9.u-aizu.ac.jp/$(id -un)/bulletinboard:1.0
$ docker push inovtst9.u-aizu.ac.jp/$(id -un)/bulletinboard:1.0

docker pushを実行すると、イメージを転送している様子が次のように表示されます。

The push refers to repository [inovtst9.u-aizu.ac.jp/s12xxxxx/bulletinboard]
248fe273fb1c: Pushed
73284181b5e4: Pushed
d5c7192737ed: Pushed
...

エラーが表示されなければ、これでHarborに bulletinboard:1.0 が登録されました。 登録された bulletinboard:1.0 は、Harbor - DockerHub互換環境 の説明を参考に登録されているか確認してください。

ここまでの作業を終えたら、最後に必ず /root/docker/config.json ファイルからID/Passwordの情報を削除してください。

$ docker logout inovtst9.u-aizu.ac.jp

3.2. KubernetesからのHarborの利用

公式チュートリアルの Deploy to Kubernetes では、bb.yamlファイルを準備していました。

ここでは、bb.yamlファイルを元に、Harborに格納したイメージを利用します。

ここから先でも、"s12xxxxx"は自分のAINS IDで読み替えてください。

bb.yamlファイルの内容を次のように変更します。 "s12xxxxx"の部分を自分のAINS-IDで書き換えることを忘れないでください。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: bb-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      bb: web
  template:
    metadata:
      labels:
        bb: web
    spec:
      containers:
      - name: bb-site
        image: inovtst9.u-aizu.ac.jp/s12xxxxx/bulletinboard:1.0
---
apiVersion: v1
kind: Service
metadata:
  name: bb-entrypoint
spec:
  type: LoadBalancer
  selector:
    bb: web
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30001

この編集した bb.yaml ファイルを適用します。

$ kubectl -n $(id -un) apply -f bb.yaml
deployment.apps/bb-demo created
service/bb-entrypoint created

問題がなければ、上記のように2行の"…​ created"メッセージが表示されて終了します。 しばらく時間を空けてから、次のコマンドで動いているサービスを確認します。

$ kubectl -n $(id -un) get svc bb-entrypoint
NAME            TYPE           CLUSTER-IP     EXTERNAL-IP       PORT(S)          AGE
bb-entrypoint   LoadBalancer   10.233.26.95   192.168.100.165   8080:30001/TCP   5m45s

ここでは、EXTERNAL-IPの欄に表示されているIPアドレスを確認します。 この例では"192.168.100.165"ですが、この末尾の数字は違うはずです。

自分の実行結果に表示されたIPアドレスを利用して、次のようなWebブラウザから、Harborに登録したイメージがKubernetes上で動いていることを確認してください。

## 例: 末尾の".161"はそれぞれ違う点に注意することo
$ browse http://192.168.100.161:8080/
## or
$ google-chrome http://192.168.100.161:8080/

以上