WIP

Docker Compose

Docker Compose は、Dockerfileを指定してイメージの生成(build)から、起動時オプションの設定やコンテナの起動(run)までこなしてくれる、Dockerコンテナの管理支援ツールだ。 複数コンテナを利用する場合、コンテナ同士の依存関係の設定まで全てdocker-composeがカバーしてくれる。起動する順番が決まっている場合も、順番を設定して適切に起動できる。

使い方はさくらインターネットがほとんど説明してくれていたので、ここでは自分が利用しているパターンを記載する。

複数のDockerコンテナを自動で立ち上げる構成管理ツール「Docker Compose」(Dockerの最新機能を使ってみよう:第7回)

自分の利用パターン

自分はDockerを使う全ての環境で、docker-composeも合わせて利用している。Dockerとdocker-composeさえ入っていれば、どの環境でも設定なしでdocker-compose upとタイプするだけで全く同じ環境が立ち上がるからだ。 docker-compose downで関連コンテナを全て停止することができ、docker-compose buildとすればイメージが作り直されるし、docker-compose rmとすればコンテナが削除されるなど、大変使い勝手が良い。

Dockerfileが1つの場合

Dockerファイルが1つのプロジェクトで利用するdocker-compose.ymlはこのようになる。自分はどのプロジェクトでもこれを使いまわしている。例で挙げているのは、Railsのプロジェクトで利用しているやつ。 valumesオプションでカレントディレクトリのrailsプロジェクトをコンテナの/var/www/railsとして共有、exposeオプションでポートを開いている。portsオプションでポートのパイプを設定することで、ホストマシンから0.0.0.0:3000でアクセスできるようになる。

version: '2'
services:

  app:
    build:
      context: ./
    container_name: 'container-name'
    volumes:
      - ./:/var/www/rails
    ports:
      - 3000:3000
    expose:
      - 3000
    command: bash -c 'bundle install && puma -C config/puma.rb'

Dockerfileがいっぱいある場合

これは、rails+mysql+nginxのテンプレートであり、このリポジトリで公開しているものだ。

linkオプションでそれぞれのコンテナを繋げることができる。仕組み的には、繋げる先のアドレス等が自動的に環境変数に設される、とかだったと思う。それを利用することでコンテナの連携を実現する。 depends_onオプションを利用すると、指定した名前のコンテナの起動を待つことができる。これで、順番の問題を解決する。(今回なら、mysqlrailsnginxの順番で起動する)

version: '2'
services:

  nginx:
    build: './nginx'
    container_name: 'example-nginx'
    ports:
      - 80:80
    depends_on:
      - rails
    links:
      - rails:rails

  rails:
    build:
      context: ./rails
      args:
        app_name: example_app
    container_name: 'example-rails'
    volumes:
      - ./rails/example_app:/app/example_app # source code
    depends_on:
      - mysql
    links:
      - mysql:mysqld
    extends:
      file: ./mysql/mysql_env.yml
      service: env
    expose:
      - 3000
    command: bash -c 'bundle install && puma -C config/puma.rb'

  mysql:
    build: './mysql'
    container_name: 'example-mysql'
    volumes:
      - ./mysql/volumes:/var/lib/mysql # datastore
    extends:
      file: ./mysql/mysql_env.yml
      service: env
    expose:
      - 3306

results matching ""

    No results matching ""