LoginSignup
1

More than 5 years have passed since last update.

Docker for Macを使った開発環境構築(その2)

Posted at

すっかり書くの忘れてた・・・
結局、実運用では使わなかったのですが、備忘録として書いておきます。

前提条件

  • MacOS ElCapitan 10.11.6
  • homebrew
  • iTerm2
  • Docker for Mac

今回の作業

  • Yii2をインストール

手順

Yii2のインストール手順は本家の情報を参照。

よく見たらphp-fpm使うって書いてあるしw
composer入れたら簡単そうなので、Dockerfileを変更

$ vim docker/php/Dockerfile

FROM php:7.1-fpm

# composer
RUN curl -sS https://getcomposer.org/installer | php \
  && mv composer.phar /usr/local/bin/composer

もう一度buildしてupする

$ docker ps
134b263e1290        docker_nginx        "nginx -g 'daemon ..."   7 minutes ago       Up About a minute   80/tcp, 443/tcp          nginx
31f12a55c2af        docker_php          "docker-php-entryp..."   7 minutes ago       Up About a minute   9000/tcp                 php
472f8a3774a4        docker_mysql        "docker-entrypoint..."   7 minutes ago       Up About a minute   0.0.0.0:3306->3306/tcp   mysql

出てきたPHPのCONTAINER IDを使って

$ docker exec -it 31f12a55c2af bash

すると今立ち上げたPHPのコンテナに入ってる(はず)

root@31f12a55c2af:/var/www/html# cd ../
root@31f12a55c2af:/var/www# composer global require "fxp/composer-asset-plugin:~1.3.1"
Changed current directory to /root/.composer
Do not run Composer as root/super user! See https://getcomposer.org/root for details
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
    Failed to download fxp/composer-asset-plugin from dist: The zip extension and unzip command are both missing, skipping.
A php.ini file does not exist. You will have to create one.
    Now trying to download from source
  - Installing fxp/composer-asset-plugin (v1.3.1): Cloning 0bfdd307d2

Installation failed, deleting ./composer.json.


  [RuntimeException]
  Failed to clone https://github.com/fxpio/composer-asset-plugin.git, git was not found, check that it is installed and in your PATH env.
  sh: 1: git: not found

怒られた・・・
1つはcomposerをrootで実行するなよーってことですが、まぁできないって言われているわけではない。
そのあとが問題。
zip extensionがないからunzipできない。で、代わりにソースをダウンロードしようとする。が、gitコマンドがないからそれも無理。

と言うわけで、zipとgitは入れておいた方が良さげですね。
ついでにpdoとか必要そうなものも追記(mcryptを入れるのにlibmcrypt-devが必要になります)

RUN apt-get update && apt-get install -y \
  git \
  zlib1g-dev \
  libmcrypt-dev \
  && docker-php-ext-install zip pdo_mysql mysqli mbstring mcrypt \

で、buildしてupする
buildし直すとコンテナのIDが変わってる場合があるのでもう一度調べてから入りましょう。

root@a5b45a615b40:/var/www# composer global require "fxp/composer-asset-plugin:~1.3.1"
Changed current directory to /root/.composer
Do not run Composer as root/super user! See https://getcomposer.org/root for details
./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing fxp/composer-asset-plugin (v1.3.1): Downloading (100%)
Writing lock file
Generating autoload files

今度はいけましたね。

root@a5b45a615b40:/var/www# composer create-project --prefer-dist yiisoft/yii2-app-basic basic
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Installing yiisoft/yii2-app-basic (2.0.12)
・・・
Could not fetch https://api.github.com/repos/jquery/jquery-dist/commits/1472290917f17af05e98007136096784f9051fab, please create a GitHub OAuth token to go over the API rate limit
Head to https://github.com/settings/tokens/new?scopes=repo&description=XXXXXXX
to retrieve a token. It will be stored in "/root/.composer/auth.json" for future use by Composer.
Token (hidden):

