Docker/K8S実践コンテナ開発入門@9日目
引き続きDockerの勉強をしていきます。
今回はSwarmやDIND(Docker in Docker)を利用して勉強します。
Dockerを起動
■実行コマンド
コンテナを起動
docker-compose up -d
Conflictのエラーがめっちゃ出る<
Creating registry ... error ERROR: for registry Cannot create container for service registry: Conflict. The container name "/registry" is already in use by container "b611ef6fc0d53768e34da5943e523e25cfa8bfbfc46d47909a4d90bf4f72a5a3". You have to remove (or rename) that container to be able to reuse that name. ERROR: for registry Cannot create container for service registry: Conflict. The container name "/registry" is already in use by container "b611ef6fc0d53768e34da5943e523e25cfa8bfbfc46d47909a4d90bf4f72a5a3". You have to remove (or rename) that container to be able to reuse that name.
以下のコマンドを実行してストップ
dcoker stop <コンテナID>
これで解決した。
■コンテナの状態を確認
docker container ls
■Swarmを初期化する
docker container exec -it manager docker swarm init
■workerにJOINトークンを使う
docker container exec -it worker01 docker swarm join --token SWMTKN-1-0wa67vrbb5fqo99bfkzky5gwavpi5110dw47hkudrqf5sb9m4r-9p80y08srxo3rihis9hf2s122 172.26.0.3:2377 docker container exec -it worker02 docker swarm join --token SWMTKN-1-0wa67vrbb5fqo99bfkzky5gwavpi5110dw47hkudrqf5sb9m4r-9p80y08srxo3rihis9hf2s122 172.26.0.3:2377 docker container exec -it worker03 docker swarm join --token SWMTKN-1-0wa67vrbb5fqo99bfkzky5gwavpi5110dw47hkudrqf5sb9m4r-9p80y08srxo3rihis9hf2s122 172.26.0.3:2377
※IPアドレスではなく、サービス名「manager」でも利用可能
実効後は以下の通りログが出力されました。
Swarmクラスタに参加したってことですかね。
This node joined a swarm as a worker.
■JOINトークン確認
docker container exec -it manager docker node ls
※managerとworkderが合計4行出力されることを確認してOK
DockerレジストリにイメージをPushする
- docker image tagを実行
docker image tag example/echo:latest localhost:5000/example/echo:latest
■registrコンテナにイメージをpush
docker image push localhost:5000/example/echo:latest
Docker imageをPullコマンドを実行
docker container exec -it worker01 docker image pull registry:5000/example/echo:latest
Service
■Serviceの作成
docker container exec -it manager \ docker service create --replicas 1 --publish 8000:8080 --name echo registry:5000/example/echo:latest
途中起動が全然うまくいかなくて以下のエラーが発生
Error response from daemon: rpc error: code = InvalidArgument desc = port '8000' is already in use by service 'echo' (s3o28xu8obm6xcmxky6wcu0gb) as an ingress port
■削除コマンド
docker container exec -it manager docker service ls docker container exec -it manager docker service rm s3o28xu8obm6 ||> ■起動状態を確認 >|| docker container exec -it manager docker service ls
■scaleコマンドでdockerのコンテナ数を増減させる
docker container exec -it manager docker service scale echo=6
■スケールしたコンテナ確認
docker container exec -it manager docker service ps echo | grep Running
■削除コマンド
docker container exec -it manager docker service rm echo
Stack
Service = 1つのアプリケーション
Stack = 複数Service = 複数アプリケーションを扱える
■overlayネットワーク作成
docker container exec -it manager docker network create --driver=overlay --attachable ch03
■overlayネットワークのStack(ch03-webapi.ym)を作成
Stackをデプロイする
ymlファイルは半角スペースの位置が超重要
ちょっとでも見すると以下のエラーが飛んでしまう。(なんかエディタか何か使えば防げるんでしょうか。誰か教えて欲しい)
networks Additional property networks is not allowed
■コマンド
デプロイ後のStackを確認する
docker container exec -it manager docker stack services echo docker container exec -it manager docker stack ps echo
Visualizerで配置されているコンテナを可視化する
■dockersamples/visualizerをデプロイ
docker container exec -it manager docker stack deploy -c /stack/visualizer.yml visualizer
■Stackの削除
docker container exec -it manager docker stack rm echo
ServiceをSwarmクラスタ外から利用する
HAProxy(多機能なプロキシサーバ)を利用してnginxに接続するserviceを作成するために、「ch03-ingress.yml」を作成する
また、ch03-webapi.ymlにPORT80の設定を追加
■deploy
docker container exec -it manager docker stack deploy -c /stack/ch03-webapi.yml echo docker container exec -it manager docker stack deploy -c /stack/ch03-ingress.yml ingress
■表示コマンド
docker container exec -it manager docker service ls crul http://localhost:8000/
これでDINDなど諸々必要な構成ができました。
今度は実践的なWebアプリケーションの章に移ります。
※Swarmなので最近は使わないかもしれませんが、一応やっておこうかと思います。