Fig

16
the study of Fig -Orchestration tool of docker- July,30,2014 Tadayasu Yotsu

description

Orchestration tool of docker

Transcript of Fig

Page 1: Fig

the study of Fig -Orchestration tool of docker-

July,30,2014 Tadayasu Yotsu

Page 2: Fig

July,30,2014 Docker inc announced to aquire Orchard Laboratories Ltd. This is assumed that 「Fig」which is

orchestration tool for docker will be standard tool.

Recently, there are some orchestration tools such as kubernetes. I am interested in orchestration tool, so I try to study it.

First of all, I will run fig by reading fig home page(http://www.fig.sh/index.html).

Page 3: Fig

Installまずはdockerのversion1.0以降をインストール。 実行環境はAWS EC2、RHEL6.5 $ sudo yum -y install http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm$ sudo yum -y install docker-io$ docker -vDocker version 1.0.0, build 63fe64c/1.0.0$ sudo service docker start

次にFigをインストール。 $ curl -L https://github.com/orchardup/fig/releases/download/0.5.1/linux > fig$ sudo mv fig /usr/local/bin/$ sudo chmod +x /usr/local/bin/fig$ fig --versionfig: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by /tmp/_MEIlZ8Qx8/libz.so.1)

glibcのバージョンをアップデートするのは面倒なので、python版をインストール $ python -VPython 2.7.8$ sudo pip install -U fig

Page 4: Fig

glibcのバージョンをアップデートするのは面倒なので、python版をインストール

$ python -VPython 2.7.8$ wget https://pypi.python.org/packages/source/s/setuptools/setuptools-5.4.1.tar.gz!$ cd setuptools-5.4.1$ python setup.py install$ easy_install pip$ pip2 install -U fig$ fig --versionfig 0.5.1a

インストールはこれで完了

Page 5: Fig

Get started with DjangoFigのセットアップを行い、Django/PostgreSQLアプリの実行を行う。

始める前に3つのファイルの設定を行う。

まず最初にアプリケーションはアプリに実行に必要なものを含んだdockerコ

ンテナ内で実行する予定である。そのためdockerコンテナ内で何を実行する

のかDockerfileを使用して定義する。

FROM orchardup/python:2.7ENV PYTHONUNBUFFERED 1RUN apt-get update -qq && apt-get install -y python-psycopg2RUN mkdir /codeWORKDIR /codeADD requirements.txt /code/RUN pip install -r requirements.txtADD . /code/

これでimageの中にアプリケーションがインストールされる。

Page 6: Fig

次にPythonの依存性をrequirements.txtで定義する。Djangoシンプルだけど、これで十分。

最後にこれら全てをfig.ymlと呼ばれるファイルでくっつける。アプリケーションがWeb

Serverとデータベースのサービスで構成されることを定義する。そしてどのDockerイメー

ジを使用し、どのようにリンクするか、コンテナ内でどのvolumeをマウントするか、そし

てどのポートをexposeするかを定義する。

手順書には記載されてないが、このDockerfileでコンテナが起動するか確認$ sudo docker build -t test .Sending build context to Docker daemon 2.56 kBSending build context to Docker daemon Step 0 : FROM orchardup/python:2.7Pulling repository orchardup/pythoncdc18ed4ed6f: Download complete 511136ea3c5a: Download complete 5e66087f3ffe: Download complete 4d26dd3ebc1c: Download complete d4010efcfd86: Download complete 99ec81b80c55: Download complete ---> cdc18ed4ed6fStep 1 : ENV PYTHONUNBUFFERED 1 ---> Running in 704a8a850a45Step 4 : WORKDIR /code ---> Running in 33098624aa98 ---> 1497430bfa1dRemoving intermediate container 33098624aa98Step 5 : ADD requirements.txt /code/2014/08/02 01:46:40 requirements.txt: no such file or directory

pip installでくわせてるrequirements.txtが必要だと言われ失敗。そりゃそうだ。とりあえず手順書に従って次へ進める。

Page 7: Fig

db: image: orchardup/postgresqlweb: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" links: - db

最後にこれら全てをfig.ymlと呼ばれるファイルでくっつける。アプリケーショ

ンがWeb Serverとデータベースのサービスで構成されることを定義する。そし

てどのDockerイメージを使用し、どのようにリンクするか、コンテナ内でどの

volumeをマウントするか、そしてどのポートをexposeするかを定義する。

fig.ymlの詳細はhttp://www.fig.sh/yml.htmlを参照。

とりあえず作成するファイルはこれで全て。$ pwd/home/ec2-user/fig$ lsDockerfile fig.yml requirements.txt

Page 8: Fig

db: image: orchardup/postgresqlweb: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - "8000:8000" links: - db

最後にこれら全てをfig.ymlと呼ばれるファイルでくっつける。アプリケーショ

ンがWeb Serverとデータベースのサービスで構成されることを定義する。そし

てどのDockerイメージを使用し、どのようにリンクするか、コンテナ内でどの

volumeをマウントするか、そしてどのポートをexposeするかを定義する。

fig.ymlの詳細はhttp://www.fig.sh/yml.htmlを参照。

とりあえず作成するファイルはこれで全て。$ pwd/home/ec2-user/fig$ lsDockerfile fig.yml requirements.txt

Page 9: Fig

# fig run web django-admin.py startproject figexample .Creating fig_db_1...Pulling image orchardup/postgresql…省略Building web... ---> Using cache ---> 648d5cf80800Step 2 : RUN apt-get update -qq && apt-get install -y python-psycopg2 ---> Using cache ---> af5aedf45f81Step 3 : RUN mkdir /code ---> Using cache ---> 93dd07412b09Step 4 : WORKDIR /code ---> Using cache ---> 1497430bfa1dStep 5 : ADD requirements.txt /code/ ---> 2b8a2b0f1df7Removing intermediate container 7c7d76a6bf7aStep 6 : RUN pip install -r requirements.txt ---> Running in 1dfba113bb7fDownloading/unpacking Django (from -r requirements.txt (line 1))Installing collected packages: DjangoSuccessfully installed DjangoCleaning up... ---> 2d2464646cf6Removing intermediate container 1dfba113bb7fStep 7 : ADD . /code/ ---> a38ea44a1f49Removing intermediate container 6c1d8cd2ac06Successfully built a38ea44a1f49# lsDockerfile fig.yml figexample manage.py requirements.txt

それではfig runを使ってDjango Projectを起動してみる。

Figは最初にDockerfileを使っ

てWeb Serviceのためのイメージをビルドする。それからコンテ

ナの中で”django-admin.py

startproject figexample .”コマンドを実行する。

実行後のカレントディレクトリに

Djangoアプリが生成される。

Page 10: Fig

# docker imagesREPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZEfig_web latest a38ea44a1f49 13 minutes ago 550.9 MBorchardup/postgresql latest ca3d005ec1e8 5 hours ago 478 MBorchardup/postgresql 9.1 f9686ed36bcb 5 hours ago 318 MBorchardup/postgresql 9.3 8096d940fd75 4 days ago 477.9 MBcentos centos6 0c752394b855 7 weeks ago 124.1 MBcentos latest 0c752394b855 7 weeks ago 124.1 MBorchardup/python 2.7 cdc18ed4ed6f 9 weeks ago 514.3 MBcentos 6.4 539c0211cd76 16 months ago 300.6 MB

fig_web,orchardup/postgresql x3/orchardup/pythonのイメージが追加されている。

# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES479c8630b668 orchardup/postgresql:latest /usr/local/bin/run 17 minutes ago Up 17 minutes 5432/tcp fig_db_1,fig_web_run_1/db_1,fig_web_run_1/fig_db_1

起動しているコンテナはorchardup/postgresqlのみ。

Page 11: Fig

DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'docker', 'USER': 'docker', 'PASSWORD': 'docker', 'HOST': os.environ.get('DB_1_PORT_5432_TCP_ADDR'), 'PORT': os.environ.get('DB_1_PORT_5432_TCP_PORT'), }}

