はじまる

適当な事を適当に書く

docker やり直しメモ(5) Stacks

サービスにアプリを追加する。

docker-compose.txt を更新する

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
networks:
  webnet:

更新した docker-compose を service に反映する。

~/H/docker5 ❯❯❯ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER    ERRORS
myvm1   -        virtualbox   Stopped                 Unknown
myvm2   -        virtualbox   Stopped                 Unknown
~/H/docker5 ❯❯❯ docker-machine env myvm1
Error checking TLS connection: Host is not running
~/H/docker5 ❯❯❯ docker-machine restart myvm1                                                                                                                                                                                     ⏎
Restarting "myvm1"...
Starting "myvm1"...
(myvm1) Check network to re-create if needed...
(myvm1) Waiting for an IP...
Machine "myvm1" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Waiting for SSH to be available...
Detecting the provisioner...
Restarted machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
~/H/docker5 ❯❯❯ docker-machine restart myvm2
Restarting "myvm2"...
Starting "myvm2"...
(myvm2) Check network to re-create if needed...
(myvm2) Waiting for an IP...
Machine "myvm2" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Waiting for SSH to be available...
Detecting the provisioner...
Restarted machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
~/H/docker5 ❯❯❯ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   *        virtualbox   Running   tcp://192.168.99.100:2376           v18.05.0-ce
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v18.05.0-ce
~/H/docker5 ❯❯❯ eval $(docker-machine env myvm1)
~/H/docker5 ❯❯❯ docker stack deploy -c docker-compose.yml getstartedlab
Updating service getstartedlab_web (id: nuigb1fokw9ryei8v9ygyppfw)
Creating service getstartedlab_visualizer
~/H/docker5 ❯❯❯

新しく追加した visualizer のプロセス(コンテナ)が稼働している。

~/H/docker5 ❯❯❯ docker ps
CONTAINER ID        IMAGE                             COMMAND             CREATED              STATUS              PORTS               NAMES
cabd5ef4f45a        dockersamples/visualizer:stable   "npm start"         About a minute ago   Up About a minute   8080/tcp            getstartedlab_visualizer.1.2ijfurtaxb4p6k88wyxv2gq1i
00c32794b3f2        me/get-started:part2   "python app.py"     About a minute ago   Up About a minute   80/tcp              getstartedlab_web.3.bhvt6rtjp6xevxfpheo5m98x0
a8491d81ad2e        me/get-started:part2   "python app.py"     About a minute ago   Up About a minute   80/tcp              getstartedlab_web.1.rsm3ejgwtz50fqavmfyh4fx8t

Webブラウザで 8080ポートに接続すると visualizer, 80ポートに接続すると従来のWebアプリを表示できるように変更された。 http://192.168.99.100:8080 gyazo.com

http://192.168.99.100:80 gyazo.com

サービスにDB(Redis)を追加する

docker-compose.txt に redis を追記。

version: "3"
services:
  web:
    # replace username/repo:tag with your name and image details
    image: username/repo:tag
    deploy:
      replicas: 5
      restart_policy:
        condition: on-failure
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
    ports:
      - "80:80"
    networks:
      - webnet
  visualizer:
    image: dockersamples/visualizer:stable
    ports:
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock"
    deploy:
      placement:
        constraints: [node.role == manager]
    networks:
      - webnet
  redis:
    image: redis
    ports:
      - "6379:6379"
    volumes:
      - "/home/docker/data:/data"
    deploy:
      placement:
        constraints: [node.role == manager]
    command: redis-server --appendonly yes
    networks:
      - webnet
networks:
  webnet:

swarm manager のなかに data ディレクトリをつくる

docker-machine ssh myvm1 "mkdir ./data"

新しい docker-compose.txt をデプロイする

~/H/docker5 ❯❯❯ eval $(docker-machine env myvm1)
~/H/docker5 ❯❯❯ docker stack deploy -c docker-compose.yml getstartedlab
Updating service getstartedlab_visualizer (id: r2qmkaa6o5slmt8jhzwmcr4ti)
Creating service getstartedlab_redis
Updating service getstartedlab_web (id: nuigb1fokw9ryei8v9ygyppfw)

redis のプロセスが追加されて稼働を開始した。

~/H/docker5 ❯❯❯ docker service ls
ID                  NAME                       MODE                REPLICAS            IMAGE                             PORTS
lvucco4osp67        getstartedlab_redis        replicated          1/1                 redis:latest                      *:6379->6379/tcp
r2qmkaa6o5sl        getstartedlab_visualizer   replicated          1/1                 dockersamples/visualizer:stable   *:8080->8080/tcp
nuigb1fokw9r        getstartedlab_web          replicated          5/5                 me/get-started:part2   *:80->80/tcp

