簡単!DockerでPHP環境構築

先日美容院にいったら小学校以来の短さになったノリフミです。

Dockerについてシリーズ物で記事を書こうとおもっていたのですが、まずは元になる記事をかかねば…
ということで、今回は簡単にPHP環境を構築していきます。

目次

今回の妄想


ア○パ○マ○みたいになってしまいました、、、

今回の妄想は、サーバーやローカルなどでDockerを使い、各プロセスを独立して構築し稼働させることです。
これはDockerの思想?理念?である「1コンテナ1プロセス」に乗っ取った構築図になります。「1コンテナ1プロセス」については色々と論争が絶えないようですが、見なかったことにして進めます。

「簡単」が目標のため、Dockerfileを弄って云々はしません!
コマンドのみで公式debian imageを使って進めますので悪しからず。

Dockerでブリッジネットワークを構築

Dockerで独立して構築したコンテナを相互接続できるようにブリッジネットワークを構築していきます。

既にインストール時に、3種類のネットワークが構築されていますが、分かり易いように独自ネットワークを使いたいと思います。

# dockerブリッジネットワーク構築
docker network create -d bridge --subnet 192.168.99.0/16 --gateway 192.168.99.1 example_nw

「example_nw」は構築するブリッジネットワークの名前になります。
任意で設定してください。

作成が終われば、作成したネットワークを確認しておきます。

# ネットワーク詳細確認
docker network inspect example_nw
[
  {
    "Name": "example_nw",
    "Id": "hashhogehoge",
    "Created": "2017-11-06T00:15:36.163888222Z",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": {},
      "Config": [
        {
          "Subnet": "192.168.99.0/16",
          "Gateway": "192.168.99.1"
        }
      ]
    },
    "Internal": false,
    "Attachable": false,
    "Ingress": false,
    "ConfigFrom": {
      "Network": ""
    },
    "ConfigOnly": false,
    "Containers": {},
    "Options": {},
    "Labels": {}
  }
]

※ ブリッジネットワーク内のコンテナは設定しているコンテナ名やIPアドレスでアクセスすることが可能です。

Dockerでmysqlを動かす

コンテナを再構築時にもデータを保持できるように、mysqlデータ用のディレクトリをホストに作成しておきます。

mkdir ~/example/mysql

Docker imageはDocker Hubより適当に拝借します。

# docker mysql構築
docker run -d --name mysql \
-v ~/example/mysql:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root_user_pass \
-e MYSQL_DATABASE=example_db \
-e MYSQL_USER=example_user \
-e MYSQL_PASSWORD=example_user_pass \
--net=example_nw \
--ip=192.168.99.100 \
mysql:latest
Unable to find image 'mysql:latest' locally
latest: Pulling from library/mysql
85b1f47fba49: Pull complete
5671503d4f93: Pull complete
3b43b3b913cb: Pull complete
4fbb803665d0: Pull complete
05808866e6f9: Pull complete
1d8c65d48cfa: Pull complete
e189e187b2b5: Pull complete
02d3e6011ee8: Pull complete
d43b32d5ce04: Pull complete
2a809168ab45: Pull complete
Digest: sha256:hashhogehoge
Status: Downloaded newer image for mysql:latest
hashhogehoge

※ 使用するimageがホストにない場合は初期構築に時間を要します。

mysqlデータ永続化確認

# mysql接続
docker exec -it mysql mysql -u example_user -p example_db
Enter password: 
# テーブル生成 
create table example_tb (id int); 
Query OK, 0 rows affected (0.04 sec) exit; 

# docker-mysql再構築 
docker stop mysql && docker rm mysql 
docker run -d --name mysql \ 
-v ~/example/mysql:/var/lib/mysql \ 
-e MYSQL_ROOT_PASSWORD=root_user_pass \ 
-e MYSQL_DATABASE=example_db \ 
-e MYSQL_USER=example_user \ 
-e MYSQL_PASSWORD=example_user_pass \ 
--net=example_nw \ 
--ip=192.168.99.100 \ 
mysql:latest

再度mysqlに接続し、テーブル確認。

docker exec -it mysql mysql -u example_user -p example_db
Enter password: 
show tables; 
+----------------------+
| Tables_in_example_db |
+----------------------+
| example_tb           |
+----------------------+
1 row in set (0.00 sec)  exit;

Dockerでphp-fpmを動かす

nginxもありますが、先にfpmを構築していきます。

プロジェクト用のディレクトリと簡単なindexファイルを作成しておきます。

