パート3:サービス
Get Started, Part 3: Services | Docker Documentation
の内容をやります。
コンテンツ
- Docker Hub に公開したイメージがローカルで稼働するか確認する。
- docker-compose.yml を新規作成する。
- Swarm を新規作成する
- Service を新規作成し、立ち上げる
- 複数立ち上げているサービス(Webアプリ)にリクエストを送る。
- docker-compose.yml を変更し、サービスを再デプロイする
- サービスを停止する。
1. Docker Hub に公開したイメージがローカルで稼働するか確認する。
前回でDocker Hub に公開したアプリ/イメージ me/get-started:part2
~/H/docker ❯❯❯ docker run -p 4000:80 me/get-started:part2 * Serving Flask app "app" (lazy loading) * Environment: production WARNING: Do not use the development server in a production environment. Use a production WSGI server instead. * Debug mode: off * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
2.docker-compose.yml を新規作成する。
docker-compose.yml は docker コンテナがどう振舞うべきかを定義するファイルです。
version: "3" services: web: # replace username/repo:tag with your name and image details image: username/repo:tag deploy: replicas: 5 resources: limits: cpus: "0.1" memory: 50M restart_policy: condition: on-failure ports: - "4000:80" networks: - webnet networks: webnet:
3. Swarm を新規作成する
/H/docker2 ❯❯❯ docker swarm init Swarm initialized: current node (q3esrh9syrf5134dhcf3xl3et) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-6bmmslhgt0purgsvaq1uz4t7r0oqbmd05iht2j3n5o1e2wp5he-5i0fetrww3bms4v4r728g21dx 192.168.65.3:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
4. Service を新規作成し、立ち上げる
サービス・スタックを新規作成します。名称はgetstartedlab_web
です。
~/H/docker2 ❯❯❯ ls docker-compose.yml ~/H/docker2 ❯❯❯ docker stack deploy -c docker-compose.yml getstartedlab Creating network getstartedlab_webnet Creating service getstartedlab_web
作成されました。
~/H/docker2 ❯❯❯ docker service ls ID NAME MODE REPLICAS IMAGE PORTS kl4pf7cid63z getstartedlab_web replicated 5/5 me/get-started:part2 *:4000->80/tcp
ps を確認するとレプリカ5個に指定してあるので、プロセスが5個起動している。
~/H/docker2 ❯❯❯ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b0ae52cb76e3 me/get-started:part2 "python app.py" 58 seconds ago Up About a minute 80/tcp getstartedlab_web.3.xc8wyy14dqqix5iajkwhn33gv 6bdac92694f6 me/get-started:part2 "python app.py" 58 seconds ago Up About a minute 80/tcp getstartedlab_web.1.ixvqn01cu5c6anvkvf9bqbrgm 7a54aa9b7958 me/get-started:part2 "python app.py" 58 seconds ago Up About a minute 80/tcp getstartedlab_web.2.ha3vhdc0mb66v9zn4k9dryq32 ee9ade245769 me/get-started:part2 "python app.py" 58 seconds ago Up About a minute 80/tcp getstartedlab_web.5.jxsguzj7tn5eu1utizh6nnl9g 5fd6ee649054 me/get-started:part2 "python app.py" 58 seconds ago Up About a minute 80/tcp getstartedlab_web.4.s7ns8f0n10jlqedajl5jrt8hs
サービススタック名を指定してプロセスを表示することもできる。
~/H/docker2 ❯❯❯ docker service ps getstartedlab_web ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS ixvqn01cu5c6 getstartedlab_web.1 me/get-started:part2 linuxkit-025000000001 Running Running 4 minutes ago ha3vhdc0mb66 getstartedlab_web.2 me/get-started:part2 linuxkit-025000000001 Running Running 4 minutes ago xc8wyy14dqqi getstartedlab_web.3 me/get-started:part2 linuxkit-025000000001 Running Running 4 minutes ago s7ns8f0n10jl getstartedlab_web.4 me/get-started:part2 linuxkit-025000000001 Running Running 4 minutes ago jxsguzj7tn5e getstartedlab_web.5 me/get-started:part2 linuxkit-025000000001 Running Running 4 minutes ago
5. 複数立ち上げているサービス(Webアプリ)にリクエストを送る。
それぞれ違うホストからレスポンスが返却されている。これは、5個立ち上げているコンテナのなかで、リクエストをロードバランシングしているため。ラウンドロビンらしい。
6. docker-compose.yml を変更し、サービスを再デプロイする
レプリカ数を5から3に減らしてみる。
~/H/docker2 ❯❯❯ vim docker-compose.yml ~/H/docker2 ❯❯❯ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b0ae52cb76e3 me/get-started:part2 "python app.py" 22 minutes ago Up 22 minutes 80/tcp getstartedlab_web.3.xc8wyy14dqqix5iajkwhn33gv 6bdac92694f6 me/get-started:part2 "python app.py" 22 minutes ago Up 22 minutes 80/tcp getstartedlab_web.1.ixvqn01cu5c6anvkvf9bqbrgm 7a54aa9b7958 me/get-started:part2 "python app.py" 22 minutes ago Up 22 minutes 80/tcp getstartedlab_web.2.ha3vhdc0mb66v9zn4k9dryq32 ee9ade245769 me/get-started:part2 "python app.py" 22 minutes ago Up 22 minutes 80/tcp getstartedlab_web.5.jxsguzj7tn5eu1utizh6nnl9g 5fd6ee649054 me/get-started:part2 "python app.py" 22 minutes ago Up 22 minutes 80/tcp getstartedlab_web.4.s7ns8f0n10jlqedajl5jrt8hs ~/H/docker2 ❯❯❯ docker stack deploy -c docker-compose.yml getstartedlab Updating service getstartedlab_web (id: kl4pf7cid63za93ycaf2cw9tf) ~/H/docker2 ❯❯❯ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b0ae52cb76e3 me/get-started:part2 "python app.py" 22 minutes ago Up 22 minutes 80/tcp getstartedlab_web.3.xc8wyy14dqqix5iajkwhn33gv 6bdac92694f6 me/get-started:part2 "python app.py" 22 minutes ago Up 22 minutes 80/tcp getstartedlab_web.1.ixvqn01cu5c6anvkvf9bqbrgm 7a54aa9b7958 me/get-started:part2 "python app.py" 22 minutes ago Up 22 minutes 80/tcp getstartedlab_web.2.ha3vhdc0mb66v9zn4k9dryq32 ~/H/docker2 ❯❯❯
7. サービスを停止する。
~/H/docker2 ❯❯❯ docker service ls ID NAME MODE REPLICAS IMAGE PORTS kl4pf7cid63z getstartedlab_web replicated 3/3 me/get-started:part2 *:4000->80/tcp ~/H/docker2 ❯❯❯ docker stack rm getstartedlab Removing service getstartedlab_web Removing network getstartedlab_webnet ~/H/docker2 ❯❯❯ docker service ls ID NAME MODE REPLICAS IMAGE PORTS ~/H/docker2 ❯❯❯ docker swarm leave --force Node left the swarm. ~/H/docker2 ❯❯❯
以上。