Redis にデータを保存するようになったので、アクセスカウンターが動くようになった。

gyazo.com

gyazo.com

docker やり直しメモ(4) 横道

# マシン再起動の後
~/H/docker4 ❯❯❯ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL   SWARM   DOCKER    ERRORS
myvm1   -        virtualbox   Stopped                 Unknown
myvm2   -        virtualbox   Stopped                 Unknown

# DOCKER* の環境変数は設定されていない状態
~/H/docker4 ❯❯❯ env|ag DOCKER

# 前述の2つのVM(Swarm の node)を起動する
~/H/docker4 ❯❯❯ docker-machine restart myvm1
Restarting "myvm1"...
Starting "myvm1"...
(myvm1) Check network to re-create if needed...
(myvm1) Waiting for an IP...
Machine "myvm1" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Waiting for SSH to be available...
Detecting the provisioner...
Restarted machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

~/H/docker4 ❯❯❯ docker-machine restart myvm2                                                                                                                                                                                     ⏎
Restarting "myvm2"...
Starting "myvm2"...
(myvm2) Check network to re-create if needed...
(myvm2) Waiting for an IP...
Machine "myvm2" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Waiting for SSH to be available...
Detecting the provisioner...
Restarted machines may have new IP addresses. You may need to re-run the `docker-machine env` command.

# docker-machine の起動状態を確認
~/H/docker4 ❯❯❯ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.05.0-ce
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v18.05.0-ce

~/H/docker4 ❯❯❯ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

~/H/docker4 ❯❯❯ docker stack ls
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.

~/H/docker4 ❯❯❯ docker-machine env myvm1                                                                                                                                                                                         ⏎
export DOCKER_TLS_VERIFY="1"
export DOCKER_HOST="tcp://192.168.99.100:2376"
export DOCKER_CERT_PATH="/Users/satoru/.docker/machine/machines/myvm1"
export DOCKER_MACHINE_NAME="myvm1"
# Run this command to configure your shell:
# eval $(docker-machine env myvm1)

# 手元から myvm1(swarm manager)の中にはいる
~/H/docker4 ❯❯❯ eval $(docker-machine env myvm1)

# myvm1(swarm manager)の中でスタックの確認
~/H/docker4 ❯❯❯ docker stack ls
NAME                SERVICES
getstartedlab       1

# myvm1(swarm manager)の中でコンテナ稼働中。
~/H/docker4 ❯❯❯ docker ps
CONTAINER ID        IMAGE                             COMMAND             CREATED             STATUS              PORTS               NAMES
b559f4feca31        me/get-started:part2   "python app.py"     2 minutes ago       Up 2 minutes        80/tcp              getstartedlab_web.1.jibwht3xvh0nccpanxhe0e7f3
2f912f6c0e01        me/get-started:part2   "python app.py"     3 minutes ago       Up 3 minutes        80/tcp              getstartedlab_web.3.8bk7vrtv5s20l14p9bv03l3x7
0731ecaad1ed        me/get-started:part2   "python app.py"     3 minutes ago       Up 3 minutes        80/tcp              getstartedlab_web.2.tr8aftd3w451d4twq8s39rndr
~/H/docker4 ❯❯❯

アプリが稼働している。 host が myvm1 gyazo.com

host が myvm2 gyazo.com

~/H/docker4 ❯❯❯ docker ps
CONTAINER ID        IMAGE                             COMMAND             CREATED             STATUS              PORTS               NAMES
b559f4feca31        me/get-started:part2   "python app.py"     2 minutes ago       Up 2 minutes        80/tcp              getstartedlab_web.1.jibwht3xvh0nccpanxhe0e7f3
2f912f6c0e01        me/get-started:part2   "python app.py"     3 minutes ago       Up 3 minutes        80/tcp              getstartedlab_web.3.8bk7vrtv5s20l14p9bv03l3x7
0731ecaad1ed        me/get-started:part2   "python app.py"     3 minutes ago       Up 3 minutes        80/tcp              getstartedlab_web.2.tr8aftd3w451d4twq8s39rndr

停止する

~/H/docker4 ❯❯❯ docker-machine stop myvm2
Stopping "myvm2"...
Machine "myvm2" was stopped.
~/H/docker4 ❯❯❯ docker-machine stop myvm1
Stopping "myvm1"...
Machine "myvm1" was stopped.

docker やり直しメモ(4)

パート4:群(Swarm)

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

1. スウォームとは

