使用 docker-compose 创建 php+mysql+nginx 容器
docker-compose常用命令
进入到相应docker-compose目录下:
-
docker-compose up -d 构建建启动容器
-
docker-compose restart 重启容器
-
docker-compose ps 显示所有容器
-
docker-compose down 删除所有nginx容器,镜像
-
docker-compose config -q 验证(docker-compose.yml)文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。
-
docker-compose events --json nginx 以json的形式输出nginx的docker日志
-
docker-compose pause nginx 暂停nignx容器
-
docker-compose unpause nginx 恢复ningx容器
-
docker-compose rm nginx 删除容器(删除前必须关闭容器)
-
docker-compose stop nginx 停止nignx容器
-
docker-compose start nginx 启动nignx容器
-
docker-compose exec nginx bash 登录到nginx容器中
-
docker-compose restart nginx 重新启动nginx容器
-
docker-compose run --no-deps --rm php-fpm php -v 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器
-
docker-compose build nginx 构建镜像 。
-
docker-compose build --no-cache nginx 不带缓存的构建。
-
docker-compose logs nginx 查看nginx的日志
-
docker-compose logs -f nginx 查看nginx的实时日志
docker-compose 文件说明
- version 版本 指定本 yml 依从的 compose 哪个版本制定的。
- services 服务
- networks 网络 三种网络模式:Bridged(桥接模式)、NAT(网络地址转换模式)、Host-Only(仅主机模式)
一份标准配置文件应该包含 version、services、networks 三大部分,其中最关键的就是 services,下面先来看 services 的书写规则。
services:
nginx:
image: nginx:latest
container_name: nginx
restart: always
ports:
- 80:80
environment:
- TZ=Asia/Shanghai
depends_on:
- php
- mysql
volumes:
- "$PWD/nginx/conf.d:/etc/nginx/conf.d"
- "$PWD/nginx/log:/var/log/nginx"
- "$PWD/nginx/www:/usr/share/nginx/html"
links:
- php:php73
- mysql:mysql56
networks:
- np-network
看上面这个例子,services 下面的二级标签 nginx 是服务名称,默认也是容器名称;可以通过 container_name 重新定义容器名称,下面看看容器选项
- image: nginx:latest 镜像名称:版本,如果没有镜像会自动拉取
- container_name: nginx 容器名称
- restart: always 重启
- ports: 对外映射的端口号
-
- 80:80
- environment: 全局变量 类似 docker run -e 的效果。
-
- TZ=Asia/Shanghai
- depends_on: 容器依赖的启动顺序,表示要先启动 php 和 mysql 容器
-
- php
-
- mysql
- volumes: 目录挂载,表示本目录下的 nginx/conf.d 映射容器里的/etc/nginx/conf.d
-
- "$PWD/nginx/conf.d:/etc/nginx/conf.d"
-
- "$PWD/nginx/log:/var/log/nginx"
-
- "$PWD/nginx/www:/usr/share/nginx/html"
- links: 容器连接,表示在 nginx 容器中连接使用 php73 容器
-
- php:php73
-
- mysql:mysql56
- networks: 使用的网络模式
-
- np-network
使用 docker-compose 创建 php+mysql+nginx 容器
新建目录~/docker/web
,进入目录后新建docker-compose.yml
文件,内容如下
version: '2'
services:
nginx:
image: nginx:latest
container_name: nginx
restart: always
ports:
- 80:80
environment:
- TZ=Asia/Shanghai
depends_on:
- php
- mysql
volumes:
- "$PWD/nginx/conf.d:/etc/nginx/conf.d"
- "$PWD/nginx/log:/var/log/nginx"
- "$PWD/nginx/www:/usr/share/nginx/html"
links:
- php:php73
- mysql:mysql56
networks:
- np-network
php:
image: php:7.3-fpm
container_name: php73
restart: always
environment:
- TZ=Asia/Shanghai
ports:
- 9000:9000
volumes:
- "$PWD/nginx/www:/var/www/html"
networks:
- np-network
mysql:
image: mysql:5.6
container_name: mysql56
restart: always
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=123456
networks:
- np-network
networks:
np-network:
driver: bridge
-
在
~/docker/web
目录中新建php
和nginx/conf.d
目录;然后执行docker-compose up -d
命令构建并启动容器 -
nginx/conf.d
目录中缺少一个default.conf
文件,这个是 nginx 的本地配置文件,我们可以新建一个 nginx 容器,然后将 nginx 容器里面的default.conf
拷贝出来 -
执行命令
docker run --name mynginx -it -p 8080:80 -d nginx
创建一个临时容器, -
然后执行
docker cp mynginx:/etc/nginx/conf.d/default.conf ./nginx/conf.d/
将临时容器里的 nginx 配置文件 copy 到本地目录中。 -
然后修改一下本地的配置文件
./nginx/conf.d/default.conf
让 nginx 可以解析 php 的内容
location ~ \.php$ {
root /var/www/html/;
fastcgi_pass php73:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
-
进入 php73 容器内安装一下
mysqli、pdo_mysql
的扩展; 执行docker-compose exec php bash
如果进入不了,可以用管理员身份运行 cmd 进入 -
先安装 mysqli 和 pdo_mysql 扩展; 然后修改
php.ini
文件
/usr/local/bin/docker-php-ext-install mysqli pdo_mysql #安装mysqli和pdo_mysql扩展
cd /usr/local/etc/php #进入php配置文件目录
mv php.ini-development php.ini #创建php.ini
apt-get update #更新软件源列表
apt-get install vim #安装vim
vim /usr/local/etc/php/php.ini 修改php.ini配置文件
修改 php.ini 扩展目录extension_dir="/usr/local/lib/php/extensions/no-debug-non-zts-20180731/"
;打开 mysqli 扩展 extension=mysqli
;extension=pdo_mysql
;然后退出容器
-
重启容器
docker-compose restart
-
测试一下 创建
nginx/www/mysqli.php
文件;
<?php
$con = mysqli_connect("mysql56","root","123456","blog",3306);
if (!$con){
die('Could not connect: ' . mysqli_connect_error());
}
$sql = "set names utf8";
mysqli_query($con,$sql);
$sql = "select * from user";
$result = mysqli_query($con,$sql);
$list = array();
while ($row = mysqli_fetch_row($result)) {
$list[]=$row;
}
var_dump($list);
?>
使用 Navicat for MySQL 工具连一下数据库,导入一下 blog 库; 连接主机名可以使用本机IP地址或localhost
CREATE DATABASE blog default character set utf8mb4 collate utf8mb4_unicode_ci;
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`password` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`age` tinyint(2) DEFAULT NULL,
`sex` varchar(2) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO `user` VALUES ('1', '张三', '123', '23', '男');
INSERT INTO `user` VALUES ('2', '李四', '321', '25', '女');
INSERT INTO `user` VALUES ('3', '王五', '666', '28', '男');
打开浏览器访问http://localhost/mysqli.php
,完美