4
4

More than 3 years have passed since last update.

コンテナ技術 ハンズオン Vol.3 Docker Compose編

Last updated at Posted at 2019-09-01
1 / 29

本題の前に


位置付け・前提

本記事は、社内ワークショップ のために用意したものです。そのため、次の前提で進めることをご理解ください。

また、本稿はこちらの続きとなります。

コンテナ技術 ハンズオン Vol.1 Docker操作編
コンテナ技術 ハンズオン Vol.2 Dockerイメージ編

目的や前提なども上記の内容に準拠します。


docker ハンズオン環境

今回も Play with Docker を活用してハンズオンを行います。

playwithdocker.png

※要:Docker Hub アカウント

注意点として、この環境は4時間の制限があります。4時間経過すると環境が削除されてしまう点を注意して下さい。

もちろんローカル環境でも構いません。


ハンズオンの前に


前回の問題(宿題)

前回のハンズオンで最後に出した問題はこちら。

Q1. CentOS を最新状態にアップデートして、nginx をインストール&起動した状態のDockerイメージ「nginx1」を作成してください。
Q2. 起動しているコンテナはホストのどのディレクトリにあるでしょうか。
Q3. dockerイメージはどこにあるでしょうか。
Q4. dockerのプロセスはどれか。

うまく ググれカス 答えられましたでしょうか。


前回の問題の解答


解答1. CentOS を最新状態にアップデートして、nginx をインストール&起動した状態のDockerイメージ「nginx1」を作成する方法

dockerfile
FROM centos
RUN /bin/yum update -y
RUN yum install https://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.8.1-1.el7.ngx.x86_64.rpm -y
RUN sudo yum clean all
ENTRYPOINT /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf
EXPOSE 80

yum のパッケージデータベースに無いので、こちらのURLから直接インストールするのがポイントです。

この dockerfile があるディレクトリで下記のコマンドを実行します。

docker build -t nginx1 .

これで nginx の Docker イメージが出来上がりました。下記のように確認できればOKです。

$ docker run -it -d -p 80:80 --name httpsvr nginx1
$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                NAMES
93832ab2a64d        nginx1:1.0          "/bin/sh -c '/usr/sb…"   24 seconds ago      Up 23 seconds       0.0.0.0:80->80/tcp   httpsvr

80番ポートに接続してみられます。


解答2. 起動しているインスタンスを一括停止するコマンド

以下のように対象インスタンスをたくさん並べる方法があります。

docker stop {コンテナID|NAMES} {コンテナID|NAMES} ...

以下のように対象インスタンスをすべて一発で停止する方法があります。

docker stop $(docker ps -q)

これ一発で完了です。誤操作すると困るので、数が多くなるとIDを指定した方が無難かも知れません


解答3. 起動しているインスタンスを一括削除するコマンド

おなじように対象インスタンスをたくさん並べる方法があります。

docker rm -f {コンテナID|NAMES} {コンテナID|NAMES} ...

-f で強制停止&削除となります。

こちらも以下のように対象インスタンスをすべて一発で停止する方法があります。

docker rm $(docker ps -q -a)

これ一発で完了です。誤操作すると困るので、数が多くなるとIDを指定した方が無難かも知れません


解答4. 起動しているイメージを一括削除するコマンド

おなじように対象となるイメージをたくさん並べる方法があります。

docker rm -f {イメージID|REPOSITORY} {イメージID|REPOSITORY} ...

-f で利用しているインスタンスの強制停止よび削除も併せて行います。

こちらも以下のように全イメージをすべて一発で削除する方法があります。

 docker rmi $(docker images -q)

これ一発で完了です。ただ、このコマンドは自分の検証環境以外ではかなり危険です。
誤操作すると困るので、数が多くなるとIDを指定した方が無難かも知れません


ハンズオン


今回のゴール

Docker Compose でコンテナを制御・ビルドできるようになる


今回やらないこと

  • Docker のリソースを制御できるようになる
  • Docekr のトラブルシューティングができるようになる
  • kubernetes などのオーケストレーションツールは使いません。