Dockerを実行していてクラスタに参加しているマシンのグループです。クラスタswarm manager によって管理されます。 スウォームに参加しているマシンは、物理マシン・仮想マシン両方の場合で、ノードとよばれます。スウォームマネージャーは、スウォーム内であなたのコマンドを実行できる唯一のマシンです。スウォームマネージャーは、他のマシンがスウォームにワーカーとして参加することも許可できます。ワーカーは、能力を提供するためだけに存在し、他のマシンに何ができるかできないかを伝える権限を持っていません。

~/H/docker2 ❯❯❯ docker swarm --help

Usage:  docker swarm COMMAND

Manage Swarm

Options:


Commands:
  ca          Display and rotate the root CA
  init        Initialize a swarm
  join        Join a swarm as a node and/or manager
  join-token  Manage join tokens
  leave       Leave the swarm
  unlock      Unlock swarm
  unlock-key  Manage the unlock key
  update      Update the swarm

Run 'docker swarm COMMAND --help' for more information on a command.

2. スウォームを作成する

VMを作成する。

docker-machine コマンドを利用して、仮想マシンを2つ作成してみます。この動作には virtualbox が必要です。

docker-machine create --driver virtualbox myvm1
docker-machine create --driver virtualbox myvm2

こんな感じになります。

~/H/docker4 ❯❯❯ docker-machine create --driver virtualbox myvm1
Running pre-create checks...
(myvm1) Default Boot2Docker ISO is out-of-date, downloading the latest release...
(myvm1) Latest release for github.com/boot2docker/boot2docker is v18.05.0-ce
(myvm1) Downloading /Users/satoru/.docker/machine/cache/boot2docker.iso from https://github.com/boot2docker/boot2docker/releases/download/v18.05.0-ce/boot2docker.iso...
(myvm1) 0%....10%....20%....30%....40%....50%....60%....70%....80%....90%....100%
Creating machine...
(myvm1) Copying /Users/satoru/.docker/machine/cache/boot2docker.iso to /Users/satoru/.docker/machine/machines/myvm1/boot2docker.iso...
(myvm1) Creating VirtualBox VM...
(myvm1) Creating SSH key...
(myvm1) Starting the VM...
(myvm1) Check network to re-create if needed...
(myvm1) Waiting for an IP...
Waiting for machine to be running, this may take a few minutes...
Detecting operating system of created instance...
Waiting for SSH to be available...
Detecting the provisioner...
Provisioning with boot2docker...
Copying certs to the local machine directory...
Copying certs to the remote machine...
Setting Docker configuration on the remote daemon...
Checking connection to Docker...
Docker is up and running!
To see how to connect your Docker Client to the Docker Engine running on this virtual machine, run: docker-machine env myvm1

Virtualbox の画面でも仮想マシンが作成されていますね。

gyazo.com

VMIPアドレスを確認する

~/H/docker4 ❯❯❯ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER        ERRORS
myvm1   -        virtualbox   Running   tcp://192.168.99.100:2376           v18.05.0-ce
myvm2   -        virtualbox   Running   tcp://192.168.99.101:2376           v18.05.0-ce

Swarm を初期化する

myvm1を swarm manager に指定します。

~/H/docker4 ❯❯❯ docker-machine ssh myvm1 "docker swarm init --advertise-addr 192.168.99.100"
Swarm initialized: current node (ph13skaro0wq0010iau1jt5i5) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-2vquyyieen6whiz3pmtidp7a7q9mxzaxeiz4q7wszz0dgmiste-cnxryi4ktbxro2jzt68t9wb3o 192.168.99.100:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

myvm2 を ノードとして swarm に追加します。

~/H/docker4 ❯❯❯ docker-machine ssh myvm2 "docker swarm join --token SWMTKN-1-2vquyyieen6whiz3pmtidp7a7q9mxzaxeiz4q7wszz0dgmiste-cnxryi4ktbxro2jzt68t9wb3o 192.168.99.100:2377"
This node joined a swarm as a worker.
~/H/docker4 ❯❯❯ docker-machine ssh myvm1 "docker node ls"
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
ph13skaro0wq0010iau1jt5i5 *   myvm1               Ready               Active              Leader              18.05.0-ce
xyqexicll5f17le0n4w5e6epu     myvm2               Ready               Active                                  18.05.0-ce

環境変数を確認します。

自分のローカルにmyvm1の環境変数を設定します。

~/H/docker4 ❯❯❯ eval $(docker-machine env myvm1)
~/H/docker4 ❯❯❯ env|ag DOCKER
DOCKER_TLS_VERIFY=1
DOCKER_HOST=tcp://192.168.99.100:2376
DOCKER_CERT_PATH=/Users/me/.docker/machine/machines/myvm1
DOCKER_MACHINE_NAME=myvm1

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年半くらい?