2018年7月29日日曜日

docker ymlの書き方


image
タグや image ID の一部です。ローカルでもリモートでも構いません。ローカルに存在しなければ、Compose はイメージを取得(pull)します。

image: mysql:5.7



build
Dockerfile のあるディレクトリのパスを指定します。この値が相対パスで指定された場合は、yml ファイル自身がある場所からの相対パスになります。また、ディレクトリは内容構築のため、Docker デーモンにも送られます。
Compose は構築し、生成した名前をタグ付けし、以後のイメージでも使われます。
build: /path/to/build/dir

dockerfile
代替用の Dockerfile です。
Compose は構築時に指定されたファイルを使います。
dockerfile: Dockerfile-alternate

command
デフォルトのコマンドを上書きします。
command: bundle exec thin -p 3000

links
コンテナを他のサービスにリンクします。サービス名とリンク・エイリアス(サービス:エイリアス)を指定できるだけでなく、あるいは、サービス名(エイリアスとしても使われます)でも指定できます。
links:
 - db
 - db:database
 - redis
エイリアス名を記述すると、コンテナ内の /etc/hosts の中にサービス名が追加されます。例:
172.17.2.186  db
172.17.2.186  database
172.17.2.187  redis
環境変数も作成されます。詳細は環境変数リファレンスをご覧ください。

external_links
この docker-compose.yml や、とりわけ Compose の外にある共有ないし共通サービスが提供するコンテナとリンクします。external_links はコンテナ名やリンク・エイリアス(CONTAINER:ALIAS)の指定時に links と似たような意味あいを持ちます。
external_links:
 - redis_1
 - project_db_1:mysql
 - project_db_1:postgresql

extra_hosts
ホスト名のマッピングを追加します。docker クライアントの --add-host パラメータと同じ値です。
extra_hosts:
 - "somehost:162.242.195.82"
 - "otherhost:50.31.209.229"
入力した IP アドレスとホスト名は、コンテナ内の /etc/hosts にサービスと記載されます。例:
162.242.195.82  somehost
50.31.209.229   otherhost

ports
ポートを公開(expose)します。ホストとポートを指定(ホスト:コンテナ)するか、コンテナのポートのみ指定します(ホスト側のポートはランダムに選ばれます)。
メモ:ポートのマッピングに ホスト:コンテナ の形式を使うとき、コンテナのポートが 60 以下の場合はエラーが表示されるでしょう。これは YTML xx:yy 形式を60進数と認識するためです。そのため、常に明確なポートのマッピングを文字列で指定することを推奨します。
ports:
 - "3000"
 - "8000:8000"
 - "49100:22"
 - "127.0.0.1:8001:8001"

expose
ホストマシン上にポートを露出(expose)しますが、公開はしません。リンクされたサービスのみアクセスできます。内部ポートのみ指定できます。
expose:
 - "3000"
 - "8000"

volumes
パスをボリュームとしてマウントします。オプションとしてホスト側のパスを指定(ホスト:コンテナ)したり、アクセスモードを指定します(ホスト:コンテナ:ro)。
volumes:
 - /var/lib/mysql
 - cache/:/tmp/cache
 - ~/configs:/etc/configs/:ro

volumes_from
他のサービスやコンテナから、全てのボリュームをマウントします。
volumes_from:
 - service_name
 - container_name

environment
環境変数を追加します。配列や dictionary(訳注;YAML のハッシュ)を使えます。
キーだけの環境変数は、Compose 起動時に用いられる値があてられますので、秘密にしたい値やホスト固有の値を指定しやすいです。
environment:
  RACK_ENV: development
  SESSION_SECRET:

environment:
  - RACK_ENV=development
  - SESSION_SECRET

env_file
ファイルから環境変数を追加します。リストには1つの値です。
Compose でファイルを docker-compose -f ファイル名 で指定した場合は、env_file のパスはそのファイルがあるディレクトリからの相対パスになります。
environment で指定した環境変数は、これらの値に上書きされます。
env_file: .env

env_file:
  - ./common.env
  - ./apps/web.env
  - /opt/secrets.env
Compose は環境変数で指定されたファイルの各行が 変数= の形式とみなします。#` で始まる行は無視され(例:コメント)、空白行として扱われます。
# 環境変数 Rails/Rack の設定
RACK_ENV=development

