Docker for Windowsで環境構築してみる – その弐

Dockerチャレンジ

前回の続き。今回はしっかりコンテナを構築してみたいと思う。

ちなみにMac(macOS Sierra 10.12.6)で同じことやってもまったく問題なく動いた


前提

  • ホストマシン
    • Windows10 pro
      • バージョン 1703
      • ビルド 15063.540
  • Dockerバージョン
    • Client 17.06.1
    • Server 17.06.1
プロンプト 説明
λ CMDer(Windowsのターミナルソフト)
# Bash rootユーザ
$ Bash 一般ユーザ
> MySQL / MariaDB

ゴール

  • LEMP環境を作る
    • CentOS 7
    • Nginx 1.13
    • MariaDB 10.3
    • PHP 7.1
  • コンテナ同士リンクさせて動かす
    • 1コンテナ1プロセスルールを守る
  • オフィシャルのイメージを使う
  • 理解力を高めるためCLIでコツコツやる
    • Kitematicは使わない
    • Dockerfileは使わない
    • Docker composeは使わない

ディレクトリ

  • コンテナ化する際にマウントされるファイルを置く
  • ホストマシンのWindowsの任意の場所にプロジェクトフォルダを作り、/etcと/varを作っておく
    • Linux側と同じ階層になっていればわかりやすいので

コンテナの設計

  1. Nginx、PHP-FPM、MariaDBのイメージを落とす
  2. MariaDBコンテナを起動
  3. PHP-FPMコンテナにドキュメントルートをマウントし、MariaDBとリンクして起動
  4. NginXコンテナに設定ファイルをマウントし、PHP-FPMコンテナとリンクして起動

イメージを落とす

pullサブコマンドを使う。
コマンドだとイメージの検索はできてもタグを検索できない。
Docker Hubでバージョン確認しておく。

PHP

PHPのページ
7.1-fpmを使ってみる。

Nginx

nginxのページ
1.13を使ってみる

MariaDB

mariadbのページ
10.3を使ってみる

イメージの確認

不要なものが入ってしまっていたら、docker rmi <イメージ名>:<タグ名>で削除する。

コンテナ化する

runサブコマンドを使う。
個別に名前をつける。

イメージ名 コンテナ名 リンク時の名称
nginx:1.13 nginx
php:7.1-fpm php phpfpm
mariadb:10.3 maria mariadb
  • 最終的に太字の名前で扱う
  • そのためリンクされるコンテナ名はある程度適当な名前でOK
    • コンテナ名とリンク名は同じでもOK

MariaDB

イメージを元にコンテナとして起動させる。

  • --nameでコンテナに名前をつける
  • -eで環境変数を設定可能
    • rootのパスワードをpasswdに指定
  • -dでデタッチ(起動したままプロンプトに戻る)
  • -pでポート指定(ホスト側:コンテナ側)

起動確認。
STATUSUpになっていればOK

不要なコンテナを消すには、docker stop <コンテナ名>で停止させ、docker rm <コンテナ名>で削除。

コンテナ内のシェルにログインし、初期設定を行う。

  • -iでコンテナとホストでやり取りを可能にする
  • -tでやり取りを画面に反映させる

一般ユーザを作る。

  • ユーザ名 docker
  • パスワード docker

ユーザの確認。

とりあえずdockerという名前でデータベースを作っておく

コンテナから抜ける。

PHP-FPM

イメージを元にコンテナとして起動させる。

  • --nameでコンテナに名前をつける
  • -dでデタッチ(起動したままプロンプトに戻る)
  • -vでマウント
  • --linkでMariaDBとリンクさせる
    • リンク時に名前をつける必要がある

起動確認。
STATUSUpになっていればOK

コンテナ内のシェルにログインし、初期設定を行う。

  • -iでコンテナとホストでやり取りを可能にする
  • -tでやり取りを画面に反映させる

リンクの確認。

上記のような記述が何処かにあればリンクされている。
この場合は172.17.0.2がMariaDBコンテナ。

上記のような表示があれば環境変数も設定済み。

php拡張のインストール。
詳しくはDocker libraryを参照。

いろいろ入れておきたかったら docker-php-ext-install pdo pdo_mysql mbstring xml xmlrpc mysqlnd intl こんな感じで一変に入れておくと良い

問題なければコンテナから抜ける。

pdoなどをインストールしたので、再読込させるためにphpコンテナを再起動する。

Nginx

イメージを元にコンテナとして起動させる

  • --nameでコンテナに名前をつける
  • -dでデタッチ(起動したままプロンプトに戻る)
  • -vでマウント
  • -pでポート指定
  • --linkでPHP-FPMとリンクさせる
    • リンク時に名前をつける必要がある

起動確認。
STATUSUpになっていればOK

仕上げ

nginxの設定ファイルを作る

D:\Docker\project\etc\nginx\conf.d\virtual.conf

ここでの注意点は、”fastcgi_pass phpfpm:9000;””の部分。phpfpmはnginxからリンク設定した時につけた名前にしなければならない。
リンクの名前がわからなくなったら、phpfpmコンテナの/etc/hostsを見れば確認出来る。

設定ファイルを改めて作ったので、一度nginxコンテナをリロードする。
これは実際にNginXの設定を変えたら再読み込みが必要なのと一緒。

ドキュメントルートにphpファイルを置く

D:\Docker\project\var\www\html\index.php

ブラウザで確認する

ブラウザでlocalhost:8000を閲覧する。

MySQLクライアントソフトで接続する

HeidiSQLを使う。
MariaDB → PHP-FPMにリンク → NginXにリンク状態なので、NginXと同じアクセスが可能。
つまり接続先はlocalhostでOK。

  • ネットワーク種別: MySQL(TCP/IP)
  • ホスト名/IP: localhost
  • ユーザ: rootもしくはdocker
  • パスワード: passwdもしくはdocker
  • ポート: 3306

PHP-FPMからMariaDBにアクセス

PHP-FPMコンテナからMariaDBコンテナへのアクセスは先に確認したとおりmariadbで通る。

  • 接続先: mariadb
  • 接続ユーザ: docker
  • 接続パスワード: docker

D:\Docker\project\var\www\html\maria.php

このようなphpファイルを作り、ブラウザからlocalhost:8000/maria.phpでアクセスする。

Connection Success.と表示されればアクセスが成功。
エラーが出る場合はエラーメッセージが画面に表示されるので自分で調べる。