LoginSignup
16
12

More than 3 years have passed since last update.

【ペチオブ】仮想環境ハンズオン 第5回 Docker Compose編

Last updated at Posted at 2021-04-05

Docker Composeハンズオン

ハンズオン資料

  1. Linux基礎編
  2. VirtualBoxハンズオン
  3. Vagrantハンズオン
  4. Dockerハンズオン
  5. Docker Composeハンズオン

今回の目的

今回の目的は、VirtualBox上にVagrantを使ってUbuntu OSのインストール、PHPの実行環境の構築を行います。

YouTube版 【ペチオブ】仮想環境ハンズオン 第5回 Docker Compose編

【ペチオブ】仮想環境ハンズオン 第5回 Docker Compose編

動画を高評価、チャンネル登録いただけるとより多くの方へオススメ表示されるので良いと思った方はご協力いただけるとありがたいです🙏

完成版

完成版はGitHubにプッシュしてます。

概要

Composeは、複数コンテナのDockerアプリケーションを定義して実行するためのツールです。

Docker単体だとコンテナ毎にコマンドやオプションをたくさん指定する必要がありましたが、複数のコンテナに対して実行できます。

ハンズオン

$ mkdir docker-compose-handson
$ cd docker-compose-handson

サンプルソースをgit cloneしておく

$ git clone https://github.com/ucan-lab/infra-handson-shop shop

php/Dockerfile

$ mkdir php
$ vim php/Dockerfile
FROM php:7.4-apache-buster

ENV DB_HOST=db
ENV DB_NAME=shop
ENV DB_USER=phper
ENV DB_PASS=secret

RUN apt-get update
RUN docker-php-ext-install pdo_mysql
  • DB_HOST=db ここだけDockerハンズオンと異なります。
    • コンテナ名ではなく、サービス名で接続できます。

mysql/Dockerfile

Dockerハンズオンと同じDockerfileを作ります。コピペしてきてもokです。

$ mkdir mysql
$ vim mysql/Dockerfile
FROM mysql:8.0

ENV MYSQL_DATABASE=shop
ENV MYSQL_USER=phper
ENV MYSQL_PASSWORD=secret
ENV MYSQL_ROOT_PASSWORD=secret

COPY ./my.cnf /etc/my.cnf

mysql/my.cnf

Dockerハンズオンと同じmy.cnfを作ります。コピペしてきてもokです。

$ vim mysql/my.cnf
[mysqld]
character_set_server = utf8mb4 # 文字コード
collation_server = utf8mb4_ja_0900_as_cs # 照合順序

docker-compose.yml

$ vim docker-compose.yml
version: "3.8"
services:
  web:
    build: ./php
    ports:
      - 8200:80
    volumes:
      - ./shop:/var/www/html

  db:
    build: ./mysql
    volumes:
      - db-storage:/var/lib/mysql

volumes:
  db-storage:

YAML (ヤムル)

YAML Ain't a Markup Language

インデント(字下げ)を使って、データの階層構造を表現する。
そのため、インデントが崩れると実行できなくなるので注意する。

docker-compose.yml オプション説明

  • version
  • services
    • コンテナを定義します。
    • web, db サービスを定義(サービス≒コンテナ)
  • build
  • ports
    • ポートを公開します。(ポート転送)
    • ホストのポート:コンテナのポート
  • volumes
    • ホストパスまたは名前付きボリュームをマウントします。
  • environment
    • コンテナ内で使用できる環境変数を追加します。

サービスのコンテナをビルド

$ docker-compose build

Building web

...

Successfully built b85983a00e56
Successfully tagged docker-compose-handson_web:latest

Building db

...

Successfully built 4077115f617f
Successfully tagged docker-compose-handson_db:latest

サービスのコンテナを作成、開始

$ docker-compose up -d
Starting docker-compose-handson_web_1 ... done
Starting docker-compose-handson_db_1  ... done
  • -d, --detach Detached mode: Run containers in the background, print new container names.
    • バックグラウンドでコンテナが起動します。

コンテナの一覧

$ docker-compose ps
            Name                          Command               State          Ports        
--------------------------------------------------------------------------------------------
docker-compose-handson_db_1    docker-entrypoint.sh mysqld      Up      3306/tcp, 33060/tcp 
docker-compose-handson_web_1   docker-php-entrypoint apac ...   Up      0.0.0.0:8200->80/tcp

補足1: Name

補足: db がサービス名、docker-compose-handson_db_1 がコンテナ名です。
db サービスは 3306/tcp, 33060/tcp のポートが起動してます。

補足2: Command

Commandに書かれてるコマンドが現在実行中、または最後に実行されたコマンドが表示されています。

補足3: State

コンテナのステータスです。
db, webサービスが起動(State: Up)していることを確認します。

補足4: Ports

  • db
    • 3306: 従来のMySQLプロトコルポート
    • 33060: Xプロトコルと呼ばれるMySQLの新しい接続方式のプロトコルポート
  • web
    • 0.0.0.0:8200->80: ホスト側の8200ポートへアクセスするとwebコンテナの80ポートへ

MySQL 初期データ設定

dbコンテナのmysqlコマンドを実行してMySQLへログインします。

$ docker-compose exec db bash
$ mysql -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DATABASE

テストデータを入れます。

create table shop.items (
  id int primary key auto_increment,
  name varchar(30) comment '商品名',
  stock int default 0 comment '在庫数'
) comment='商品テーブル';

INSERT INTO shop.items (name, stock) VALUE ("Apple", 10);
INSERT INTO shop.items (name, stock) VALUE ("Bad Apple", 1);

動作確認

ショップアプリがphpを実行してmysqlからデータの取得や更新が行えていればokです。

さいごに

お疲れ様でした!
Docker Compose ハンズオンいかがでしたでしょうか。
コンテナをまとめて起動、停止できる docker-compose はとても便利ですね。
ボリュームやネットワークの設定も簡単に行えるようになりました。

16
12
0

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
16
12