extends
現在のファイルや別のファイルから、他のサービスを拡張します。オプションで設定を上書きします。
以下は簡単な例です。2つのファイル common.ylm development.yml があります。extends を使って development.yml のサービスを定義します。このサービスとは common.yml で定義されているものです:
common.yml
webapp:
  build: ./webapp
  environment:
    - DEBUG=false
    - SEND_EMAILS=false
development.yml
web:
  extends:
    file: common.yml
    service: webapp
  ports:
    - "8000:8000"
  links:
    - db
  environment:
    - DEBUG=true
db:
  image: postgres
ここでは、development.yml web サービスは、common.yml webapp サービスの設定を継承します。buildenvironment のキーと、ports links 設定を追加します。新しい値を持つ環境変数(DEBGUG)が定義されると、既存のものを上書きします。
他の環境変数(SEND_EMAILS)はそのままです。
extends の詳細は、チュートリアルリファレンスをご覧ください。

lables
Docker lables を使ってコンテナにメタデータを追加します。配列やハッシュが使えます。
逆引き DNS の概念を使い、他のソフトウェアが使うラベルと衝突しないようにすることをお勧めします。
labels:
  com.example.description: "Accounting webapp"
  com.example.department: "Finance"
  com.example.label-with-empty-value: ""

labels:
  - "com.example.description=Accounting webapp"
  - "com.example.department=Finance"
  - "com.example.label-with-empty-value"

log driver
docker 実行時のオプションで(ドキュメントはこちら(英語)です --log-driver を使い、ログ記録用のドライバを指定します。
現時点で使える値は json-filesyslognone です。暫くすると Docker エンジンにドライバが更に追加され、一覧が変わる可能性があります。
デフォルトの値は json-file です。
log_driver: "json-file"
log_driver: "syslog"
log_driver: "none"

net
ネットワーキング・モードを指定します。Docker クライアントで --net パラメータを指定したときと同じです。
net: "bridge"
net: "none"
net: "container:[name or id]"
net: "host"

pid
pid: "host"
PID モードを host PID モードにセットします。これにより、コンテナとホスト・オペレーティング・システム上の PID アドレス空間を共有します。ベアメタルマシンの名前空間などで、他のコンテナにアクセス・操作できるように、コンテナ起動時にこのフラグを使います。

dns
DNS サーバーを設定します。1つまたはリストで記述します。
dns: 8.8.8.8
dns:
  - 8.8.8.8
  - 9.9.9.9

cap_add, cap_drop
コンテナの性能を追加したり下げたりします。man 7 capabilities で詳細をご覧ください。
cap_add:
  - ALL

cap_drop:
  - NET_ADMIN
  - SYS_ADMIN

dns_search
DNS search ドメインを設定します。1つまたはリストで記述します。
dns_search: example.com
dns_search:
  - dc1.example.com
  - dc2.example.com

devices
デバイス・マッピングの一覧です。Docker クライアントで作成時のオプション --device と同じ形式の使い方です。
devices:
  - "/dev/ttyUSB0:/dev/ttyUSB0"

security_opt
それぞれのコンテナ毎に、デフォルトのラベリング・スキーマを上書きします。

  security_opt:
    - label:user:USER
    - label:role:ROLE


raspberry pi:dockerにてwordpressを導入する。

1)raspberry piにdocker環境を導入する。
$ sudo apt-get install curl
$ curl -sSL https://get.docker.com/ | sh
$ sudo apt-get install docker-compose
$ curl -s https://packagecloud.io/install/repositories/Hypriot/Schatzkiste/script.deb.sh | sudo bash
$ sudo apt-get install git
$ git clone https://github.com/rothgar/rpi-wordpress


2)作成用にディレクトリを作成する
$ mkdir wordpress_1
$ cd wordpress_1


3)composeファイル生成する。
$ vi docker-compose.yml

########### docker-compose.yml ###############
version: '2'

services:

  wordpress:
    image: arm32v7/wordpress
    restart: always
    ports:
      - 8001:80
    environment:
      WORDPRESS_DB_PASSWORD: password
    volumes:
      - ./html:/var/www/html
  mysql:
    image: hypriot/rpi-mysql
    restart: always
    ports:
    - 3307:3307
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
    - ./wpdb:/var/lib/mysql/wordpress
#############################################

注意:赤字は、raspberry pi用。


4)以下を実行することにより、実行可能。

$ docker-compose up -d

php log(ECS ログ出力)

# PHPエラーログの設定 ENV PHP_INI_DIR /usr/local/etc/php RUN { \ echo 'log_errors = On' ; \ echo 'error_log = /proc/self/...