mkdir ~/example/src
vi ~/example/src/index.php
<?php
// pdoインスタンス生成
$pdo = new PDO('mysql:host=mysql;dbname=example_db;charset=utf8', 'example_user', 'example_user_pass');
// テーブルリスト取得
$result = $pdo->query('SHOW TABLES')->fetch(PDO::FETCH_ASSOC);
// テーブルリスト表示
echo "example_db table list<br>";
foreach ($result as $row) { echo "{$row}<br>"; }

Docker imageはDocker Hubより適当に拝借します。

# docker php-fpm構築
docker run -d --name php-fpm \
-v ~/example/src:/var/www/html \
--net=example_nw \
--ip=192.168.99.111 \
php:fpm
Unable to find image 'php:fpm' locally
fpm: Pulling from library/php
85b1f47fba49: Already exists
d8204bc92725: Pull complete
92fc16bb18e4: Pull complete
9859644f2c58: Pull complete
eed3518188ca: Pull complete
33c8f7623948: Pull complete
3211acc287de: Pull complete
83bc6e66e57e: Pull complete
c15398ec94ed: Pull complete
Digest: sha256:hashhogehoge
Status: Downloaded newer image for php:fpm
hashhogehoge

※ 使用するimageがホストにない場合は初期構築に時間を要します。

公式imageにデフォルトでmysqlと連携可能なimageが見つからなかったため、手動でインストールしておきます。

# pdo pdo_mysqlインストール、再起動
docker exec php-fpm docker-php-ext-install pdo pdo_mysql
docker restart php-fpm

Dockerでnginxを動かす

nginxの設定ファイルを作成しておきます。

# 設定ファイル用ディレクトリ生成
mkdir ~/example/conf
# nginx設定ファイルを生成
# ドメインは適宜設定しなおしてください
vi ~/example/conf/nginx.conf
server {
 listen 80;
 root /var/www/html;
 server_name example.com;
 index index.php;
 location / {
  try_files $uri $uri/ /index.php?$query_string;
 }
 location ~ \.php$ {
  fastcgi_pass php-fpm:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
  fastcgi_read_timeout 300;
  include fastcgi_params;
 }
 sendfile off;
}

今回はホストの80ポートをポートフォワードさせて、ホストに飛んできたアクセスをdocker nginxに向くように構築します。

# docker nginx構築コマンド
docker run -d --name nginx \
-p 80:80 \
-v ~/example/src:/var/www/html \
-v ~/example/conf/nginx.conf:/etc/nginx/conf.d/example.conf \
--net=example_nw \
--ip=192.168.99.110 \
nginx:stable
Unable to find image 'nginx:stable' locally
stable: Pulling from library/nginx
bc95e04b23c0: Pull complete
f473e7d72364: Pull complete
82cca2490d0d: Pull complete
Digest: hashhogehoge
Status: Downloaded newer image for nginx:stable
hashhogehoge

接続確認

設定したドメインにアクセス可能か、mysql接続が問題ないかを確認します。

ブラウザからアクセス確認した画像
成功!

まとめ

1コンテナ1プロセス…
ローカルmysqlをrdsに変更する場合など、参照先を変更して対象コンテナを削除するだけで、なかったことになるので便利は便利です。

ただ、公開サービスで「リソース監視したい!」と思うだけで
→ munin導入する…?
 → 1コンテナ複数プロセスになる…
  → 実行管理がデフォルトで出来ない…?
   → …etcetc
壁がすごい…

マイクロサービスの運用などには非常に有用ですが、適切に管理するためにはそれなりに知識が必要です。
また機会があればdockerfileやcompose、複数プロセス対応など記事にしたいと思います。

それでは。
 

釣りを始めてみた

Youtubeを見ていたら楽しそうだったので釣りを始めてみました。

道具を持っていなかったので揃えるところから

ロッド
ダイワ(Daiwa) スピニングロッド クロスビート 965TMFS

リール
シマノ スピニングリール 17 セドナ 4000

ライン
メジャークラフト ライン 弾丸ブレイド 4本編み 200m

ショックリーダー
ヤマトヨテグス(YAMATOYO) フロロ ショックリーダー 20m

スナップ
がまかつ(Gamakatsu) 音速パワースナップ(徳用) 2 M

ルアー
メジャークラフト ルアー メタルジグ ジグパラ ショート 30g #1 イワシ JPS-30
Major Craft(メジャークラフト) ジグパラ TG タングステン
メジャークラフト ジグパラ ワインド スタートキット 夜光ヘッド + 各色 JPW-SET
ダイソーの100円ジグ
etc…

