本人原创文章,转载请注明出处。注意, 本文的开发环境是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