新卒がエンジニアブログ立ち上げました(EC2+Docker)

Docker
この記事は約7分で読めます。

はじめまして。

今年の4月より、SAKURUGの新卒エンジニアとして在籍している中谷です。

本日よりSAKURUGで使われている技術や活動について発信し、読者の皆様にとって有益な情報を提供できたらと思います。

初回のテーマは、このSAKURUG TECHBLOGが始まるまでの経緯と目的、構築にあたりハマったところについてお話します。

本題に入る前に、簡単に僕の業務内容についてです。

・インターン生との社内ツール開発(PHP)
・バックエンドサーバ構築(LAMP)
・業務効率化(GAS)
・社内DBの移行業務(kintone)
・高校生インターン企画(エンジニアリング)
・社内勉強会の運用

社内業務をメインとする新卒エンジニアは僕が第一号ということで、色々な業務を振っていただいています。元々情報系の学生ではなかったため、基本的に全てが初めて触れる技術と業務で、毎日が新鮮です。

SAKURUGについて、詳しくはこちらから。

立ち上げの経緯

きっかけは、代表の遠藤からの「エンジニアブログ書いて!」という依頼でした。

手を挙げた人にチャンスが与えられるSAKURUGですが、このようにトップダウン的に生まれる業務も多くあります。

元々は、現在運用している社員ブログの1カテゴリとしての位置づけだったのですが、
「今後の発展性を踏まえ、エンジニアリングユニットで運用していけるようなものにしたい」と提案したところ、その場でOKをいただけました。

目的

冒頭で「有益な情報を提供できたら」と書きましたが、厳密には

①エンジニアの採用
②社内のナレッジ

この2つを目的としています。

現状、社内の開発体制はまだまだこれから、というフェーズにあります。

このブログが、エンジニアとしてSAKURUGに興味を持っていただけるきっかけとなるような場にしていけたらと思います。

少しハマったところ

開発環境:
・Amazon EC2
・Docker(20.10.7)
・Docker-Compose(1.29.2)
・WordPress(5.8.1)

流れ(ざっくりと)
①EC2インスタンス起動
②Dockerインストール
③Docker-Composeインストール
④コンテナ起動
⑤WordPress設定
⑥DNS設定
⑦SSL発行

至る所で躓きましたが、今回は⑤のWordPress設定に進む際、DB接続エラーにハマってしまったので、そこについて少しお話したいと思います。Docker初心者によるDocker初心者向けの内容です。

まず、④でコンテナを起動するにはdocker-compose.ymlを設定し、docker-compose up コマンドを実行する必要があります。
①~④のymlファイル設定手順は主にこちらの記事を参考にさせていただきました。

https://qiita.com/y-do/items/e127211b32296d65803a
https://docs.docker.jp/compose/wordpress.html

初めに追加したymlの中身はこちらです。

version: '3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpres
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

で、結論から言うとココさえ押さえておけば、コンテナ起動~WordPress立ち上げで躓くことは無いかと思われます。

version: '3'

services:
   db:
     image: mysql:5.7
     volumes:                              // ※1
       - db_data:/var/lib/mysql            // ホストの作業フォルダ'db_data'とコンテナの'/var/lib/mysql'を同期する
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress  // (1) MySQlのrootパスワード
       MYSQL_DATABASE: wordpress           // (2) MySQlのDB名
       MYSQL_USER: wordpress               // (3) MySQlのユーザー名
       MYSQL_PASSWORD: wordpress           // (4) MySQlのパスワード

   wordpress:
     depends_on:
       - db                                // 'db'が起動することで'wordpress'が起動される
     image: wordpress:latest
     ports:
       - "8000:80"                         // ホストのブラウザで':8000'にアクセス→コンテナの'80'に接続→WordPressの画面が返ってくる
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306          // DBに'db'を使用する。ポート番号は3306(デフォルト)
       WORDPRESS_DB_USER: wordpress        // =(3) MySQlのユーザー名
       WORDPRESS_DB_PASSWORD: wordpress    // =(4) MySQlのパスワード
volumes:                                   // ※2
    db_data:                               // ホストOSに'db_data'というデータ保存領域を作成

僕はこれまで、Laravelでの開発時に既にポート番号8000番を使用していたので、まずports:のポート番号を任意の値に変更する必要がありました。

WORDPRESS_DB_USER等はセキュリティ上任意の文字列への変更がマストですが、MYSQL_USER等の環境変数と一致させる必要があります。

そして今回ハマったのがvolumesの設定です。
何を血迷ったか、ymlの設定を編集する過程でこのvolumesの部分を削除してコンテナを起動してしまったため、固定IP紐づけ時にEC2インスタンスを再起動したところdocker deamonが停止してしまいました。これによりvolumeが作成できなくなってしまうので、コンテナから作り直しです。

因みに、※1のようにservises内で定義されるvolumesは「バインドマウント」と呼ばれ、/var/lib/mysqlの中のデータが永続化されるとともに、db_dataからコンテナ内のファイルを編集できるようになります。
一方、※2のようにトップレベルで定義するvolumesが「ボリューム」という概念です。Dockerコンテナ内でデータを保持するための領域を確保することでデータが永続化されます。

今回はDockerの基礎知識が無いままに構築してしまい、想定していたより工数が掛かる結果となりました。しかし、こうした失敗談をブログというかたちでアウトプットすることで少しづつ理解を深めていけたらと思います。構築にあたり、ご協力していただいた先輩方に感謝です。

今後も、このようなエンジニアネタを中心にSAKURUG TECHBLOGを更新予定ですので、是非お楽しみに!

参考:
https://matsuand.github.io/docs.docker.jp.onthefly/storage/bind-mounts/
https://qiita.com/tomokei5634/items/75d2501cfb968d0cfab5

タイトルとURLをコピーしました