ゆるい感じのプログラムを書きたい。

プログラムの敷居を下げて、多くの人が開発出来るように色々書いていきます!

Dockerセットアップ 第7弾

CPU,メモリーの利用制限の設定

1.GoogleCloudのIaas環境の確認

  • 現在、稼働中のIaas環境のスペックは以下の通り
MachineType:g1-small
Cpu:1core
Memory:1.7GB


2.現在のdockerのリソース状況を確認

  • 以下のコマンドにて確認する。
  • 実行後のキャンセルはCtrl + shift + cを押下し停止する。
$ sudo docker stats
#実行結果は以下の通り
CONTAINER ID        NAME                    CPU %               MEM USAGE / LIMIT     MEM %               NET I/O  
           BLOCK I/O           PIDS
d25975f7bb09        growi_app_1             0.24%               75.91MiB / 1.654GiB   4.48%               215kB / 1
64kB       0B / 0B             39
bf48e2e6e690        growi_mongo_1           0.54%               48.38MiB / 1.654GiB   2.86%               160kB / 2
10kB       0B / 0B             31
80dd8db700d6        growi_elasticsearch_1   0.47%               487.9MiB / 1.654GiB   28.80%              698B / 42
B          0B / 0B             39
cab35b40eda7        yml_node_1              0.00%               6.27MiB / 1.654GiB    0.37%               1.13kB / 
0B         0B / 0B             7
2d99643f9b9f        docker-knowledge        0.15%               247MiB / 1.654GiB     14.58%              179kB / 1
87kB       0B / 0B             46
86e5b162d74f        postgres                0.00%               6.906MiB / 1.654GiB   0.41%               129kB / 1
59kB       0B / 0B             9
c28a409a997e        reverse-proxy           0.00%               1.48MiB / 1.654GiB    0.09%               75.7kB / 
77.3kB     0B / 0B             2
実行停止は以下もコマンドで
Ctrl + shift + c


3.各コンテナへの割り振りの設定

MiddleWareName Cpu Memory
docker-knowlege 1 500MB
postgres 0.50 100MB
reverse-proxy 1 500MB


3-1.docker-compose.ymlファイルの設定を変更する。

  • 以下のdocker-compose.ymlを元に準備する。
version: '3'
#swarm-mode対応http://docs.docker.jp/engine/swarm/index.html
services:
   app:
      image: koda/docker-knowledge:latest
      #コンテナ名を明示的に指定する
      container_name: docker-knowledge
      volumes:
         - /usr/local/etc/knowledge/webapps:/usr/local/tomcat/webapps
      ports:
         - 8080:8080
      restart: always
      tty: true
      #dbが起動してからappが起動する.
      deploy:
       replicas: 1 # 起動するプロセスの数
       resources:
        limits:
          cpus: '1'
          memory: 500M
      depends_on:
         - db

   proxy:
      image: nginx:latest
      #コンテナ名を明示的に指定する
      container_name: reverse-proxy
      volumes:
         - /usr/local/etc/knowledge/html:/usr/share/nginx/html
         - /usr/local/etc/knowledge/nginx/conf.d/:/etc/nginx/conf.d    
      ports:
         - 80:80
      restart: always
      tty: true
      deploy:
       replicas: 1 # 起動するプロセスの数
       resources:
        limits:
          cpus: '0.50'
          memory: 100M

   db:
      image: postgres:latest
      #コンテナ名を明示的に指定する
      container_name: postgres
      
      #コンテナの環境変数を追加する。
      #build オプションと合わせて指定すると、build中は enviroment で指定した
      #環境変数は見えないことに注意。
      #build に変数を渡す場合は args オプションで指定する。
      environment:
         - POSTGRES_USER=postgres
         - POSTGRES_PASSWORD=admin123
         - POSTGRES_DB=docker_knowledge
      volumes:
         - /usr/local/etc/knowledge/postgres/data:/var/lib/postgresql/data
      restart: always
      tty: true
      deploy:
       replicas: 1 # 起動するプロセスの
       resources:
        limits:
          cpus: '1'
          memory: 500M

3-2.deployについて

  • 以下の指定はサービスの定義を示します。
  • サービスの定義とは、そのサービスを起動する各コンテナーに適用される設定を行うことです
deploy:
 replicas: 1 # 起動するプロセスの数
 resources:
  limits:
   cpus: '1'
   memory: 500M

3-2.replicasについて

  • サービスを replicated(デフォルト)に設定しているときに、起動させるコンテナー数を指定します。
replicas: 1

3-3.resourcesについて

  • リソースの制約を設定します。
resources: 

3-4.CpuとMemory制限の設定

  • 以下の記載で利用可能なプロセス時間を設定可能
  • 設定内容は以下の通り
項目 ハードウェア名 設定値 備考
利用可能なプロセス時間 Cpu 1 シングルコアの100%
メモリ利用 Memory 500M
resources:
 limits:
   cpus: '1'
   memory: 500M

利用する領域の予約もできる。

  • 以下のように設定を追記すると可能
  • ホストのメモリに余裕がある時はは制限はかからず、他に使用している時に制限が掛かる。
  • 利用予約の設定は以下の通り
項目 ハードウェア名 設定値 備考
最低利用可能なプロセス時間 Cpu 0.25 常時利用可能な領域
最低メモリ Memory 20M 常時利用可能な領域
resources:
 limits:
   cpus: '1'
   memory: 500M
#以下の設定が該当の箇所になります。
reservations:
   cpus: '0.25'
   memory: 20M


