Docker/K8S実践コンテナ開発入門@12日目

前回のエラーが無事解消できました。
張り切って以下の続きから実行していきます。

lawrence-twin.hateblo.jp


■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>

うーんダメですね。。。
明日はこのエラー解消を目指します。