これから進める中で必ず理解しておいて欲しいこと

Docker-compose自体の知識は、こちらを読んで獲得してください。

Docker Compose入門

Docker Compose徹底解説

本ハンズオンは、上記のスライドの内容を理解している前提で進めます。

非常に分かり易い資料ありがとうございます。> Masahito Zembutsu様 (Qiita)


Docker Compose


Docker Compose とは

端的に言えば、下記のツールとなります。

Docker Compose とは


Docker Compose の利用意義

Docker Compose とは


Docker Compose の実例

Docker Compose とは

とても複雑な構成のコンテナたちを build して、run できます。


Docker Compose のメリット

Docker Compose とは

Docker Compose で複数のコンテナを連動させて運用していくハンズオンを行っていきます。


はじめての Docker Compose

こちらで試した WordPress + MySQL のコンテナを Docker-compose で起動してみます。

再び WordPressインスタンスの作成 - コンテナ技術 ハンズオン Vol.1 Docker操作編 - Qiita

Docker Compose では次のようにYAML形式のファイルを利用します。

docker-compose.yml
version: '3.1'          # YAMLバージョンの指定(ほぼ固定)
services:
  db:                   # コンテナの名前
    image: mysql:5.7    # ベースとするイメージ
    restart: always     # ダウンしたら再起動する
    environment:        # 以下で環境変数を指定する
      MYSQL_ROOT_PASSWORD: wppassword
      MYSQL_DATABASE: wp
      MYSQL_USER: wpuser1
      MYSQL_PASSWORD: password
  wp:                   # コンテナの名前 
    image: wordpress    # ベースとするイメージ
    ports:              # 通信ポートの紐付け
      - 8081:80         # {ホストOSの通信ポート}:{コンテナの通信ポート}
    links:              # コンテナ同士の紐付け(IPアドレス無しで通信可)
      - db:mysql        # {コンテナ名}:{別名}
    depends_on:         # 依存関係(どのコンテナが動作することを前提とするか)
      - db
    restart: always     # ダウンしたら再起動する
    environment:        # 以下で環境変数を指定する
      WORDPRESS_DB_HOST: db:3306
      WORDPRESS_DB_PASSWORD: password

ここでは、MySQL と WordPress を一気にイメージ化できる設定となります。

この docker-compose.yml があるディレクトリで、下記のコマンドを実行します。

docker-compose up -d

バックグラウンドでイメージ生成した後、コンテナ実行することができます。ちなみに、-d を外してフォアグラウンド実行すると、つらつらと実行ログが出力されたのち、アクセスログを確認できる状態になります。

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
f5f83c1f8db5        wordpress           "docker-entrypoint.s…"   6 minutes ago       Up 48 seconds       0.0.0.0:8081->80/tcp   dc1_wp_1
d1218cd9cc6b        mysql:5.7           "docker-entrypoint.s…"   7 minutes ago       Up 49 seconds       3306/tcp, 33060/tcp    dc1_db_1

docker-compose でもコンテナ(インスタンス)の起動状態を確認できます。

$ docker-compose ps
 Name                Command               State          Ports        
-----------------------------------------------------------------------
wp_db_1   docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp 
wp_wp_1   docker-entrypoint.sh apach ...   Up      0.0.0.0:8081->80/tcp

docker ps コマンドとは若干違う、簡潔な表示になっています。

次にインスタンスを停止するには、下記のコマンドで実行します。

docker-compose stop

この状態だとインスタンスが残ります。下記コマンドで確認しましょう。

docker-compose ps

停止するしているインスタンスを再開するには、下記のコマンドで実行します。

docker-compose start

次にインスタンスを停止・削除するには、下記のコマンドで実行します。

docker-compose down

これでインスタンスもイメージも消えました。下記コマンドで確認しましょう。

$ docker-compose ps
Name   Command   State   Ports
------------------------------

$ docker images ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