データベース接続のセットアップを行う。figexample/settings.pyファイ

ルの”DATABASES=…”を修正する。

これらの設定はorchardup/postgresql Dockerイメージによって定義されている。

Page 12: Fig

# fig upRecreating fig_db_1...Creating fig_web_1...Attaching to fig_db_1, fig_web_1db_1 | 2014-08-02 07:03:38 GMT ERROR: role "docker" already existsdb_1 | 2014-08-02 07:03:38 GMT STATEMENT: CREATE USER docker WITH SUPERUSER;db_1 | db_1 | 2014-08-02 07:03:39 GMT ERROR: database "docker" already existsdb_1 | 2014-08-02 07:03:39 GMT STATEMENT: CREATE DATABASE docker OWNER docker TEMPLATE DEFAULT;db_1 | db_1 | 2014-08-02 07:03:39 GMT LOG: database system was shut down at 2014-08-02 07:03:39 GMTdb_1 | 2014-08-02 07:03:39 GMT LOG: autovacuum launcher starteddb_1 | 2014-08-02 07:03:39 GMT LOG: database system is ready to accept connectionsweb_1 | Validating models...web_1 | web_1 | 0 errors foundweb_1 | August 02, 2014 - 07:03:40web_1 | Django version 1.6.5, using settings 'figexample.settings'web_1 | Starting development server at http://0.0.0.0:8000/web_1 | Quit the server with CONTROL-C.

