# 【勉強メモ】Docker01

目次

# メモ

  • docker swarmを使用したコンテナの構築
  • swarmについて
    • docker自身が提供しているコンテナオーケストレーションエンジン
    • managerがSwarmクラスタを管理、 workerと呼ばれるDockerホストへServiceが保持するコンテナを配置
    • registoryはmanagerとworkerコンテナから参照される
      • Dockerイメージを登録しておき、manager、workerはregistoryからDockerイメージを取得
    • 任意のコンテナをmanagerとして登録docker swarm init
    • docker container exec -it [managerのコンテナ名] docker swarm init
  • nodeの登録
    • docker swarm init実行時にJOINトークンが発行される
    • docker container exec -it [workerに登録したいコンテナ名] docker swarm init
  • nodeの登録がうまくいかない
    • Error response from daemon: rpc error: code = Unavailable desc = grpc: the connection is unavailable
    • portの開放ができていない?
      • 結局バージョンをあげることで解決
  • 関連
  • registryにimageをアップ
    • host側のport番号をタグにつけて
    • docker image push localhost:5000/example/echo:latest
  • registory
    • docker container execでdocker内に入ってレジストリからpush
  • service
    • managerで定義される
    • node内でコンテナをいくつ起動するかを定義
    • よしなに配分される
    • docker container exec -it manager docker service create --replicas 1 --publish 8000:8080 --name echo registry:5000/example/echo:latest
  • スケールする場合
    • docker container exec -it manager docker service scale echo=[スケールする数]
  • swarm cluster > node > container(task)
  • stack
    • serviceをグルーピングした単位
    • Swarm上のCompose
    • docker stackのコマンドで実行
    • stackごとにoverlayネットワークが作成されその中にServiceは存在している
      • 何もせってしなければoverlayネットワークを跨って通信はできない
        • 先にoverlayネットワ^句を作っておいてからそれに所属させれば可能
    • ホストからServiceにどうアクセスするべきか
      • managerにしか配置されていない場合はアクセス可能だが
      • 複数のノードに分散して配置されていserviceに対してはどのようにアクセスするべきなのか
      • host > proxyserver > serviceの構成を取る

  • swarmによるアプリケーション構築
  • overlayの設定
  • mysqlのMaster/Slave構成
    • 環境変数による制御
    • master/slaveでそれぞれ単一のDockerイメージを作成
    • バイナリログの設定
      • https://purple-jwl.hateblo.jp/entry/2017/11/11/211033
    • master/slave間でのレプリケーション設定
      • hostname -iでホストのI`アドレスを取得
    • データベースの起動前に実行が必要なスクリプトなどはentrykitprehookを使う

以下は環境構築までのメモ

docker container exec -it manager docker swarm init
docker container exec -it worker01 docker swarm join --token SWMTKN-1-0z27nrhxpqyp7xqyjsxqla21cixbxuz14suu5eqzds1fyahykd-5lbhsq7bkxohrc254fftftlth manager:2377
docker container exec -it worker02 docker swarm join --token SWMTKN-1-0z27nrhxpqyp7xqyjsxqla21cixbxuz14suu5eqzds1fyahykd-5lbhsq7bkxohrc254fftftlth manager:2377
docker container exec -it worker03 docker swarm join --token SWMTKN-1-0z27nrhxpqyp7xqyjsxqla21cixbxuz14suu5eqzds1fyahykd-5lbhsq7bkxohrc254fftftlth manager:2377
docker container exec -it manager docker node ls
docker container exec -it manager docker network create --driver=overlay --attachable todoapp
docker image push localhost:5000/ch04/tododb
docker container exec -it manager docker stack deploy -c /stack/todo-mysql.yml todo_mysql
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"
docker container exec -it 7fd8a63a8750 docker container exec -it todo_mysql_master.1.xsnwk18yjvltq16d7z8ztquut init-data.sh
docker container exec -it 7fd8a63a8750 docker container exec -it todo_mysql_master.1.xsnwk18yjvltq16d7z8ztquut mysql -u gihyo -pgihyo tododb
mysql> SELECT * FROM LIMIT 1\G
docker container exec -it 4e27b1eaf17e docker container exec -it todo_mysql_slave.1.sxhv1l7fbsxzoz2un1ycogblr
docker container exec -it manager docker stack deploy -c /stack/todo-app.yml todo_app
docker container exec -it manager docker service logs -f todo_app_api
docker image push localhost:5000/ch04/nginx-nuxt:latest
docker container exec -it manager docker stack deploy -c /stack/todo-app.yml todo_app
docker image tag ch04/todoweb:latest localhost:5000/ch04/todoweb:latest
docker image push localhost:5000/ch04/todoweb:latest
docker container exec -it manager docker stack deploy -c /stack/todo-frontend.yml todo_frontend
docker container exec -it manager docker stack deploy -c /stack/todo-ingress.yml todo_ingress
curl http://localhost:8000
curl http://localhost:8000/_nuxt/vendor.02f6d802134b07f9fff1.js

ログの確認 docker exec -it manager docker service logs -f [service名]