`
xieye
  • 浏览: 830958 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

使用docker建立php多版本共存的环境(1)

阅读更多
使用docker建立php多版本共存的环境

本人原创文章,转载请注明出处。注意,本文的开发环境是win10家庭版,使用docker-toolbox

当前日期:2019-01-12

概述
假设现在本机同时维护两个项目,一个必须使用php5.6,一个必须使用7.2,那么怎么办呢?
可以使用phpstudy进行切换。

能不能不切换,共存?

说明:docker-toolbox应该创建好后新建虚拟机
方法
https://www.ibm.com/developerworks/community/blogs/jfp/entry/Using_Docker_Machine_On_Windows?lang=en

docker-machine create -d virtualbox --virtualbox-memory=4096 --virtualbox-cpu-count=2 --virtualbox-disk-size=50000 dev

下载安装
https://github.com/xieye114/docker_multiple_php
里面有具体的安装步骤。

2019 01 16 修改,添加了beanstalkd 队列的镜像 Dockerfile,方便php使用。

文件说明
docker项目的包含内容:
  • nginx
  • redis
  • mysql
  • php56
  • php72

这时可以使用docker。我把补充说明写在前面,最后是配置文件。
-- services下面的各个容器,实际生成的镜像名 = 文件夹名_服务名,例如服务php56-fpm的镜像名是 build_php56-fpm, 我把docker-composer.yml这个文件,放在build文件夹中。即,这个镜像名是自动生成的。

-- services下面的各个容器,实际生成的容器名 = 文件夹名_服务名_1,例如服务php56-fpm的容器名是 build_php56-fpm_1,这个容器名也是自动生成的。

-- build命令,指明此服务从哪个镜像生成。那个目录下有Dockerfile文件。
-- ports:主机端口:容器端口
-- links:服务名:在本容器里的别名,这个特别重要
  举例;想在php56-fpm容器里访问mysql,应该使用别名访问,即冒号右边的名称。特别是写php程序,nginx配置等等,可以把别名理解为ip,理解为host名。
-- depends_on: 容易理解,本容器依赖与哪些容器,即那些容器先启动,本容器后启动。
-- volumes:容器外目录:容器内目录,可以文件映射,也可以目录映射,还可以指定访问方式,可读写。
-- restart:当失败时怎么做,这个不重要。
-- command:当启动容器后,自动执行的命令。

域名映射
修改windows10的hosts文件
127.0.0.1 www.t1.com
127.0.0.1 www.t2.com
127.0.0.1 www.t3.com
127.0.0.1 www.t4.com
127.0.0.1 www.t5.com

192.168.99.100 www.d1.com
192.168.99.100 www.d2.com

按照如上配置,同时取消virtualbox和windowd宿主机的所有端口映射,除了22端口。
此时,可以把phpstudy和docker一起打开,根据不同的域名共同访问项目!
在windows里访问mysql,只需访问主机192.168.99.100的mysql即可。


要点
-- 因为有多版本的php,所以,定义了两个端口,但在nginx里,不需要指明不同的端口。因为已经指定了主机名。因为端口映射是为了宿主机有统一定义的不同端口。每个容器相当于每个主机,可以有自己端口哪怕同样。

以下是nginx 配置文件的部分内容
location ~ \.php {
        include fastcgi_params;
        fastcgi_pass   php56-fpm:9000;
        fastcgi_index  index.php;

location ~ \.php {
        include fastcgi_params;
        fastcgi_pass   php72-fpm:9000;
        fastcgi_index  index.php;


-- 实际使用php项目时,通常nginx的docment_root会设置在项目的下一级或下两级,不直接设置为项目目录。

-- 修改docker-composer.yml 文件,只需重启docker-compose down,再docker-compose up -d 即可。

-- 修改Dockerfile,则必须停止后,删除那个镜像,然后docker-compose build。所以尽量尝试改动 docker-composer.yml,不行的话再改Dockerfile。

-- mysql这个软件,为什么我把配置文件放在Dockerfile里,且使用COPY这个命令,很无奈,因为mysql软件对配置文件权限要求特别高,做映射好像不行,这样的话,每次修改mysql配置文件,都得重新build安装镜像。而其他几个软件,直接在windows下修改配置文件,然后重启docker-compose即可,非常便利。

-- mysql重新安装的话,需要先自行备份所有数据库,然后删除所有 data/下的文件,然后重装。不删除会导致安装失败

目录说明
本示例项目中,目录按如下方式设置:
c:\code
  myapp\
    build\
      mysql\
        Dockerfile
        docker.cnf
        mysql-file.cnf
      nginx\
        Dockerfile
        nginx.conf
        conf.d\
          myapp_code1.conf
          myapp_code2.conf
        certs\
      php56\
        Dockerfile
        php.ini
        php-fpm.conf
        sources.list
      php72\
        Dockerfile
        php.ini
        php-fpm.conf
        sources.list
      redis\
        Dockerfile
    data\
      mysql\
      redis\
    logs\
      mysql\
      nginx\
      php56-fpm\
      php72-fpm\
      redis\
    
  workspace\
    myapp_code1\
      index.php
    myapp_code2\
      index.php
  docker-compose


配置文件
使用docker-composer 会更方便。这里给出一份配置做参考。
说明:此文件已放入github,可能会有更新,但此处就不更新了。
docker-composer.yml
version: '3.2'
services:
  php56-fpm:
    build: ./php56/
    ports:
      - "9000:9000"
    links:
      - mysql-db:mysql-db
      - redis-db:redis-db
    depends_on:
      - mysql-db
      - redis-db      
    volumes:
      - ../../workspace:/var/www:rw
      - ./php56/php.ini:/usr/local/etc/php/php.ini:ro # 当前php配置文件;可以拷贝修改php-dev.ini为想要的配置
      - ./php56/php-fpm.conf:/usr/local/etc/php-fpm.conf:ro
      - ../logs/php56-fpm:/var/log/php-fpm:rw
      - ./php56/sources.list:/etc/apt/sources.list:rw
    restart: always
    command: php-fpm

  php72-fpm:
    build: ./php72/
    ports:
      - "9100:9100"
    links:
      - mysql-db:mysql-db
      - redis-db:redis-db
    depends_on:
      - mysql-db
      - redis-db      
    volumes:
      - ../../workspace:/var/www:rw
      - ./php72/php.ini:/usr/local/etc/php/php.ini:ro # 当前php配置文件;可以拷贝修改php-dev.ini为想要的配置
      - ./php72/php-fpm.conf:/usr/local/etc/php-fpm.conf:ro
      - ../logs/php72-fpm:/var/log/php-fpm:rw
      - ./php56/sources.list:/etc/apt/sources.list:rw
    restart: always
    command: php-fpm
    
    
  nginx:
    build: ./nginx
    depends_on:
      - php56-fpm
      - php72-fpm
    links:
      - php56-fpm:php56-fpm
      - php72-fpm:php72-fpm
    volumes:
      - ../../workspace:/var/www:rw
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/certs/:/etc/nginx/certs
      - ./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
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: myapp
      MYSQL_USER: user
      MYSQL_PASSWORD: password
    restart: always
    command: "--character-set-server=utf8  --explicit_defaults_for_timestamp  --innodb-flush-method=O_DSYNC --innodb-use-native-aio=0 "
    
  redis-db:
    build: ./redis
    ports:
      - "6379:6379"
    volumes:
      - ../data/redis:/data
    restart: always
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics