Maison  >  Article  >  développement back-end  >  Configurer l'environnement de développement PHP via Docker sur Mac

Configurer l'environnement de développement PHP via Docker sur Mac

不言
不言original
2018-04-21 13:54:058937parcourir

Le contenu de cet article concerne la configuration de l'environnement de développement PHP via Docker sur Mac. Il a une certaine valeur de référence. Maintenant, je le partage avec vous. Les amis dans le besoin peuvent s'y référer

Installation de Docker


Il existe de nombreux articles sur Internet concernant l'installation de docker sur MAC. Je ne le décrirai pas ici. D'ailleurs, il est recommandé d'utiliser l'accélérateur fourni par Alibaba Cloud ou Daocloud. .

Il est recommandé de lire cet article : https://blog.csdn.net/jiang_x...
Cet article est équivalent à la traduction chinoise du document officiel

Utilisez docker-compose Environnement de développement de configuration

Généralement, un environnement de développement PHP de base comprend PHP, PHP-FPM, un serveur WEB, une base de données MySQL et les services NoSQL associés tels que Redis ou Memcache. Je configure principalement les services via docker-compose.

Qu'est-ce que docker-compose

Docker-compose est un projet défini via un fichier YAML, qui contient un ou plusieurs services de conteneur. Le nom du fichier de configuration générale est : docker-compose.yml.

Structure du répertoire

Vous pouvez organiser le projet selon vos propres préférences. Voici la méthode que j'utilise. Le répertoire de l'application contient le code de l'application et les services. create services, some Le service nous oblige à créer l'image nous-mêmes. Dans un fichier Dockerfile, expliquez à quoi ressemble l'image que vous souhaitez. Lors de la création d'une image personnalisée, vous devrez peut-être également utiliser certains fichiers supplémentaires, tels que certains fichiers de configuration. Généralement, ces fichiers de configuration seront copiés dans l'image lors de la création de l'image.


MySQL

mysql est un service de données. Ajoutez d'abord un volume de données à ce service, puis utilisez ce volume de données dans ce service, et placez ici les données générées par la base de données, de sorte que même si nous supprimons. le conteneur , les données du service de données seront également conservées sur l'hôte et vous pourrez continuer à utiliser les données existantes lors de la prochaine création d'un conteneur. Sous volumes, ajoutez un volume de données nommé mysql :

volumes: mysql:   driver: local

Ajoutez ensuite un service nommé MySQL et précisez l'image utilisée par le service. Nous pouvons également utiliser le Dockerfile que nous avons créé nous-mêmes pour cette image. ou si vous ne prévoyez pas de personnaliser l'image, vous pouvez également utiliser celle prête à l'emploi. Ici, j'ai utilisé l'image mysql:5.7. Notez qu'il est préférable de définir la version spécifique à utiliser.

Il y a quelques variables d'environnement dans cette image. Nous pouvons définir leurs valeurs lors de la définition du service. Ici, je définis le mot de passe de l'utilisateur root, la base de données à créer, le nom d'utilisateur et le mot de passe. . Vous pouvez Vous pouvez modifier les valeurs de ces variables selon vos propres besoins.

Sur le service mysql, j'ai utilisé des volumes pour spécifier un volume de données MySQL. L'emplacement de montage est /var/lib/mysql du conteneur, qui est l'emplacement par défaut pour stocker la base de données. Parce que j'ai installé le service MySQL localement et que le port 3306 est occupé, j'ai précisé que le port 6306 est mappé au test 3306

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"

du conteneur qui se trouve maintenant dans notre fichier de composition. Pour un service appelé mysql, sous l'outil de ligne de commande, allez dans le répertoire où se trouve le projet et exécutez :

docker-compose up

Vous verrez ensuite le processus d'installation de l'image et de démarrage du conteneur sur le terminal , puis ouvrez un autre terminal de commande A, exécutez :

docker-compose exec mysql bash

pour entrer dans le conteneur mysql, puis entrez dans la base de données pour vérifier :

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密码,然后登陆进去,如图所示:


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

Résumé

À ce stade, nous avons installé l'environnement de développement PHP de base. Si vous devez installer des services tels que Redis ou Memcache, vous pouvez le faire vous-même.
Ce qui suit est le code source de mon projet, j'espère qu'il pourra vous aider, adresse git : https://github.com/xiaodingchen/docker-lnmp

Recommandations associées :

Utilisez Docker pour créer un environnement lnmp de service intégré

Créez un environnement de développement PHP dans Docker

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn