Docker/K8S実践コンテナ開発入門@12日目
前回のエラーが無事解消できました。
張り切って以下の続きから実行していきます。
■Masterコンテナ接続便利コマンド
docker container exec -it manager \ docker service ps todo_mysql_master \ --no-trunc \ --filter "desired-state=running"\ --format "docker container exec -it {{.Node}} docker container exec -it {{.Name}}.{{.ID}} bash"
■上記コマンドで得たコマンドを元にinit処理を実行
docker container exec -it 9faf7c495460 docker container exec -it todo_mysql_master.1.d7td2drn8zixlvmc7ypnt0h7m init-data.sh
■mysql接続
docker container exec -it 9faf7c495460 docker container exec -it todo_mysql_master.1.d7td2drn8zixlvmc7ypnt0h7m mysql -u gihyo -pgihyo tododb
■init結果確認
select * from todo LIMIT 1\G
ここまではOK です。
次にslaveコンテナも想定どおりか確認します。
■Slaveコンテナ接続便利コマンド
docker container exec -it manager \ docker service ps todo_mysql_slave \ --no-trunc \ --filter "desired-state=running"\ --format "docker container exec -it {{.Node}} docker container exec -it {{.Name}}.{{.ID}} bash"
■slaveコンテナ接続
docker container exec -it c48536c0b727 docker container exec -it todo_mysql_slave.1.pl0m9fmxd0e9ymve619gidecd mysql -u gihyo -pgihyo tododb docker container exec -it df3dbe8791b9 docker container exec -it todo_mysql_slave.2.r51czl63qbtoxd6jzmsa4nyc9 mysql -u gihyo -pgihyo tododb
Slaveも問題ないですね。
API Serviceの構築
続いて、TODOアプリのドメイン作業を実施します。
■git clone
git clone https://github.com/gihyodocker/todoapi
諸々説明が載っています。
Dockerfileを元にimageビルドをします。※既に作成済みのためさほど時間は掛からない。
■ビルドコマンド(ビルド、タグ付、push)
docker image build -t ch04/todoapi:latest . docker image tag ch04/todoapi:latest localhost:5000/ch04/todoapi:latest docker image push localhost:5000/ch04/todoapi:latest
Swarm上でtodoapiサービスを実行する。書籍に従って、「todo-api.yml」を作成します。
作成できたら以下のコマンドでデプロイを実行
■deployコマンド
docker container exec -it manager docker stack deploy -c /stack/todo-app.yml todo_app
■deploy後の確認
lawrence@Chocolate stack % docker container exec -it manager docker service logs -f todo_app_api todo_app_api.1.9vbgpx3l81kt@3ba03a14938b | 2020/05/07 04:14:26 Listen HTTP Server todo_app_api.2.du5461wtuzvf@c48536c0b727 | 2020/05/07 04:14:26 Listen HTTP Server
ログ上は問題ないですね。引き続きapiを処理していきます。
Nginxの構築
WebからAPI側へのリクエストを転送するために利用するためにNginxを起動します。
書籍にもあるが、WebやAPIの前にNginxなどのWebサーバを配置しておく理由としては以下のメリットがあるとのこと
- アクセスログの取得しやすさ
- キャッシュ制御
- アプリケーションに手を加えずに任意のルーティングが可能
では引続きgit cloneを取得していきます。
■git clone取得コマンド
コラムとして載っていた内容として、
「Dockerでは、挙動を変えたい部分はとりあえず環境変数かし、
デフォルト値を設定するようにする癖をつけておきましょう。
entrykitなど環境変数を設定するための補助ツールも充実しています。」
■Nginxのイメージビルド(ビルド、タグ付、push)
docker image build -t ch04/nginx:latest . docker image tag ch04/nginx:latest localhost:5000/ch04/nginx:latest docker image push localhost:5000/ch04/nginx:latest
その後Nginxを通して接続できるように、todo-app.ymlにnginxの定義追加した後
以下のコマンドを実行します。
■コマンド
docker container exec -it manager docker stack deploy -c /stack/todo-app.yml todo_app
Webの構築
■webのclone取得
git clone https://github.com/gihyodocker/todoweb
■Webのイメージビルド(ビルド、タグ付、push)
docker image build -t ch04/todoweb:latest . docker image tag ch04/todoweb:latest localhost:5000/ch04/todoweb:latest docker image push localhost:5000/ch04/todoweb:latest
ここまでできたら工夫として、Webの前段にNginxを配置する。
public.conf.tmplをコピーしてnuxt.conf.tmplを作成する。
また、DockerfileをコピーしてDockerfile-nuxtも作成します。
その対応が完了したら以下のコマンドを実行します。
■イメージビルド(ビルド、タグ付、push)
docker image tag ch04/nuginx-nuxt:latest docker image tag ch04/nginx-nuxt:latest localhost:5000/ch04/nginx-nuxt:latest docker image push localhost:5000/ch04/nginx-nuxt:latest
Nginxを通してアクセスできるようにする
todo-frontend.ymlを作成します。
作成後は、以下のコマンドでtodo_frontend Stackとしてデプロイします。
■deployコマンド
docker container exec -it manager \ docker stack deploy -c /stack/todo-frontend.yml todo_frontend
Ingressで公開する為に、todo-ingress.ymlを作成し
次のコマンドでデプロイします。
■コマンド
docker \container exec -it manager \ > docker stack deploy -c /stack/todo-ingress.yml todo_ingress
ここまで順調だったのですが、以下のエラーが発生してしまう。
failed to create service todo_ingress_haproxy: Error response from daemon: rpc error: code = InvalidArgument desc = port '80' is already in use by service 'ingress_haproxy' (j10ibz4batsrb6nw4b5mdwms1) as an ingress port
ポートが既に使われているというエラーですが、、、
以下の通り確認したところ、3章で起動したingressサービスが起動しっぱなしが原因のようです。
lawrence@Chocolate stack % docker container exec -it manager docker service ls ID NAME MODE REPLICAS IMAGE PORTS nlbdutgzx20q echo_api replicated 3/3 registry:5000/example/echo:latest icrya7g5b3db echo_nginx replicated 3/3 gihyodocker/nginx-proxy:latest j10ibz4batsr ingress_haproxy global 1/1 dockercloud/haproxy:latest *:80->80/tcp, *:1936->1936/tcp r3hlh4hx49hu todo_app_api replicated 2/2 registry:5000/ch04/todoapi:latest 5v79s465owrv todo_app_nginx replicated 0/2 registry:5000/ch05/nginx:latest eiyz649x3ark todo_frontend_nginx replicated 0/2 registry:5000/ch04/nginx-nnuxt:latest p69cpviaj5w1 todo_frontend_web replicated 0/2 registry:5000/ch04/todoweb:latest itk4waesp12i todo_mysql_master replicated 1/1 registry:5000/ch04/tododb:latest 6mi8jniu37rw todo_mysql_slave replicated 2/2 registry:5000/ch04/tododb:latest o8obnthdcuyb visualizer_app global 3/3 dockersamples/visualizer:latest *:9000->8080/tcp
以下のコマンドを実行することでdeployが正常終了しました。
■削除コマンド
docker container exec -it manager docker service remove ingress_haproxy
では最後に以下のコマンドが稼働するか確認してみます。
■コマンド
lawrence@Chocolate stack % curl -l http://localhost:8000/ <html><body><h1>503 Service Unavailable</h1> No server is available to handle this request. </body></html>
うーんダメですね。。。
明日はこのエラー解消を目指します。