主页 >> 程序猿的东西 >> 基于docker compose搭建LNMP环境(附带参数说明)

基于docker compose搭建LNMP环境(附带参数说明)

由于我们旧的PHP项目是基于PHP5.6的,这是一个日渐失去支持的版本,带来的麻烦就是开发环境(mac or win)许多包管理工具都找不到PHP5的包了,更不用说各种扩展,安装和调试都是极为麻烦的一件事情。为了让新入职的员工可以尽快完成环境搭建的工作,我们向docker寻求帮助,最终实现一键搭建标准的开发环境。

docker搭建LNMP环境的三种方法

单容器方法(不推荐)

单容器的方法类似传统的虚拟机方法。运行一个Linux容器,在容器内部配置NMP,好处是对于docker的新手来说,逻辑上比较好理解。这种方式虽然也可以运行起来,但是构建这样一个容器还是有点麻烦的,而且如果需要接入其他服务比如redis,你需要不断的编辑这个容器,这个过程可能比你本地搭建的过程还要复杂一点,因为通常容器内部的命令行工具都是极简版的,许多东西都没有。

举例来说,这种方式就好比把各种货物都装在一个集装箱里面,虽然省箱子,但是你要取货加货都是比较费劲的,所以体现不出来docker的优势。

堆栈式方法(可以了解下)

还有一种堆栈式方法,先建一个虚拟内网,再根据依赖关系层层堆砌,比如nginx需要依赖php-fpm,php依赖MySQL,就得先跑起来MySQL,再启动php,再启动nginx,就像堆栈那样层层叠加。这样的搭建方式基本不用编辑容器,也符合docker的精神了,但是你还是需要理清依赖关系,然后依次启动。首先,这个过程还是挺复杂的,启动一个环境需要输好多次命令,其次如果服务多起来,要理清顺序还是挺头疼的。

docker-compose方法(推荐)

docker-compose是docker官方工具之一,是一个容器编排工具,什么是容器编排呢。大概就是把上面说的那种容器之间的互通互联,依赖关系,以及网络配置端口映射写成配置文件,再由compose去把他们拼起来。这样就能实现一键部署。同时你要换服务版本也很容易,只需要拉下指定版本的官方镜像即可。

上代码

https://github.com/yszc/docker-lnmp

使用方法

启动:只需要在文件夹下执行docker-compose up -d,就可以了。完整的环境是包括了redis和memcache的。又比如说我们的办公室搭建了共享的开发用MySQL服务,我本地只需要启动nginx 和 php,不需要各种数据库,那我可以执行docker-compose up -d nginx php,就可以只启动nginx和php了。启动之后浏览器访问localhost/info.php就可以看到phpinfo。

增加项目:新的项目放在www文件夹下就可以直接访问了,比如你在www下放了一个phpmyadmin的文件夹,那么浏览器访问localhost/phpmyadmin直接就可以了。如果你希望通过制定域名访问项目,可以写nginx配置并放在docker/config/nginx/conf.d/文件夹下。不过有一点要注意的是,docker-compose搭建的内网中,你需要用容器名称来指定host。比如连接fpm,常规配置是127.0.0.1:9000,因为这里不在一个容器中,不能用127.0.0.1,但是也不用知道php服务的IP是什么,直接写配置为php:9000即可。其他的MySQL,redis等同理。

参数说明

咱们按照自顶向下的层级来看各个参数的含义

第一级:

  • version:这个不是自定义版本号,而是docker-compose语法版本,目前最新版是3,所以最好使用这个版本。
  • networks:配置网络,这个非必须,我在这里配置了一个局域网访问的桥接网络,桥接网络的意思是可以像宿主机一样接入局域网,因此会得到一个局域网的IP,跟宿主机同一个层级,可以在局域网内互相访问。
  • service:配置中的主要部分,各个容器的启动参数和关联关系。

service的第二级主要是定义各个服务的名称,看这一级你大致可以了解这个compose由哪些服务组成。

service的第三级是每个服务的配置参数:

  • container_name:容器名称,这个是可以自定义的。
  • build:php服务下有个build参数,指向一个dockerfile,表示通过dockerfile构建镜像,因为我们需要为php指定相关的扩展,标准的镜像不一定包含,因此我们需要自己构建。
  • image:就是镜像了,这里指向一个镜像地址,如果是dockerhub官方镜像直接指定镜像名称即可,如nginx:1.17.9,如果是其他来源则是一个URL风格的地址如daocloud.io/library/mysql:5.6
  • expose:向外开放哪个端口。
  • ports:端口的映射,比如mysql的配置中,3306:3306表示容器中的3306映射出来还是3306,冒号后面是容器内的地址。
  • volumes:与上面的风格类似,不过表示文件夹映射,同样的冒号后面表示容器内地址。
  • networks:容器使用什么网络配置,我们在上面配置了一个lan_access,可以指定给容器增加这个网络。
  • environment:设置容器内的环境变量,docker容器常常使用环境变量来设置参数,然后在运行的时候就可以指定配置参数。就像这里的MYSQL_ROOT_PASSWORD,表示MySQL容器的root密码。

参考

docker compose 官方文档:https://docs.docker.com/compose/compose-file/

dockerfile 官方文档:https://docs.docker.com/engine/reference/builder/

发表评论