はじまる

適当な事を適当に書く

docker やり直しメモ(3)

パート3:サービス

Get Started, Part 3: Services | Docker Documentation

の内容をやります。

コンテンツ

  1. Docker Hub に公開したイメージがローカルで稼働するか確認する。
  2. docker-compose.yml を新規作成する。
  3. Swarm を新規作成する
  4. Service を新規作成し、立ち上げる
  5. 複数立ち上げているサービス(Webアプリ)にリクエストを送る。
  6. docker-compose.yml を変更し、サービスを再デプロイする
  7. サービスを停止する。

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個立ち上げているコンテナのなかで、リクエストをロードバランシングしているため。ラウンドロビンらしい。

gyazo.com

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

以上。

docker やり直しメモ(2)

パート2:コンテナ

Get Started, Part 2: Containers | Docker Documentation の内容をやります。

コンテンツ

  1. コンテナのイメージを新規作成する
  2. コンテナをフォアグラウンドで起動する
  3. コンテナをバックグラウンドで起動する
  4. コンテナを Dokcer Hub にpush する

1. コンテナのイメージを新規作成する

チュートリアルにあるものを利用します。 Dockerfile + アプリ = イメージです。 イメージを実行状態にしたものがコンテナです。

Dockerfile を新規作成する

空のディレクトリを作成し、その直下に下記のファイルを作成します。Python で書いた Webアプリですね。

Dockerfile

# FROM :ベースとなる既存のdockerイメージをベースに新たにイメージを作成します。イメージは DockerHubから取得されます。
FROM python:2.7-slim

# コンテナの内部の作業ディレクトリを /app に設定します。
WORKDIR /app

# カレントディレクトリの内容をコンテナの内部の /app にコピーします。
ADD . /app

# 必要なライブラリをインストールするコマンドを実行します。
RUN pip install --trusted-host pypi.python.org -r requirements.txt

# コンテナの80番ポートをコンテナ外部に公開します。
EXPOSE 80

# コンテナ内部の環境変数を設定します。
ENV NAME World

# コンテナ起動時に app.py を実行します。
CMD ["python", "app.py"]

アプリを作成する。

Dockerfile と同じディレクトリに、Pyhton のアプリを作成します。必要なライブラリを requirements.txtに記述します。あくまでイメージで必要になるライブラリを定義するために記述しているだけなので、pip install でローカルにインストールする必要はありません。

requirements.txt

Flask
Redis

app.py

from flask import Flask
from redis import Redis, RedisError
import os
import socket

# Connect to Redis
redis = Redis(host="redis", db=0, socket_connect_timeout=2, socket_timeout=2)

app = Flask(__name__)

@app.route("/")
def hello():
    try:
        visits = redis.incr("counter")
    except RedisError:
        visits = "<i>cannot connect to Redis, counter disabled</i>"

    html = "<h3>Hello {name}!</h3>" \
           "<b>Hostname:</b> {hostname}<br/>" \
           "<b>Visits:</b> {visits}"
    return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), visits=visits)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80)

Dockerfile + アプリ = イメージ

現在、当該ディレクトリは下記のような状態になっていると思います。

$ ls
Dockerfile      app.py          requirements.txt

ここで下記のコマンドを実行することで、イメージが新規作成されます。-t はイメージに付加するタグネームです。

docker build -t friendlyhello .

イメージが作成されたかどうか下記のコマンドで確認できます。ここでは friendlyhello があればイメージ作成成功です。

$ docker image ls

REPOSITORY            TAG                 IMAGE ID
friendlyhello         latest              326387cea398

2.コンテナをフォアグラウンドで起動する

作成したイメージをコンテナとして稼働させてみます。

$docker run { REPOSITORY or CONTAINER ID }

でイメージからコンテナを作成します。

~/H/docker ❯❯❯ docker run -p 4000:80 friendlyhello
 * 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)

~/H/docker ❯❯❯ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
ea0dcd8542e0        friendlyhello       "python app.py"     5 seconds ago       Up 11 seconds       0.0.0.0:4000->80/tcp   festive_aryabhata
~/H/docker ❯❯❯

0.0.0.0:4000 でWebアプリが立ち上がってる状態。

gyazo.com

Ctrl+C で doker run のプロセスを止める

~/H/docker ❯❯❯ docker run -p 4000:80 friendlyhello
 * 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)
172.17.0.1 - - [07/Jun/2018 06:07:44] "GET / HTTP/1.1" 200 -
172.17.0.1 - - [07/Jun/2018 06:07:44] "GET /favicon.ico HTTP/1.1" 404 -
172.17.0.1 - - [07/Jun/2018 06:14:10] "GET / HTTP/1.1" 200 -
^C%                                                                                                                                                                                  ~/H/docker ❯❯❯

~/H/docker ❯❯❯ docker ps #プロセスも消えてる
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
~/H/docker ❯❯❯

