Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@roko18366758

docker初心者が、docker-compose.ymlの書き方をまとめる

docker-composeとは

複数のコンテナをまとめて管理するためのツール

docker-compose.ymlにコンテナの構成情報を定義することで、同一のホスト常の複数コンテナを一括管理できます。
docker-compose

Webアプリケーションの依存関係をまとめて設定できます。
複数のコンテナを的mて起動したり停止したりできる。

コンテナの構成情報をYAML形式のファイルとして管理できるため、継続的デプロイやインテグレーションのプロセスに置いて自動テストを行うときに環境構築でそのまま利用できる。

docker-compose.ymlの概要

versionによってかける内容が異なる。
今回かくのは、3.3です。

サンプルファイル

#バージョンの指定
version: "3"

#サービス定義
services:
  webserver:
    image: ubuntu
    ports:
     - "80:80"
    networks:
      - webnet
 redis:
   image: redis
   networks:
     - webnet

#ネットワーク定義
networks:
  webnet:

#データボリューム定義
volumes:
  data-volume:

イメージの指定

imagesを使って指定する。

#サービス定義
services:
  webserver:
    image: ubuntu

イメージのビルド

buildを使って指定する。

#サービス定義
services:
  webserver:
    build: . #カレントディレクトリ

カレントディレクトリにDockerfileも用意し、ベースイメージを指定する、
Dockerfileで指定されたイメージが自動ビルドされる。
contextでDockerfileがあるディレクトリを指定して、指定したファイルをDockerfileとして読み込める。

#サービス定義
services:
  webserver:
    build:
    context: /work
      dockerfile: Dockerfile-all

コンテナ内で動かすコマンドを指定

command: /bin/bash

entrypointを上書きすることも可能です。

コンテナ間の連携

logserverに連携したい場合は、以下のように書く。エイリアス名を付けたいときは「サービス名:エイリアス名」を書く

links:
  - logserver
  - logserver:log01

コンテナ間の通信

コンテナが公開するポートは、portsで指定。
ホストマシンのポート番号:コンテナのポート番号を指定するか、コンテナのポート番号のみを指定する。
コンテナポート飲みを指定したときは、ホストマインのポートはライダムな値が設定される。

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

ホストマシンへポートを公開せず、リンク機能を使って連携するコンテナにのみポートを公開するときはexpose

expose:
  - "3000"
  - "8000"

サービスの依存関係の定義

webserverコンテナを開始する前にdbコンテナとredisコンテナを開始したいとき

services:
  webserver:
    build:
    depends_on:
      - db
      - redis
 redis:
   images: redis
 db:
   image: postgres

depend_onがコンテナの開始の順序を制御するだけで、コンテナ上のアプリケーションが利用可能になるまで待つという制御を行わない。
=> アプリケーション側での制御が必要。

コンテナの環境変数の指定

enviroment:
  - HOGE=fuga
  - FOO

設定したい環境変数が多いときは、別ファイルに環境変数を定義して、そのフォイルを読み込みこともできる。

env_file:
  - ./envfile1
  - ./app/envfile2

コンテナ名の指定

container_name: コンテナ名

コンテナ名は一意でないといけない。

コンテナのデータ管理

ボリュームの指定

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

ボリュームの読み取り専用の指定

:roをつけると、読み取り専用になり、書き込みができなくなります。設定ファイルなどに付与。

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

ボリュームのマウント指定

別のコンテナから全てのボリュームをマウントするときは、volumes_fromにコンテナ名を指定する

volumes_from:
  - log

参考

プログラマのためのDocker教科書

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
roko18366758
都内で、WEBエンジニアとして働くゆるふわ女子です。 勉強のメモなどを残していく予定です、、、、。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
0
Help us understand the problem. What is going on with this article?