Tokenってなんやねん・・・と思って前を読むと、APIのリミットだから、github行ってtoken取得しなさいよって言われてる模様。書かれているパスに追記しておくと今後のcomposerで使えるっぽいけど、とりあえず後回し。
出てきたURL(Xは念のため伏せてますが、日付とか入ってるっぽい)にアクセスすると下の方にgenerate tokenのボタンが出ているのでポチり。
tokenが出てくるので、コピペすれば先に進みます。

Writing lock file
Generating autoload files
> yii\composer\Installer::postCreateProject
chmod('runtime', 0777)...done.
chmod('web/assets', 0777)...done.
chmod('yii', 0755)...done.

これで/var/wwwの下にbasicディレクトリが作られて・・・
と、ここまでやって気がついた。phpのvolumesに/var/wwwを追加していなかったことに・・・
そして色々エラー吐かれた後に最終的にはこんな感じに。

docker/docker-compose.yml

version: '2'
services:
  # DB
  mysql:
    container_name: "mysql"
    build: ./mysql
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: root
  # nginx
  nginx:
    container_name: "nginx"
    build: ./nginx
    ports:
      - "8080:80"
    volumes:
      - ./src/:/var/www/
    links:
      - php
      - mysql
  # php
  php:
    container_name: "php"
    build: ./php
    links:
      - mysql
    volumes:
      - ./src/:/var/www/
    environment:
      TZ: "Asia/Tokyo"
    ports:
      - "9001:9001"
    depends_on:
      - mysql

docker/nginx/Dockerfile

FROM nginx:1.11

ADD ./server.conf /etc/nginx/conf.d/default.conf

docker/nginx/server.conf
nginxのserver.confでcontainer_nameに指定した名前をfastcgi_passに指定する

server {
    charset utf-8;
    client_max_body_size 128M;

    listen 80; ## listen for ipv4
    #listen [::]:80 default_server ipv6only=on; ## listen for ipv6

    server_name localhost;
    root        /var/www/basic/web;
    index       index.php;

    access_log  /var/www/basic/log/access.log;
    error_log   /var/www/basic/log/error.log;

    location / {
        # 本当のファイルでないものは全て index.php にリダイレクト
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # 存在しない静的ファイルの呼び出しを Yii に処理させたくない場合はコメントを外す
    #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
    #    try_files $uri =404;
    #}
    #error_page 404 /404.html;

    # /assets ディレクトリの php ファイルへのアクセスを拒否する
    location ~ ^/assets/.*\.php$ {
        deny all;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass php:9000;
        #fastcgi_pass unix:/var/run/php5-fpm.sock;
        try_files $uri =404;
    }

    location ~* /\. {
        deny all;
    }
}

docker/php/Dockerfile

FROM php:7.1-fpm

# composer
RUN curl -sS https://getcomposer.org/installer | php \
  && mv composer.phar /usr/local/bin/composer

RUN apt-get update && apt-get install -y \
  git \
  zlib1g-dev \
  libmcrypt-dev \
  && docker-php-ext-install zip pdo_mysql mysqli mbstring mcrypt \

docker/mysql/Dockerfile

FROM mysql:5.6

これでbuildしてupした後で、ブラウザから
http://localhost:8080/index.php
にアクセスするとYii2のインストールページにあるCongratulations!と同じようなページが出るはず。

途中でこの構成ではやらないことになったので、自分で確認してるのはここまでです。
Yii2のページにあるrequirements.phpを実行するとgdとか足りないよってwarningが出ていたので、その辺をphpのDockerfileに書いてあげるといいと思います。
(このままでブラウザから「Contact」をクリックすると早速gdがーって叱られるはず)

この設定で書くとdocker/src/basicにcomposerで入れたYii2が入ってると。
basicディレクトリの下にlogディレクトリを作らないと、server.confのログ吐く場所がないのでエラーが出ます。

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
1