# localhost:4000 を取得しようしても止まってるのでエラー。
~ ❯❯❯ curl http://localhost:4000
curl: (7) Failed to connect to localhost port 4000: Connection refused

3.コンテナをバックグラウンドで起動する

今度は同じコンテナをバックグラウンドで起動してみる。

#コンテナをバックグラウンド -d で実行
~/H/docker ❯❯❯ docker run -d -p 4000:80 friendlyhello
ba8ca7d291674ff232cb40da3da63a56a998f852e90b088a45ae1e4471943476
~/H/docker ❯❯❯

#プロセス一覧に復活
~/H/docker ❯❯❯ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS                  NAMES
ba8ca7d29167        friendlyhello       "python app.py"     About a minute ago   Up About a minute   0.0.0.0:4000->80/tcp   nostalgic_torvalds
~/H/docker ❯❯❯

#取得OK
~ ❯❯❯ curl http://localhost:4000                                                                                                                                                   ⏎
<h3>Hello World!</h3><b>Hostname:</b> ba8ca7d29167<br/><b>Visits:</b> <i>cannot connect to Redis, counter disabled</i>%                                                              ~ ❯❯❯

バックグラウンドでコンテナが起動している場合、コンテナIDを指定して停止させる。

~/H/docker ❯❯❯ docker container stop ba8ca7d29167
ba8ca7d29167
~/H/docker ❯❯❯

4. コンテナを Dokcer Hub にpush する

Docker アカウントは作成してある状態です。

~/H/docker ❯❯❯ docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: me
Password:
Login Succeeded
~/H/docker ❯❯❯ docker tag friendlyhello me/get-started:part2
~/H/docker ❯❯❯ docker image ls
REPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE
friendlyhello                                latest              4490a5b791bd        About an hour ago   132MB
me/get-started                    part2               4490a5b791bd        About an hour ago   132MB
python                                       2.7-slim            d0d1b97dd328        27 hours ago        120MB
registry.heroku.com/hoge-docker-cr/web   latest              6f491d46a039        8 months ago        59.1MB
alpine                                       latest              7328f6f8b418        11 months ago       3.97MB
atlassianlabs/localstack                     latest              5bf4f14dfdb7        13 months ago       1.05GB
bash                                         latest              a0a73a853323        14 months ago       12.2MB
redis                                        latest              45c3ea2cecac        16 months ago       183MB
hello-world                                  latest              48b5124b2768        16 months ago       1.84kB
kitematic/hello-world-nginx                  latest              03b4557ad7b9        2 years ago         7.91MB

~/H/docker ❯❯❯ docker push me/get-started:part2                                                                                                                         ⏎
The push refers to repository [docker.io/me/get-started]
7b24058df639: Pushed
b7b6739a7222: Pushed
c6592c269152: Pushed
20f93bdcee9c: Mounted from library/python
21b24882d499: Mounted from library/python
db9dabc5cfee: Mounted from library/python
d626a8ad97a1: Mounted from library/python
part2: digest: sha256:38d9d86ea90c99880b0456eb05e1bf009e5e4a7fea72aecd7daeb2d28a590d69 size: 1787

docker hub にプッシュされました。

gyazo.com

docker やり直しメモ(1)

はじめに

めっちゃ忘れてるので、チュートリアルからやり直し。

docs.docker.com

環境

  • macOS HighSierra 10.13.4
  • docker community edition Version 18.03.1-ce-mac65 (24312)

チュートリアル実行手順

パート1:はじめに
~ ❯❯❯ docker --version
Docker version 18.03.1-ce, build 9ee9f40

~ ❯❯❯ docker info
Containers: 14
 Running: 0
 Paused: 0
 Stopped: 14
Images: 14
...

~ ❯❯❯ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

~ ❯❯❯ docker image ls
REPOSITORY                                   TAG                 IMAGE ID            CREATED             SIZE
alpine                                       latest              7328f6f8b418        11 months ago       3.97MB
atlassianlabs/localstack                     latest              5bf4f14dfdb7        13 months ago       1.05GB
bash                                         latest              a0a73a853323        14 months ago       12.2MB
redis                                        latest              45c3ea2cecac        16 months ago       183MB
hello-world                                  latest              48b5124b2768        16 months ago       1.84kB
kitematic/hello-world-nginx                  latest              03b4557ad7b9        2 years ago         7.91MB