Docker Compose でイメージ作成&起動する

こちらで紹介されている手順を試してみます。

docker-compose.ymlでDockerfileを指定したい | cloudpack.media

下記3つの構成ファイルを作成してください。

docker-compose.yml
version: '3'

services:
  container1:
    build:                     # イメージのbuild指定
      context: .
      dockerfile: Dockerfile   # Dockerfileのパス指定
  container2:
    build:                     # イメージのbuild指定 
      context: .
      dockerfile: Dockerfile2  # Dockerfile2のパス指定
  container3:
    build: .
FROM python:3.6
FROM node:latest

この docker-compose.yml があるディレクトリで、下記のコマンドを実行します。

docker-compose up -d

このように一括ビルドすることも可能です。起動できていることが確認できたら削除しましょう。

$ docker-compose ps
     Name                  Command            State    Ports
------------------------------------------------------------
bd_container1_1   python3                     Exit 0        
bd_container2_1   docker-entrypoint.sh node   Exit 0        
bd_container3_1   python3                     Exit 0        

$ docker-compose down
Removing bd_container3_1 ... done
Removing bd_container2_1 ... done
Removing bd_container1_1 ... done
Removing network bd_default

$ docker-compose ps
Name   Command   State   Ports
------------------------------

$ docker images ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

ちなみに、build だけすることも可能です。

docker-compose build
---

違いを確認しておきましょう。

