目录结构
├── conf 配置目录
│ ├── mysql MySQL配置文件目录
│ │ └── my.cnf MySQL配置文件
│ ├── nginx Nginx配置文件目录
│ │ ├── conf.d 站点配置文件目录
│ │ │ └── default.conf 默认站点配置文件
│ │ └── nginx.conf Nginx通用配置文件
│ └── php PHP配置目录
│ │── php.ini PHP配置文件
│ └── php-fpm.conf PHP-FPM配置文件
├── log 日志目录
│ ├── mysql MySQL日志目录
│ ├── nginx Nginx日志目录
│ └── php PHP日志目录
├── mysql MySQL数据文件目录
├── php PHP目录
│ └── php56 PHP5.6目录
│ └── Dockerfile Dockerfile配置文件
├── www 站点根目录
│ └── index.php index文件
└── docker-compose.yml docker-compose配置文件
使用
1.安装 docker
和 docker-compose
2.
git clone 代码到本地
$ git clone git@github.com:Gekkoou/dnmp.git
3.执行命令
$ cd dnmp
$ docker-compose up -d
4.默认站点在浏览器中访问
phpmyadmin 访问 localhost:8080
, 帐号 root
密码 123456
# docker-compose up -d
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dad39a530a83 phpmyadmin/phpmyadmin:latest "/run.sh superviso..." 5 hours ago Up 3 hours 9000/tcp, 0.0.0.0:8080->80/tcp my-phpmyadmin
42cf670a099f mysql:5.7 "docker-entrypoint..." 5 hours ago Up 3 hours 0.0.0.0:3306->3306/tcp my-mysql
9c832c8f271e dnmp_php "php-fpm -F" 5 hours ago Up 3 hours 9000/tcp dnmp_php_1
ad61b06a4ec1 nginx:alpine "nginx -g 'daemon ..." 5 hours ago Up 3 hours 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp my-nginx
重启 nginx
docker exec -it my-nginx nginx -s reload 或 docker-compose restart nginx
重启 php-fpm
docker exec -it dnmp_php_1 kill -USR2 php-fpm的pid或docker-compose restart php
启动所有已经存在的服务容器
docker-compose start
停止所有已经处于运行状态的容器
docker-compose stop
重启所有已经存在的容器
docker-compose restart
删除所有 (停止状态的) 服务容器
docker-compose rm
5.docker-compose.yml 文件内容
version: '3.7'
services:
#构建mysql服务
mysql:
image: mysql:lxc #容器运行使用的镜像
build:
context: .
dockerfile: MySQL_dockerfile
container_name: php_mysql #定义容器名称
ports:
- "3306:3306" #映射端口,格式为 "主机端口:容器端口"
#构建php变体php-apache服务
web:
image: php:lxc
build:
context: .
dockerfile: php-apache_dockerfile
container_name: php-apache
depends_on: #设置依赖的服务
- mysql
volumes:
- ./www/:/var/www/html/ #将主机中的目录挂载到容器中的工作目录,易于对web服务的管理
ports:
- "8080:80"
#构建phpmyadmin服务
phpmyadmin:
image: phpmyadmin:lxc
build:
context: .
dockerfile: phpmyadmin_dockerfile
environment:
PMA_HOST: php_mysql #设置所连接的MySQL服务器名称
container_name: phpmyadmin
depends_on:
- mysql
- web
ports:
- "8081:80"
创建一个index.php文件,输入以下内容
<!-- ./php/index.php -->
<html>
<head>
<title>phpinfo</title>
</head>
<body>
<?php
echo phpinfo(); #显示php信息
?>
</body>
</html>
创建一个mysql.php文件,输入以下内容
<html>
<body>
<head>
<title>Mysql Test</title>
</head>
<?php
$servername = "php_mysql";#这里的数据库服务器名称为MySQL容器的名称
$username = "root";
$password = $_ENV["MYSQL_ROOT_PASSWORD"];
$dbname = "mydb";
function ShowData($result){ //显示数据的函数
global $servername, $username, $password, $dbname;
$conn = new mysqli($servername, $username, $password, $dbname);
$sql = "select * from MyTable;";
$result = $conn->query($sql);
$table = "<table border='1' cellspacing='0' width='200' height='50'>";
$table .="<tr align='center'><td>ID</td><td>Name</td><td>Sex</td></tr>";
// 输出数据
for($i=1;$i<=$result->num_rows;$i++){ //行
$table.="<tr align='center'>";
$row = $result->fetch_assoc(); //列
$table .= "<td>" . $row['ID'] ."</td>" . "<td>" . $row['NAME'] ."</td>" . "<td>" . $row['SEX'] ."</td>";
$table.="</tr>";
}
$table.="</table>";
echo $table;
}
// 创建连接
$conn = new mysqli($servername, $username, $password);
// 检测连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error . "<br>");
}
else{
echo "连接成功!<br>";
}
// 创建数据库mydb
$sql = "DROP DATABASE " . " IF EXISTS " . $dbname . ";create DATABASE " .$dbname;
// 检测数据库是否创建成功
if ($conn->multi_query($sql)){
echo "create database " . $dbname . " successfully!<br>";
}
else{
echo "failed:" . $conn->error . "<br>";
}
sleep(1);
// 创建连接,连接到数据库
$conn = new mysqli($servername, $username, $password,$dbname);
// 建表
$sql = "CREATE TABLE MyTable(
ID BIGINT(10) NOT NULL PRIMARY KEY,
NAME NVARCHAR(10) NOT NULL,
SEX NVARCHAR(6),
CHECK (SEX='male' or SEX='female' or SEX='男' or SEX='女')
)";
// 检测建表是否成功
if ($conn->query($sql) === TRUE){
echo "create table MyTable successfully!<br>";
}
else{
echo "failed:" . $conn->error . "<br>";
}
// 向表中插入数据
$sql = "INSERT INTO MyTable
VALUES (1,'张三','male');";
$sql .= "INSERT INTO MyTable
VALUES (2,'李四','男');";
$sql .= "INSERT INTO MyTable
VALUES (3,'小兰','female');";
// 检测数据是否成功插入
if ($conn->multi_query($sql)){
echo "insert data into MyTable successfully!<br>";
}
else{
echo "failed:" . $conn->error . "<br>";
}
sleep(1);
echo "<br>查表:<br>";
ShowData($result);
// 修改数据
sleep(1);
echo "<br>修改数据:将李四的'Sex'改为'male'<br>";
$conn = new mysqli($servername, $username, $password, $dbname);
$sql = "UPDATE MyTable SET SEX='male' WHERE NAME='李四';";
$result = $conn->query($sql);
echo $result->num_rows;
ShowData($result);
// 增加数据
sleep(1);
echo "<br>增加数据:<br>";
$conn = new mysqli($servername, $username, $password, $dbname);
$sql = "INSERT INTO MyTable
VALUES (4,'小红','female');";
$result = $conn->query($sql);
echo $result->num_rows;
ShowData($result);
// 删除数据
sleep(1);
echo "<br>删除数据:删除名为张三的信息<br>";
$conn = new mysqli($servername, $username, $password, $dbname);
$sql = "DELETE FROM MyTable WHERE NAME='张三'";
$result = $conn->query($sql);
echo $result->num_rows;
ShowData($result);
$conn->close();
?>
</body>
</html>
6.再输入docker-compose up --build,使容器运行起来
7.出现GPL,然后在浏览器运行0.0.0.0:8081,页面显示为index.php信息
8.在浏览器输入0.0.0.0:8081访问mysql,实现数据库的连接管理功能
至此,使用docker-compose部署php-apche、Mysql、phpmyadmin已经顺利部署成功!