首先安装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
我最喜欢的PHP代码编辑器是Codelobster – http://www.codelobster.com