4.Swarm(スウォーム)モード利用でコンテを起動させる。

docker swarm init

4-1.Swarmモードにてコンテナを起動させる

  • deployを設定した場合は以下のコマンドにてSwarm(スウォーム)モードを利用する必要がある
sudo docker stack deploy -c <ymlファイル名> <アプリケーション名(任意の名前 なんでも可)>

#下記、起動例になります。
sudo docker stack deploy -c docker-compose-proxy-posgre.yml proxy-posgre

4-2.Swarmモードにてコンテナを更新し起動させる

  • docker-compose.ymlファイルを更新した際は、起動時と同じく以下のコマンドを実行すれば、更新され起動される。
sudo docker stack deploy -c <ymlファイル名> <起動時に設定したアプリケーション名>

#下記、更新後の起動例になります。
sudo docker stack deploy -c docker-compose-proxy-posgre.yml proxy-posgre

4-5.アプリケーションとSwarmの解体(停止)

  • アプリケーションを削除(remove)しますが、1つの swarm ノードは起動および実行したままになりますので、注意してください。
sudo docker stack rm <起動時に設定したアプリケーション名>

#下記、停止例になります。
sudo docker stack rm proxy-posgre

4-6.Swarmのクラスタ停止

  • Swarm (クラスタ)を停止するには以下のコマンドを実行
docker swarm leave --force


4-6.アプリケーション名の調べ方

  • アプリケーション名の一覧を確認する場合は以下のコマンドを実行
sudo docker stack ls
#実行結果は下記の通り

NAME                SERVICES            ORCHESTRATOR
proxy-posgre        4                   Swarm
swarm起動ではない場合は
  • docker-composeのversionを下げて2を指定し 以下のコマンドを利用すると行えます。

詳細はこちら

  • 一例になります。
cpu_count: 2
cpu_percent: 50
cpus: 0.5
cpu_shares: 73
cpu_quota: 50000
cpu_period: 20ms
cpuset: 0,1

user: postgresql
working_dir: /code

domainname: foo.com
hostname: foo
ipc: host
mac_address: 02:42:ac:11:65:43

mem_limit: 1000000000
memswap_limit: 2000000000
mem_reservation: 512m
\


5.起動後の確認

5-1.起動中のコンテナの確認

  • 以下のコマンドにて起動しているコンテナを一覧表示
docker service ls
#実行結果は下記の通り

ID                  NAME                  MODE                REPLICAS            IMAGE                          PORTS
uw79m4zr9pgw        proxy-posgre_app      replicated          1/1                 koda/docker-knowledge:latest   *:8080->8080/tcp
332hcv6qzxvc        proxy-posgre_backup   replicated          0/1                 backup-service:latest          
odhal10l3xpe        proxy-posgre_db       replicated          1/1                 postgres:latest                
tidwvuer0wu1        proxy-posgre_proxy    replicated          1/1                 nginx:latest                   *:80->80/tcp

5-2.起動中のコンテナ数の確認

  • 以下のコマンドにて起動しているコンテナを一覧表示
sudo docker stack ps <起動時に設定したアプリケーション名>
#実行結果は下記の通り

   PORTS
w5crmrcb0bs0        proxy-posgre_backup.1       backup-service:latest          project             Ready               Rejected less than a second ago   "No such image: backup-service…"   
rge95ljgfnxn         \_ proxy-posgre_backup.1   backup-service:latest          project             Shutdown            Rejected 5 seconds ago            "No such image: backup-service…"   
pv3g850wzznh         \_ proxy-posgre_backup.1   backup-service:latest          project             Shutdown            Rejected 10 seconds ago           "No such image: backup-service…"   
lw0e4uieya7i         \_ proxy-posgre_backup.1   backup-service:latest          project             Shutdown            Rejected 15 seconds ago           "No such image: backup-service…"   
bw1xxjw8iosd         \_ proxy-posgre_backup.1   backup-service:latest          project             Shutdown            Rejected 20 seconds ago           "No such image: backup-service…"   
u1cgs6dn9voc        proxy-posgre_db.1           postgres:latest                project             Running             Running 31 hours ago                                                 
pvf4wg7nyxzb         \_ proxy-posgre_db.1       postgres:latest                project             Shutdown            Failed 31 hours ago               "starting container failed: fa…"   
70b2olguiis3        proxy-posgre_app.1          koda/docker-knowledge:latest   project             Running             Running 31 hours ago                                                 
lw1wmcjoiwc9        proxy-posgre_proxy.1        nginx:latest                   project             Running             Running 31 hours ago                                                 
w51pp66yorc7        proxy-posgre_db.1           postgres:latest                project             Shutdown            Shutdown 31 hours ago                                                
i5zkppmksh7n        proxy-posgre_proxy.1        nginx:latest                   project             Shutdown            Failed 31 hours ago               "error while removing network:…"   
qw469yr4xp8o        proxy-posgre_app.1          koda/docker-knowledge:latest   project             Shutdown            Failed 31 hours ago               "error while removing network:…"



参考サイト

【公式】Docker-Compose_ver.3 リファレンス

【公式】docker stack deployについて

【公式】swarm initについて

【公式】docker stack deployについて

【公式】kubeadmのインストール

Docker (ファイル/CPU/メモリ/プロセス) のリソースを制限する方法まとめ

Docker Compose/Swarm 入門

Docker_ver.1.12.1のメモリ制限に関するメモ

Docker-composeとDocker stack について

Dockerコンテナで利用できるリソースや権限を制限する