読者です 読者をやめる 読者になる 読者になる

Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Dockerを使ってみる Docker Compose編

概要

複数のコンテナを一元管理する、DockerComposeを使ってみる

参考書籍

# やってみる

Docker コンテナ間のリンク

$  docker run --link 接続したいコンテナ名:エイリアス名 イメージ名 実行コマンド
  • 試しに、postgresを公式イメージを元に生成してみる。
$ docker run -d --name dbserver postgres # 名前をdbserver のコンテナを起動
  • 次に、appserver という名前をつけたコンテナを起動してみる。起動の時に、--linkを使うと、リンク先へのリンクができる。
$ docker run -it --name appserver --link dbserver:pg centos /bin/bash
  • また、環境変数には、PG_ と先頭についたプリフィックスの環境変数が設定されているのが確認できる。
[root@2822dccd7038 /]# set |grep PG
PG_ENV_GOSU_VERSION=1.7
PG_ENV_LANG=en_US.utf8
PG_ENV_PGDATA=/var/lib/postgresql/data
PG_ENV_PG_MAJOR=9.6
PG_ENV_PG_VERSION=9.6.1-1.pgdg80+1
PG_ENV_no_proxy='*.local, 169.254/16'
PG_NAME=/appserver/pg
PG_PORT=tcp://172.17.0.3:5432
PG_PORT_5432_TCP=tcp://172.17.0.3:5432
PG_PORT_5432_TCP_ADDR=172.17.0.3
PG_PORT_5432_TCP_PORT=5432
PG_PORT_5432_TCP_PROTO=tcp

Docker Composeをinstallしてみる。

以下で最新版がinstallできる。

github.com

curl -L https://github.com/docker/compose/releases/download/1.9.0-rc2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

とりあえず、現時点の最新版をinstallしてみた

docker-compose.ymlの構文

  • docker-compose.ymlで、複数のコンテナを定義する。
  • YAML で記載する。pythonみたいに、インデントで階層構造を表す。

例文:

# Webサーバの設定
webserver:
  image: httpd:latest
  ports:
    - "8000:80" # ホスト8000バンポートをコンテナ80に転送

# APサーバの設定
apserver:
  build: . #Dockerfileを指定

# image かbuildのどちらかを必ず指定する。

コンテナ内で動かすコマンド指定(command)

command: /bin/bash

コンテナ間リンク連携(links/external_links)

links:
  - dbserver
  - dbserver:mysql # エイリアスの設定

external_links: # docker-compose内に定義のない、外部の別コンテナとリンク機能を使って連携する時に指定
  - redis
  - project_db:mysql # エイリアスの設定

コンテナ間の通信(ports/expose)

ports: #必ずダブルクオーテーションで囲む(YAMLは、時刻として認識してしまうため)
  - "3000"
  - "8000:8000"
  - "49100:22"
  - "127.0.0.1:8001:8001"
expose: #ホストマシンに公開せずに、リンク機能を使って連携するコンテナのみポートを後悔する時は、exposeを使う
  - "3000"
  - "8000"

コンテナのデータ管理

volumes: #コンテナ内の一部もしくは全部を利用可能な状態にすること->コンテナにボリュームをマウントの意味w
  - /var/lib/mysql
  - cache/:/tmp/cache

volumes:
  - ~/configs:/etc/configs/:ro

volumes_from:
  - log # logというコンテナにマウントする

ちなみにマウントの意味は以下の通り

マウントとは、コンピュータに接続した周辺機器や外部記憶装置(あるいは、装置に挿入されたディスクなどの記録メディア)をOSに認識させ、利用可能な状態にすること。

マウントとは|mount − 意味 / 定義 / 解説 / 説明 : IT用語辞典

コンテナの環境変数指定(environment)

environment:
  - HOGE=fuga
  - FOO

environment:
  HOGE: fuga
  FOO:

# 同一ディレクトリ内に、envfileを用意しておけば、読み込みも可能
env_file: envfile

# 複数ファイルの読み込みも可能
env_file:
  - ./envfile1
  - ./app/envfile2
  - ./tmp/envfile3

コンテナの情報設定(container_name/labels)

Docker Composeで生成されるコンテナに名前をつける

container_name: web-container # コンテナ名の指定

コンテナにラベルをつけるとき

#配列形式
labels:
  - "com.expample.description=Accounting webapp"
  - "com.example.department=Finance"

#ハッシュ形式
labels:
  com.example.description: "Accounting webapp"
  com.example.department: "Finance"

docker-compose.ymlをGUIで作成できるwebサイト

https://lorry.io/

Docker Composeコマンド

docker-compose コマンド — Docker-docs-ja 1.10.0b ドキュメント

up コンテナの生成・起動 scale 生成するコンテナ数の指定 ps コンテナの一覧表示 run コンテナの実行 kill 実行中のコンテナの強制停止 など

  • docker-composeコマンドは、基本的に、docker-compose.ymlを保存したディレクトリで実行
  • それ以外の場所にdocker-compose.ymlを配置する場合は、fオプションでファイルパスを指定する。
# docker-compose.ymlを元にコンテナの生成/起動
$ docker-compose -f ./sample/docker-compose.yml up
  • サブコマンドの後ろにコンテナ名を指定するとそのコンテナのみを操作できる
docker-compose stop dbserver(コンテナ名)

複数コンテナの生成(up)

$ docker-compose up # これで全部のコンテナを生成・起動できる。

# バックグランド起動
$ docker-compose up -d

生成するコンテナ数の指定(scale)

docker-compose scale [サービス名=数]

$ docker-compose scale serverA=10 serverB=20