運動にもなりそうなのでルアー釣りにしてみました。

道具が揃ったところで下準備

1. リールにPEラインを巻く
2. PEライン(道糸)にショックリーダーを結ぶ
3. ショックリーダーにスナップを結ぶ

写真を撮り忘れ説明も難しいので方法はgoogle先生に聞いてみてください…
特に道糸とショックリーダーを結ぶのにFGノットという結び方をしたのですが難しかったです。

実際に何度か釣りに行ってきました。

これまで釣れた魚
・タチウオ

・サゴシ

・サバ

・イワシ
・エソ
Youtubeのおかげで初めてなのに魚が捌けるようになってました。

これまで無くしたルアーの数:5・・・
初心者は多めに持っていたほうがよさそうです。

年内の目標

・ツバス
・イカ
・シーバス

 

SPLOUTでは釣りが好きな仲間も募集しています。

福利厚生のご紹介

こんにちわ。
リエです。
 
晴れの日が続いていますが、この時期は朝晩と日中の気温差が大きいので、気温の変化に体調を崩してしまった方も多いのではないでしょうか。
弊社も風邪を引いている社員がちらほら。
 
これからの季節は特に空気が乾燥してくるということで、先日社内の加湿器のお掃除をしました。(もう毎日使っています)
余談ですが、この2015年のブログに書いた卓上加湿器(自前)は使って1.2ヶ月で壊れました。

風邪・インフルエンザ予防対策に力を入れてみた


 
機械と相性の悪いリエです。
毎年1回は絶対PCかiPhoneを修理に出しています。(なんの呪いでしょうか)
自損故障ではなく全て自然故障か初期不良なんですが、なぜ初期不良に当たる確立が高いのか誰か教えてください。
 
という話は置いておき、これから冬本番にかけて流行ってくるのが「インフルエンザ」
ただただしんどいにくいやつです。

 
弊社は社員の健康を守るということで、福利厚生として毎年希望する社員に対してインフルエンザの予防接種を受けてもらっています。
※ほぼ全員毎年受けています。
今年も希望者全員に接種してもらいました。
 
接種していてもインフルエンザに感染する可能性はありますが、症状が軽減するなどメリットがあります。
もちろん予防接種だけでなく、普段からうがい・手洗いなど基本的な風邪予防も大切です。
マスクとアルコール消毒を社内に常備しているので、社内での対策も行っています。
 
ちなみに健康を守るという福利厚生は他にはしかの予防接種もあります。(昨年流行した際に急遽導入しました)

麻疹(はしか)の予防接種を福利厚生に取り入れてみました


 
今年もあと2ヶ月!
体調に気をつけて頑張りたいと思います。

Go言語をさわってみた

にゃんこスターから目が離せないマエダです。
 
全然にゃんこスターと関係ないんですけど、重い腰をあげてGo言語をさわってみました。
https://golang.org/
 

 
Macでは
brew install go
※ brew updateをするといいかも。
 
まずはHello Worldですよね。
 
vi hello.go
 

go build hello.go
./hello
 

Hello World!!

 
 
はい。
 
 
そう。
 
 
ほんとにさわってみただけです。
 
 
シンプルなシンタックスでとっつきやすいのにGoルーチンを利用してかんたんに並列プログラミングできちゃうそうです。
 
go f()
 
Go使えるようになるとモテそうなので頑張りたいと思います。爆

RubyWorld Conference 2017にお邪魔しています(2日目)

こんにちわ。
リエです。
 
昨日からRubyWorld Conference2017にお邪魔しています。

RubyWorld Conference 2017にお邪魔しています(1日目)


 
2日目の今日は、せっかく島根県に来たということで、Conference前に松江城に行ってきました。

ヒールで登っているのは、わたしだけでした。。(当たり前)
天守閣まで上り、島根の景色を高台から見てきましたよ。
お天気がとてもよかったので、遠くまでよく見えました。
 
歴史に触れた後は、会場へと向かいました。

 
1階の大展示場にはスポンサーパネルが設置されていて、弊社のロゴも発見♡

どこにあるかわかりますか?
 
2日目の今日もたくさんの方が来られていました。
外国人の方も多く、Rubyは世界中の開発者に愛されているのですね。
 
講演は20分〜30分のものが多く専門的な話ではありますが、わかりやすく解説されているので、楽しく聞くことができました。

2日間に渡ってのConference参加は初めてでしたが、刺激を受けることができとても貴重な体験でした。