ホームページ  >  記事  >  バックエンド開発  >  Mac 上の Docker を使用して PHP 開発環境を構成する

Mac 上の Docker を使用して PHP 開発環境を構成する

不言
不言オリジナル
2018-04-21 13:54:058925ブラウズ

この記事の内容は、Mac 上で docker を使用して PHP 開発環境を構成することに関するものです。必要な友人に参考にしてください。docker のインストール


on MACについてはインターネット上にたくさんの記事があるのでここでは説明しません。ちなみに、Alibaba CloudまたはDaocloudが提供するアクセラレータを使用することをお勧めします。

この記事を読むことをお勧めします: https://blog.csdn.net/jiang_x...

この記事は、公式ドキュメントの中国語翻訳に相当します

docker-compose を使用して開発環境を構成します

一般的に基本的な PHP 開発環境には、PHP、PHP-FPM、WEB サーバー、MySQL データベース、および Redis や memcache などの関連 NoSQL サービスが含まれます。私は主に docker-compose を通じてサービスを構成します。

docker-compose とは

docker-compose は、単一または複数のコンテナー サービスを含む YAML ファイルを通じて定義されるプロジェクトです。一般的な構成ファイル名は docker-compose.yml です。

ディレクトリ構造

私が使用する方法は次のとおりです。アプリ ディレクトリには、サービスを作成するために必要なものがいくつかあります。 Dockerfile で、イメージをどのように表示するかを記述します。カスタム イメージを作成する場合、一部の構成ファイルなどの追加ファイルも使用する必要がある場合があります。通常、これらの構成ファイルはイメージの作成時にイメージにコピーされます。

MySQL

mysql はデータ サービスです。最初にデータ ボリュームをこのサービスに追加し、次にこのデータ ボリュームをこのサービスで使用し、データベースによって生成されたデータをここに配置します。これにより、コンテナーを削除してもデータは保持されます。データ サービスはホスト上にも保持され、次回コンテナを作成するときに、既存のデータを引き続き使用できます。ボリュームの下に、mysql という名前のデータ ボリュームを追加します:

volumes: mysql:   driver: local

次に、MySQL という名前のサービスを追加し、そのサービスで使用されるイメージを指定します。このイメージを作成するために作成した Dockerfile を使用することもできます。また、計画がない場合は、使用することもできます。イメージをカスタマイズするには、既製のイメージを使用することもできます。ここでは mysql:5.7 イメージを使用しました。使用する特定のバージョンを設定することが最善であることに注意してください。

この画像にはいくつかの環境変数があり、サービスを定義するときにそれらの値を設定できます。ここでは、root ユーザーのパスワード、作成するデータベース、ユーザー名、およびパスワードを設定できます。これらの変数の値を独自に変更する必要があります。

mysql サービスでは、ボリュームを使用して MySQL データ ボリュームを指定しました。マウント場所は、データベースを保存するデフォルトの場所であるコンテナーの /var/lib/mysql です。 MySQL サービスをローカルにインストールし、ポート 3306 が占有されているため、コンテナの 3306 にマップされるポート 6306 を指定しました

version: "3"services:  mysql:    image: mysql:5.7    environment:       MYSQL_ROOT_PASSWORD: "root"      MYSQL_DATABASE: "app"      MYSQL_USER: "app"      MYSQL_PASSWORD: "123456"    volumes:
      - ./services/mysql/data:/var/lib/mysql    ports:
      - "6306:3306"

Test

これで、コマンド ライン ツールに mysql というサービスが追加されました。プロジェクトが存在するディレクトリに入って実行します:

docker-compose up

次に、イメージをインストールし、ターミナル上でコンテナを起動するプロセスが表示されます。次に、別のコマンドターミナルを開いて、次のコマンドを実行します:

docker-compose exec mysql bash

mysql コンテナを入力して、 Enter データベースを確認してください:

mysql -uroot -pshow databases;
+--------------------+| Database           |
+--------------------+| information_schema |
| app                |
| mysql              |
| performance_schema || sys                |
+--------------------+5 rows in set (0.03 sec)

这个时候我们发现mysql容器已经可用了

php

定义一个解释 php 的服务,我打算自己创建这个服务用的镜像,所以用了 build,而不是 image 。我告诉了 docker 自己要创建的这个镜像要使用的那个 Dockerfile 文件的位置(./services/php/Dockerfile)。

volumes 下面是服务用的数据卷,我把 compose 文件所在目录下的 app 这个目录,挂载到了容器的 /www/html/app 这个位置上了。这样我可以直接修改项目的代码,然后立即看到结果;同时由于本机9000端口被占用,指定9090端口映射到容器的9000端口

php:    build:       context: ./services/php      dockerfile: Dockerfile    volumes:
      - ./app:/www/html/app    ports:
      - "9090:9000"

Dockerfile

构建 php 服务的镜像用的 Dockerfile 是 ./services/php/Dockerfile。FROM,设置了一下这个镜像要基于哪个镜像去创建,我用了 php:7.1-fpm 这个官方提供的镜像。RUN 了几行命令,主要是去安装一些软件包,比如一些额外的 php 扩展。在安装这些扩展之前 ,你需要先安装扩展依赖的一些其它的软件包,这里的 libpng12-dev,libjpeg-dev,就是 gd 这个 php 扩展需要的软件包。然后我又 COPY 了配置文件到镜像里面。

