이 글의 내용은 Mac에서 docker를 통해 PHP 개발 환경을 구성하는 내용입니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다.
Docker 설치에 대해 on MAC 인터넷에 글이 많아서 여기서는 설명하지 않겠습니다. 참고로 Alibaba Cloud나 Daocloud에서 제공하는 가속기를 사용하는 것이 좋습니다.
이 기사를 읽는 것이 좋습니다: https://blog.csdn.net/jiang_x...
이 기사는 공식 문서의 중국어 번역과 동일합니다.
일반적으로 기본 PHP 개발 환경에는 PHP, PHP-FPM, WEB 서버, MySQL 데이터베이스 및 Redis 또는 memcache와 같은 관련 NoSQL 서비스가 포함됩니다. 저는 주로 docker-compose를 통해 서비스를 구성합니다.
docker-compose는 단일 또는 다중 컨테이너 서비스를 포함하는 YAML 파일을 통해 정의된 프로젝트입니다. 일반 구성 파일 이름은 docker-compose.yml입니다.
내가 사용하는 방법은 다음과 같습니다. 서비스 아래에는 서비스를 생성하는 데 필요한 항목이 있습니다. . Dockerfile에서 원하는 이미지 모양을 설명합니다. 사용자 정의 이미지를 생성할 때 일부 구성 파일과 같은 일부 추가 파일을 사용해야 할 수도 있습니다. 일반적으로 이러한 구성 파일은 이미지를 생성할 때 이미지에 복사됩니다.
mysql은 데이터 서비스입니다. 먼저 이 서비스에 데이터 볼륨을 추가한 다음, 이 데이터 볼륨을 이 서비스에 사용하고 데이터베이스에서 생성된 데이터를 여기에 넣습니다. 그러면 컨테이너를 삭제하더라도 데이터가 데이터 서비스는 다음 번에 컨테이너를 생성할 때 호스트에도 유지됩니다. 기존 데이터를 계속 사용할 수 있습니다. 볼륨 아래에 mysql이라는 데이터 볼륨을 추가합니다.
volumes: mysql: driver: local
그런 다음 MySQL이라는 서비스를 추가하고 서비스에서 사용하는 이미지를 지정합니다. 또한 이 이미지를 생성하기 위해 생성한 Dockerfile을 사용할 수도 있습니다. 이미지를 사용자 정의하기 위해 이미 만들어진 이미지를 사용할 수도 있습니다. 여기서는 mysql:5.7 이미지를 사용했습니다. 사용할 특정 버전을 설정하는 것이 가장 좋습니다.
이 이미지에는 몇 가지 환경 변수가 있습니다. 서비스를 정의할 때 해당 값을 설정할 수 있습니다. 여기서는 루트 사용자의 비밀번호, 생성할 데이터베이스, 사용자 이름 및 비밀번호를 설정할 수 있습니다. 이 변수의 값을 수정해야 합니다.
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"
이제 명령줄 도구에 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 的服务,我打算自己创建这个服务用的镜像,所以用了 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"
构建 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这个镜像中软件是使用的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 配置。把你想要的 php 配置放到这个文件里,重新 build 镜像,然后再次启动 php 服务的时候会用新的镜像重新创建容器,这样配置就会生效了。
memory_limit = 256Mpost_max_size = 100Mupload_max_filesize = 100M
用 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
./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를 사용하여 통합된 프로젝트 생성 서비스 lnmp 환경
위 내용은 Mac에서 docker를 통해 PHP 개발 환경 구성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!