使用Docker徒手搭建自己的PHP开发环境
1.1 为什么使用Docker?
有这样的场景吗?你有一个项目,在本地开发的时候需要你搭建环境,放到线上的时候也需要搭建环境。到了公司,想要暗中玩,就需要搭建一个环境。如果它们不匹配,那是不够的。因为你有相当多的环境依赖。如果此时你有 Docker,只需在机器上安装 Docker 并放入写入的 Dickerfile。这将通过一行命令自动完成。它实用且高效。那不是很好吗?
1.2 准备工作
接下来,本文介绍如何搭建PHP开发环境。我们将使用 zPhal-docker files 作为示例。这是我为我的博客系统准备的一套Dockerfile。
现在无论是windows、mac还是linux,docker都可以很好的支持,包括windows系统。 win10系统下的Docker for Windows其实还不错,但是占用内存比较多。
通过Docker命令行我们可以做很多事情,拉取镜像、运行容器、执行容器中的命令等等,但是现在我们需要一种更简单粗暴的方式来编写docker文件,那就使用docker-compose管理好这些文件,简化操作流程。
什么是 Dockerfile?
Dockerfile 是由一系列命令和参数组成的脚本。这些命令应用于提取的基础映像并最终创建一个新映像。通过Dockerfile我们可以创建一个你需要的镜像,其中包含你想要安装的信息。该软件相当于提前定制了要安装的扩展、要执行的命令等,然后一键执行,大大简化了操作流程。
要按照本文搭建环境,你需要:
- 首先了解 Docker 以及 Docker 的一些基本特性以及 docker-compose 是什么。
- 然后你需要安装Docker和docker-compose,我将使用docker-compose来管理我的docker-files。
注意,编写docker文件是一个活的东西,而不是一个死的东西。每个人写的Dockerfile都会不一样,看你的需求。
Docker的官方文档说得很清楚。虽然是英文的,但是几乎什么都有。如果您有疑问,翻译该文档是非常明智的:Docker Documentation
2。开始输入
下一步是 zPhal- Docker files 就是一个例子。您可以点击链接查看完整版本。以下只是一个片段。 ? 在这个项目中我使用了PHP、MySQL、Nginx、Redis;以及Composer、Phalcon扩展等。
一般来说,我们有三个流程来做到这一点:为每个软件编写docker文件;编写配置文件;通过 docker-compose 处理所有 docker 文件,包括将配置配置文件拖放到将要构建镜像的 dockerfile 文件中。 ?有一个维护者。
接下来,定义时区。该语句定义在每个docker文件中,主要是为了同步所有容器与主机的时间。其实我们可以在docker-composer.yml文件中这样定义:
services:
php-fpm:
volumes:
- /etc/localtime:/etc/localtime:ro
但是当我们运行在非linux系统中,比如Windows时,我们无法获取/etc/localtime。为了更好的兼容所有平台,我将时间同步写入了docker文件中。
然后安装一些扩展。事实上,安装扩展的过程与我们在Linux中徒手安装PHP扩展的过程类似。值得一提的是作曲家。我直接在 php-fpm 镜像中安装了 Composer。事实上,Composer的官方镜像也提供了。拉取composer镜像并执行也可以达到目的,因为我们只是使用composer来执行composer命令来管理我们的包。如果composer是一个单独的容器的话,我们也可以在不使用的时候关闭该容器;但是这里我直接在 php-fpm 镜像中安装了composer,主要是因为我的项目安装了一些PHP扩展,并且在编写composer.json之后,当我编写文件时,我定义了扩展的依赖项,所以当composer执行时会检查环境是否有安装了这些依赖项。所以如果我直接使用composer镜像的话,我还得安装我在镜像中使用的扩展,这比较麻烦,所以我直接在php镜像中这样做了。其实没有什么区别,就看你怎么使用了。
2.2.2 Nginx
以下是Nginx的docker文件:
FROM nginx:1.12
# set timezome
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
这个就简单多了,我只设置了一个时间。因为我不需要安装其他东西,直接使用官方镜像就可以了。
当然我们需要修改配置文件。只要提前写好配置文件就可以了。最后,在 docker-compose.yml 文件中,放入配置文件。下面会讲到,包括PHP配置文件和MySQL配置文件。 , 全部都一样。
2.2.3 MySQL
以下是MySQL的docker文件:
FROM mysql:5.7
# set timezome
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
MySQL没有什么特别的,直接使用官方镜像即可。 ? PHP文件夹中,Nginx配置放在Nginx文件夹下。是否新建子文件夹视情况而定,如conf.d文件夹。
下面以Nginx配置文件为例。首先,nginx目录是这样的:
nginx/
conf.d/
default.conf
zphal.conf
Dockerfile
nginx.conf
除了nginx.conf之外,还有一个子文件夹conf.d,用于存放Linux下构建的所有域名配置文件。熟悉PHP环境的人应该很熟悉。这些配置文件就是我们当时传输到容器中的文件。我们不会在主机上使用这些文件。
所以最需要注意的是,配置文件中显示的路径是容器中环境的路径,而不是主机的路径。每个容器都有一个运行环境,这是一个小系统,这些路径都是容器内的路径。我们可以使用来挂载来与容器通信来同步文件。在命令行启动容器还需要挂载文件路径。现在我们也使用docker-compose来解决这一步。
以下是配置文件的示例:
server {
listen 80 default;
index index.html index.htm;
server_name localhost docker;
root /data/www;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.html;
}
location ~ \.php {
include fastcgi_params;
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/www/$fastcgi_script_name;
}
}
并且在 与php、nginx等文件夹同级,我们创建一个docker-compose.yml。当我们执行docker-compose相关命令时,会自动找到这个文件并根据里面的内容执行。 继续上面的nginx例子,我们先来说说挂载,因为这是最重要的一步。在docker-compose.yml中,nginx部分: 有一个volume参数。这里是我们要挂载的文件夹的相关配置。在第一点中,我们将 其他参数: 参数很多。更多信息请参考官方文档。 以下是完整的docker-compose.yml文件: ,我们该如何使用呢? 接下来,下载我们将使用的 PHP 扩展包。 docker会通过编写的docker-compose.yml内容自动构建镜像并启动容器。如果没有问题,下次启动时可以以守护进程模式启用,所有容器都会在后台运行: 使用 docker-compose。基本上就是这么简单,使用 stop、start 等这些命令来操作容器服务。更多的工作在于编写 dockerfile 和 docker-compose.yml 文件。 当我们想要使用composer时应该怎么做?我们已经在 php-fpm 中安装了 Composer。 使用docker-compose进行操作: 或者进入宿主应用目录,使用docker命令:root /data/www
、/data/gin中,并且是位于 ♷nx 处的容器的路径时间,而不是当前的时间。运行主机的路径,所以到时候我们会将Web应用程序的位置挂载到这个路径上。
2.4 编写docker-compose.yml
nginx:
build: ./nginx
depends_on:
- php-fpm
links:
- php-fpm:php-fpm
volumes:
- ../app:/data/www:rw
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ../logs/nginx:/var/log/nginx
ports:
- "80:80"
- "8080:8080"
- "443:443"
restart: always
command: nginx -g 'daemon off;'
../app
挂载到 /data/www
也是我们的配置文件中定义的默认侦听器根目录,而 app 目录是我们主机中的一个文件夹。通过这种方式挂载,我们就可以直接放我们的工程文件了。对于应用程序,docker会帮助您将其转移到容器中的/data/www
文件夹中。image:mysql:5.7
; php-fpm:php-fpm
,后面跟一个别名; 80:80
表示将 80 端口映射到主机上的 80 端口 version: '3.2'
services:
php-fpm:
build: ./php/
ports:
- "9000:9000"
links:
- mysql-db:mysql-db
- redis-db:redis-db
volumes:
- ../app:/data/www:rw
- ./php/php-dev.ini:/usr/local/etc/php/php.ini:ro
- ./php/php-fpm.conf:/usr/local/etc/php-fpm.conf:ro
- ../logs/php-fpm:/var/log/php-fpm:rw
restart: always
command: php-fpm
nginx:
build: ./nginx
depends_on:
- php-fpm
links:
- php-fpm:php-fpm
volumes:
- ../app:/data/www:rw
- ./nginx/conf.d:/etc/nginx/conf.d:ro
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ../logs/nginx:/var/log/nginx
ports:
- "80:80"
- "8080:8080"
- "443:443"
restart: always
command: nginx -g 'daemon off;'
mysql-db:
build: ./mysql
ports:
- "3306:3306"
volumes:
- ../data/mysql:/var/lib/mysql:rw
- ../logs/mysql:/var/lib/mysql-logs:rw
- ./mysql/conf.d:/etc/mysql/conf.d:ro
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: zphaldb
MYSQL_USER: zphal
MYSQL_PASSWORD: zphal123
restart: always
command: "--character-set-server=utf8"
redis-db:
build: ./redis
ports:
- "6379:6379"
volumes:
- ../data/redis:/data
restart: always
3。写成
3.1 使用构建环境
cd zPhal-dockerfiles/files
wget https://pecl.php.net/get/redis-3.1.6.tgz -O php/pkg/redis.tgz
wget https://codeload.github.com/phalcon/cphalcon/tar.gz/v3.3.1 -O php/pkg/cphalcon.tar.gz
docker-compose up
docker-compose up -d
docker-compose down
3.2 使用composer
docker-compose run --rm -w /data/www/zPhal php-fpm composer update
-w /data/www/zPhal
在php-fpm的工作空间中,zPhal项目也挂载在其中,所以我们可以直接在容器中运行composer 。cd zPhal-dockerfiles/app
docker run -it --rm -v `pwd`:/data/www/ -w /data/www/zPhal files_php-fpm composer update
4。注意事项
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。