```shell
$ docker-compose ps
Name   Command   State   Ports
------------------------------

$ docker images ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

$ docker-compose up
Creating network "bd_default" with the default driver
Creating bd_container3_1 ... done
Creating bd_container1_1 ... done
Creating bd_container2_1 ... done
Attaching to bd_container3_1, bd_container1_1, bd_container2_1
bd_container3_1 exited with code 0
bd_container1_1 exited with code 0
bd_container2_1 exited with code 0

docker のローカルキャッシュしますので、images からは見えません。その代わり、up すると、Docker Hub/レジストリからは取得せずにインスタンスを起動します。

build に非常に時間がかかる場合には、分けて実行するのを推奨するケースもあるようです。


Docker Compose で簡易メールサーバーを構築する

少し実用的なサーバーを作ってみましょう。こちらで紹介されている手順を試してみます。

docker-compose + mailhogでローカルSMTPテストサーバを手軽に構築する

下記のファイルを作成してください。

docker-compose.yml
version: "3"
services:
  mail:
    image: mailhog/mailhog:latest
    ports:
      - "8025:8025"
      - "1025:1025"

このファイルがあるディレクトリで、コンテナを起動します。

docker-compose up -d

起動した後、8025 ポートにアクセスすると、受信メールの確認画面が使えます。1025 ポートは送信ポートなので、WEBアクセスしても画面表示はされません。

先の紹介ページのようにテストスクリプトやsendmailコマンドなどでメールの送信テストをしても良いかもしれません。

このように、インフラの検証などに利用しやすいシステムをすぐに用意するのに便利ですね。


Docker Compose で Djangoアプリケーションを構築する

Python などのフレームワークで開発した WEBアプリケーション を収めたコンテナを起動する、といっった使い方には、非常に有効です。

こちらで紹介されている手順を試してみます。

クイックスタート・ガイド:Docker Compose と Django — Docker-docs-ja 17.06.Beta ドキュメント

下記3つの構成ファイルを作成してください。

docker-compose.yml
version: '2'
services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000 # コンテナで実行する命令
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db          # dbインスタンス起動後に実行する
FROM python:2.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
requirements.txt
Django
psycopg2

この docker-compose.yml があるディレクトリで、Django プロジェクトを docker-compose コマンドを使って作成します。

docker-compose run web django-admin.py startproject composeexample .

ポイントは、イメージをビルドした後、Django プロジェクトを開始するコマンドをコンテナに送っているところです。

このように、フレームワークと組み合わせた複雑なコンテナを構築して利用することも簡単に実現できます。


Docker Compose で SNSサービス Mastodonインスタンスを構築する

複雑なサービスで構成されている、こちらのSNSサービス「Mastodon」を確認します。ここでは実際に構築しなくても構いません。

Mastodonは、build にかなりの時間がかかる設定ファイルの作りこみが必要なので、実際に起動できるようにするには少しハードルが高いです。別インスタンスを建てて実行する、あるいは時間のあるときにじっくり実行した方がよいかもしれません。

git clone https://github.com/tootsuite/mastodon
cd mastodon/
cp .env.production.sample .env.production
mkdir postgres
mkdir redis
docker-compose build
docker-compose run --rm web rake secret

git で clone したファイルに含まれる docker-compose.yml を使って、build および インスタンスの起動まで行います。

docker-compose.yml を見ると下記のサービスが含まれており、複雑に定義されていることが分かります。

  • ruby
  • redis
  • PostgreSQL
  • sidekiq

Mastodonコンテナ構成
引用:Docker応用チュートリアル:Mastodon

このように複雑な構成のシステムについて、コマンドほぼ一発で build & 起動するにも役立ちます。


Docker Compose リファレンス

Docker-compose の豊富な機能を活用するには、下記を参照するのが良いでしょう。


問題(宿題)

下記のサイトの docker-compose.yml のいずれかを実行してみましょう。

  • 【Docker】これは役に立つ!! docker-compose.ymlの例まとめ
    • Alfresco
    • Apache Kafka
    • Apache Zookeeper
    • asciinema.org
    • Bind9 Domain Name Server
    • Cloud9
    • CloudFlare
    • Concrete5
    • Confluence
    • Consul Cluster
    • Consul-Registrator
    • DataDog Agent & DogStatsD
    • DNS Update (RFC2136)
    • DNSimple DNS
    • DokuWiki
    • Drone
    • Drone Rancher Node Manager
    • Rancher ECR Credentials Updater
    • Elasticsearch
    • Elasticsearch 2.x
    • AWS ELB Classic External LB
    • Etcd
    • F5 BIG-IP
    • FBCTF
    • Ghost
    • GitLab
    • Gocd agent
    • Gocd server
    • Gogs
    • Grafana
    • Hadoop + Yarn
    • Janitor
    • Jenkins
    • Jenkins Swarm Plugin Clients
    • Kibana 4
    • Let's Encrypt
    • Liferay Portal
    • Logmatic
    • Logspout
    • Logstash
    • MariaDB Galera Cluster
    • Minecraft
    • MongoDB
    • Mumble
    • Netdata
    • Nuxeo
    • Odoo
    • OpenVPN
    • OpenVPN-httpdigest
    • OpenVPN-LDAP
    • Owncloud
    • Percona XtraDB Cluster
    • PHP Adminer
    • Plone 5.0
    • PointHQ DNS
    • PowerDNS
    • Prometheus
    • Puppet 4 .x (standalone)
    • px-dev
    • QuasarDB
    • RabbitMQ
    • rancher-security-bench
    • Registry
    • Registry Convoy
    • REX-Ray
    • RocketChat
    • Route53 DNS
    • ScaleIO NAS/DAS
    • Secrets Bridge
    • Secrets Bridge Agents
    • Sematext Docker Agent
    • Sentry
    • SonarQube
    • Sysdig
    • Sysdig Cloud
    • Taiga
    • TeamCity
    • Traefik
    • Turtl
    • Weave Scope
    • Wekan
    • Wordpress
    • XPilots

おわりに

今回は Docker Compose でコンテナを制御・ビルドする方法について、ハンズオンをしました。

あと少し Docker リソースを管理できるようになってくれば、ようやく現実的な運用に利用できる状態となってきます。

それはまた次のハンズオンで学習しましょう。

コンテナ技術 ハンズオン Vol.4 Docker管理編


参考

これまでに紹介した記事以外に、本ハンズオン資料を作成する上で下記の記事を参考にさせていただきました。

大変ありがとうございました。

4
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4