FROM php:7.1-fpm
RUN apt-get update && apt-get install -y libpng12-dev libjpeg-dev \
  && rm -rf /var/lib/apt/lists/* \
  && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
  && docker-php-ext-install gd mysqli pdo_mysql zip opcache
COPY ./config/php.ini /usr/local/etc/php/conf.d/php.ini

php服务中遇到的坑

PHP这个镜像中软件是使用的Debian的源,因为众所周知的缘故会导致镜像安装不成功,如图所示:


这个时候我们就需要更换源了,第一次换成了中科大的源,然后发现不行,第二次更换成了阿里云的源,完美完成镜像安装,修改过后的Dockerfile如下:

FROM php:7.1-fpm
RUN sed -i 's/deb.debian.org/mirrors.aliyun.com/g' /etc/apt/sources.list \
  && apt-get update && apt-get install -y libpng12-dev libjpeg-dev \
  && rm -rf /var/lib/apt/lists/* \
  && docker-php-ext-configure gd --with-png-dir=/usr --with-jpeg-dir=/usr \
  && docker-php-ext-install gd mysqli pdo_mysql zip opcache
COPY ./config/php.ini /usr/local/etc/php/conf.d/php.ini

使用sed命令搜索软件源文件,把Debian域名修改为阿里云域名

php.ini

自定义的 php 配置。把你想要的 php 配置放到这个文件里,重新 build 镜像,然后再次启动 php 服务的时候会用新的镜像重新创建容器,这样配置就会生效了。

memory_limit = 256Mpost_max_size = 100Mupload_max_filesize = 100M

Nginx

用 image 指定了要使用的镜像,ports 设置了发布的端口号,让主机上的 8000 对应容器的 80 。depends_on 可以设置服务的依赖,我让 nginx 服务依赖之前定义的 php ,这样会先启动 php ,然后再启动 nginx 。

另外我又用了 volumes 自己设置了一个数据卷,让主机上包含 nginx 配置文件的目录,对应容器里的 nginx 服务的配置文件目录,这样我就可以直接在本机上修改 nginx 的配置文件,然后重新启动一下 nginx 服务,配置就可以生效了。这种方法适用在开发环境上,因为修改了配置不需要重新 build 镜像,在生产环境中,你需要自己 build 这个 nginx 镜像,把想要的配置直接复制到镜像里去。在开发阶段有的时候我们需要查看nginx的日志,然后我配置了日志目录映射到容器,最后一个地址是代码目录

nginx:    image: nginx:1.12.2    ports:
      - "8000:80"    depends_on:
      - php    volumes:
      - ./services/nginx/config:/etc/nginx/conf.d
      - ./services/nginx/logs:/etc/nginx/logs/
      - ./app:/www/html/app

app.conf

./services/nginx/config/app.conf,这是一个最基本的 nginx 配置文件,设置了应用的 root 是在 /www/html/app 这里,我们已经把主机上的 app 目录挂载到了容器里的 /www/html/app 这个地方。

注意这条指令:fastcgi_pass php:9000; 这里的 php 是我们定义的 php 这个服务的名字,在 compose 文件里定义的服务,它们之间可以使用服务的名字相互进行沟通,因为 docker 内置了 DNS 功能。

server {    listen       80;    server_name  localhost;    root         /www/html/app;    # access_log  /etc/nginx/logs/app.access.log  main;

    location / {        
    index  index.html index.htm index.php;       autoindex   on;
    #        include     /usr/local/etc/nginx/conf.d/php-fpm;#        include     /usr/local/etc/nginx/conf.d/pathinfo.conf;
     if (!-e $request_filename) {                        ###一级目录下
                        rewrite ^/(.*)$ /index.php/$1 last;                        ###域名下的二级目录
                        #rewrite ^/html/(.*)$ /uuabc_home/index.php/$1 last;
                }   
    }    location = /info {        allow   127.0.0.1;        deny    all;
    }   location ~ \.php(.*)$  {            # comment try_files $uri =404; to enable pathinfo
            # try_files $uri =404;
            fastcgi_pass                php:9000;            fastcgi_index               index.php;            fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;            fastcgi_param PATH_INFO $fastcgi_path_info;            fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;            include /etc/nginx/fastcgi_params;
        }   # error_page  404     /404.html;
   # error_page  403     /403.html;}

启动

经过上面几个步骤,我们已经把PHP开发最基本的搞好了,下面我们准备看下成果。
在 app 目录下创建一个 index.php ,内容是:

<?php 

    phpinfo();

进入到项目下面,执行:

docker-compose up

打开浏览器访问 http://localhost:8000/,结果如图所示:


连接数据库

在app目录有一个adminer.php文件,这个文件是一个类似于PHPmyadmin的数据库管理工具,比较轻量级,访问http://localhost:8000/adminer.php,如图所示:


在表单服务器选项中填写mysql,用户名root,密码填写安装MySQL服务时的root密码,然后登陆进去,如图所示:


然后我们就可以愉快的管理数据库了。

概要

この時点で、基本的な PHP 開発環境がインストールされました。Redis や memcache などのサービスをインストールする必要がある場合は、自分で行うことができます。
以下は私のプロジェクトのソース コードです。お役に立てば幸いです。git アドレス: https://github.com/xiaodingchen/docker-lnmp

関連する推奨事項:

docker を使用して統合service lnmp 環境

Docker で PHP 開発環境を構築する

以上がMac 上の Docker を使用して PHP 開発環境を構成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。