”fig up”を実行する。

ブラウザでlocalhost:8000にアクセスし、Djangoのページが表示されるか確認する。

※ちなみにEC2ではDefaultでX11fowardingが有効になっておらずライブラリも足りてないのでインストールする必要がある。

$ sudo yum install xorg-x11-xauth.x86_64 xorg-x11-server-utils.x86_64 firefox

Page 13: Fig

# fig run web python manage.py syncdbCreating tables ...Creating table django_admin_logCreating table auth_permissionCreating table auth_group_permissionsCreating table auth_groupCreating table auth_user_groupsCreating table auth_user_user_permissionsCreating table auth_userCreating table django_content_typeCreating table django_session

Dockerに対して管理コマンドを実行。

fig upを実行してデータベースのセットアップを行う。

とりあえず、ここまでがドキュメントに記載されている内容。定義ファイルを書いてfigコマンドを実行するだけで環境が作れるので便利だと思うが、1つのコンテナだけだとあまりありがたみが分からないので、次回は複数のコンテナで試してみる。

Page 14: Fig

fig.yml Referencefig.ymlで定義された各サービスはimageもしくはbuildをちゃんと指定しなければな

らない。 他のキーはオプションで、docker runコマンドラインの機能に類似している。

docker runと同様にDockerfile (e.g. CMD, EXPOSE, VOLUME, ENV) で指定

されるオプションはデフォルトで尊重される。fig.ymlで再び指定する必要はない。※

訳が変になったが、要するにfig.ymlよりもDockerfileの方が優先されるっぽい。

Page 15: Fig

Tag

imageタグもしく部分一致のイメージモートを指定可能。ローカルに存在しない場合、

Fig

image: ubuntu image: orchardup/postgresql image: a4bc65fd

buildDockerfile生成された名前を持ってビルドとタグ付けをし、その後そのイメージを利用する。

build: /path/to/build/dir

command デフォルトのコマンドをオーバライドさせる。 command: bundle exec thin -p 3000

links

別のサービス中のコンテナへのリンク。リンクの別

名を指定できる。それはどの環境変数がを定義する。

db -> DB_1_PORT db:database -> DATABASE_1_PORT

links: - db - db:database - redis

ports

Expose ports.

を指定するか、コンテナだけのポート

random host port will be chosen)

ports: - "3000" - "8000:8000" - "49100:22" - "127.0.0.1:8001:8001"

exposeExpose ports

い)

expose: - "3000" - "8000"

Page 16: Fig

volumes

ボリュームとしてマウントするパス。ホ

ストマシン上のパスも指定可能。

(HOST:CONTAINER). !

volumes: - /var/lib/mysql - cache/:/tmp/cache

volumes_from

他のサービスやコンテから全てのボリュームをマウント。

volumes_from: - service_name - container_name

environment

環境変数を追加。配列や辞書を使用可能。キーだけしかない環境変数でも

OKは解決される。これは秘密の情報やホスト特有の情報を格納するのに有用。

environment: RACK_ENV: development SESSION_SECRET: environment: - RACK_ENV=development - SESSION_SECRET

netネットワークモード。

の--net指定可能

net: "bridge" net: "none" net: "container:[name or id]" net: "host"

dns 独自の

dns: 8.8.8.8 dns: - 8.8.8.8 - 9.9.9.9

working_dir entrypoint

user hostname

domainname mem_limit privileged

これらは一つの値を持ち、

run似している。

working_dir: /code entrypoint: /code/entrypoint.sh user: postgresql hostname: foo domainname: foo.com mem_limit: 1000000000 privileged: true