$ 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 &
1. Docker を利用する前の準備作業
2023年4月からDockerの実行をユーザー権限で行うように変更しました。
変更前は、docker
のように特権ユーザーとして実行していましたが、今後は docker
と"sudo"を付けずに実行してください。
このために各自の/.profileにDOCKER_HOST環境変数と、/.config/docker/daemon.json ファイルに作業用の領域をNFS以外のファイルシステム上に確保します。
2. 公式Dockerチュートリアル: Part2. Sample application
-
オリジナル: 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で読み替えてください。
-
https://inovtst9.u-aizu.ac.jp/ にアクセスし、AINS-IDとパスワードでログインします。
-
"+ 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/
以上