Home » Code » 使用docker-compose搭建php开发环境

使用docker-compose搭建php开发环境

首先安装docker,按照官方文档进行即可。然后是docker-compose

docker hub在国内的连接速度不算理想,可以使用阿里云进行加速。进入这里获得个人专属加速器地址,按说明进行设置即可。也可以参考这篇文章

接下来就是缩写docker-compose.yml文件的事了,关于它的格式同样可参考官方文档。这里我配置了一个简单的nginx + php-fpm + mysql:

version: '3'
services:
  web:
    image: nginx:latest
    container_name: web_nginx
    ports:
      - "7777:80" #宿主机器使用7777端口,容器内部是80端口
    volumes:
      - ./web/code:/code #宿主机器当前目录(docker-compose.yml所在目录)下的web/code目录对应容器内部/code目录
      - ./web/site.conf:/etc/nginx/conf.d/site.conf #自定义一个配置文件映射到容器内部nginx配置目录
    links:
      - php
  php:
    image: nanoninja/php-fpm #官方镜像扩展太少,安装麻烦,使用第三方的
    container_name: php_fpm
    volumes:
      - ./web/code:/code
      - ./php/custom.php.ini:/usr/local/etc/php/conf.d/custom.php.ini #自定义php配置
  mysql:
    image: mysql:latest
    restart: always
    container_name: mysql
    environment:
      - MYSQL_DATABASE=test_docker #默认创建一个库,可选
      - MYSQL_ROOT_PASSWORD=****** #root账户密码,必须
      - MYSQL_USER=test #创建一个非root账户
      - MYSQL_PASSWORD=123456 #对应上边test账户的密码
    volumes:
      - ./mysql/custom.cnf:/etc/mysql/conf.d/custom.cnf #mysql自定义配置
      - ./mysql/data:/var/lib/mysql #数据存储目录,这样在宿主机器外部可方便访问数据

这样,在docker-compose.yml所在目录,执行docker-compose up命令即可启动这堆容器,一个基本的开发环境就搭建好了。

[root@iZuf6jcwx7sfb1h6ayjq99Z mydocker]# docker-compose ps
  Name                 Command              State          Ports        
------------------------------------------------------------------------
mysql       docker-entrypoint.sh mysqld     Up      3306/tcp            
php_fpm     docker-php-entrypoint php-fpm   Up      9000/tcp            
web_nginx   nginx -g daemon off;            Up      0.0.0.0:7777->80/tcp

在这其中,mysql的问题多一些。在启动过后再修改配置文件,启动可能不会生效,可以先删除容器:docker-compose rm -fv,然后再up。

启动后,若要登陆容器内部的mysql查看,执行:docker exec -it mysql bash,这里mysql是容器名container_name。

[root@iZuf6jcwx7sfb1h6ayjq99Z mydocker]# docker exec -it mysql bash
root@e36e9b50e79b:/# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.7.19 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.19    |
+-----------+
1 row in set (0.00 sec)

mysql> 

php容器中的php代码怎么连接mysql容器呢,关键的一点是host是要写服务名而不是容器名更不是主机地址IP之类的。

//host是写服务名mysql,不是localhost/127.0.0.1,也不是container_name(这里服务名跟container_name相同了)
$dsn = 'mysql:dbname=test_docker;host=mysql'; 
$user = 'test';
$password = '123456';

try {
    $pdo = new PDO($dsn, $user, $password);
    $r = $pdo->getAttribute(PDO::ATTR_SERVER_INFO);
    print_r($r);
    $r = $pdo->getAttribute(PDO::ATTR_CLIENT_VERSION);
    print_r($r);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}

要真正用起来还有一个问题,那就是mysql的数据如何同步,容器起来得同步已有的数据到容器中的mysql。这块知识比较欠缺,待学会了再来更新了。

参考链接:
http://www.tanhui.bid/docker/2016/10/19/%E4%BD%BF%E7%94%A8Docker-docker-compose-%E6%90%AD%E5%BB%BAnginx+php+mysql-%E7%8E%AF%E5%A2%83
https://github.com/docker-library/mysql/issues/275

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Time limit is exhausted. Please reload CAPTCHA.