~ ❯❯❯ docker container ls --all
CONTAINER ID        IMAGE                                COMMAND                  CREATED             STATUS                       PORTS                                                                                                 NAMES
814dbd8d0c9d        hello-world                          "/hello"                 5 minutes ago       Exited (0) 5 minutes ago                                                                                                           awesome_perlman
3ddfdf2c50d4        atlassianlabs/localstack             "/usr/bin/supervisord"   11 months ago       Exited (255) 11 months ago   0.0.0.0:4567-4580->4567-4580/tcp, 0.0.0.0:8080->8080/tcp, 4581/tcp                                    elastic_stonebraker
85add89c592d        atlassianlabs/localstack             "/usr/bin/supervisord"   11 months ago       Exited (255) 11 months ago   0.0.0.0:4567-4580->4567-4580/tcp, 0.0.0.0:8080->8080/tcp, 4581/tcp                                    stupefied_boyd
59885f9baf15        atlassianlabs/localstack             "/usr/bin/supervisord"   11 months ago       Exited (255) 11 months ago   0.0.0.0:4567-4580->4567-4580/tcp, 0.0.0.0:8080->8080/tcp, 4581/tcp                                    confident_clarke
0459cdbc9086        atlassianlabs/localstack             "/usr/bin/supervisord"   11 months ago       Exited (0) 11 months ago                                                                                                           vigilant_dubinsky
2f2d1f228b5b        bash                                 "docker-entrypoint.s…"   13 months ago       Exited (0) 13 months ago                                                                                                           determined_turing
a4c11e99ab44        hello-world                          "/hello"                 13 months ago       Exited (0) 13 months ago                                                                                                           musing_payne
d82c98b24c04        hello-world                          "/hello"                 13 months ago       Exited (0) 13 months ago                                                                                                           musing_hodgkin
4a826db15fed        atlassianlabs/localstack             "/usr/bin/supervisord"   13 months ago       Exited (0) 13 months ago                                                                                                           dazzling_ritchie
ae387ac9f6ab        atlassianlabs/localstack             "/usr/bin/supervisord"   13 months ago       Exited (0) 13 months ago                                                                                                           frosty_kalam
5a4a9cfd5d7a        atlassianlabs/localstack             "/usr/bin/supervisord"   13 months ago       Exited (255) 13 months ago   0.0.0.0:4567-4580->4567-4580/tcp, 0.0.0.0:8080->8080/tcp, 4581/tcp                                    keen_goldberg
6ab994bfc680        atlassianlabs/localstack             "/usr/bin/supervisord"   13 months ago       Exited (255) 13 months ago   0.0.0.0:4567-4580->4567-4580/tcp, 0.0.0.0:8080->8080/tcp, 4581/tcp                                    awesome_goldberg
bfca1cf83cd4        ec798eba2c56                         "docker-entrypoint.s…"   16 months ago       Exited (255) 16 months ago   0.0.0.0:32775->4369/tcp, 0.0.0.0:32774->5671/tcp, 0.0.0.0:32773->5672/tcp, 0.0.0.0:32772->25672/tcp   rabbitmq
6263ce07f2af        redis:latest                         "docker-entrypoint.s…"   16 months ago       Exited (0) 16 months ago                                                                                                           redis
64b3c95b136e        kitematic/hello-world-nginx:latest   "sh /start.sh"           16 months ago       Exited (137) 16 months ago                                                                                                         hello-world-nginx

10kg痩せたい その2

前提

1kg の脂肪を消費するのに必要なカロリー: 7,000 キロカロリー

 

そして

10kgの脂肪を消費するには、70,000キロカロリーほど余分に消費する必要があるようだ。

 

・激し目のジョギングで、1時間500キロカロリー消費する

→140時間必要

 

・ウォーキングで、1時間300キロカロリー消費する

→234時間必要

 

仮説

土日のどちらかに1日4時間歩いたとすると、

1週間で4時間

58.5週必要

だいたい1年半くらい?

 

業務用食材・食品購入はUCCのフーヅフリッジ(旧 ロイヤルシェフ)|業務用食材の通販サイト


業務用食材・食品購入はUCCのフーヅフリッジ(旧 ロイヤルシェフ)|業務用食材の通販サイト

業務用食材かー

冷蔵庫でかければ使えるかも

Amazon Web Services 業務システム設計・移行ガイド 一番大切な知識と技術が身につく | 佐々木 拓郎, 林 晋一郎, 瀬戸島 敏宏, 宮川 亮, 金澤 圭 | コンピュータ・IT | Kindleストア | Amazon

https://amzn.to/2LVIeLz

 

エンタープライズシステム開発では、ユーザーとの細かい視点・合意形成が必要になる(かつ、それら観点に向こうが気づいていない・知らない場合でもこちらが導いてあげる必要かある)が、そういう視点で書かれていてよかった。

React開発 現場の教科書 | 石橋 啓太, 丸山 弘詩 | 工学 | Kindleストア | Amazon

https://amzn.to/2sENKcH

業務でreactのアプリケーションを扱ってる(開発はしてない)ので購入。React に関することは既知のことばかりだったけど、Atomic Design のとこは、参考になった。(そのあたりが野放図なので、アプリケーションを立て直す参考にしたい)