1.完成Docker-compose的安装
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose # 下载安装
sudo chmod +x /usr/local/bin/docker-compose # 应用权限
docker-compose --version # 测试是否安装成功
2.Dockerfile编写
.
├── default.conf #nginx配置文件
├── docker-compose.yml
├── html #网页的工作目录
│ ├── index.html
│ └── index.php
├── MySQL_Data #空目录,MySQL数据库的内容将会被同步到此
├── MySQLDockerfile
├── NginxDockerfile
└── phpDockerfile
(1) default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/mydir;
index index.html index.htm index.php;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ .php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ .php$ {
root /usr/share/nginx/mydir;
fastcgi_pass phpfpm:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /.ht {
# deny all;
#}
}
(2) html目录
存放index.html
和index.php
(3)index.html
随意
(4)index.php
<?php phpinfo();?>
(5)MySQLDockerfile
FROM mysql:5.7
MAINTAINER by HRM
#设置root密码
ENV MYSQL_ROOT_PASSWORD 123456
#设置不可免密登录
ENV MYSQL_ALLOW_EMPTY_PASSWORD no
(6)NginxDockerfile
FROM nginx
#维护者信息
MAINTAINER by HRM
#暴露端口
EXPOSE 80
(7)phpDockerfile
#基础镜像
FROM php:7.4-fpm
#作者信息
MAINTAINER HRM
#更换镜像源
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
#安装扩展pdo
RUN apt-get clean && apt-get update && apt-get install -y
libfreetype6-dev
libjpeg62-turbo-dev
libpng12*-dev
vim
&& docker-php-ext-install pdo_mysql
&& docker-php-ext-configure gd --with-freetype --with-jpeg
&& docker-php-ext-install gd
(8)MySQL_Data
新建这个空目录
MySQL数据库的内容将会被同步到此
3.使用Compose实现多容器运行机制
docker-compose.yml
version: "3"
services:
nginx:
image: nginx_image #指定镜像名
container_name: nginx_container #指定容器名
build:
context: .
dockerfile: NginxDockerfile #指定dockerfile文件
ports:
- "80:80" #端口映射
links:
- "phpfpm"
volumes:
- ./html/:/usr/share/nginx/mydir/ #映射网页的工作目录
- ./default.conf:/etc/nginx/conf.d/default.conf #映射nginx配置文件
phpfpm:
image: php_image #指定镜像名
container_name: php_container #指定容器名
build:
context: .
dockerfile: phpDockerfile
ports:
- "9000:9000" #端口映射
volumes:
- ./html/:/usr/share/nginx/mydir/ #映射网页的工作目录
links:
- "mysql"
mysql:
image: mysql_image #指定镜像名
container_name: mysql_container #指定容器名
build:
context: .
dockerfile: MySQLDockerfile
ports:
- "13306:3306" #端口映射
volumes:
- ./MySQL_Data/:/var/lib/mysql/ #映射服务数据卷路径
进入工作目录
执行 docker-compose up -d
4.服务测试
-
数据库连接
教程: PHP与MySQL的教程
直接修改
index.php
内容为下<?php $servername = "mysql_container"; #MySQL服务的容器名 $username = "root"; $password = "123456"; try { $conn = new PDO("mysql:host=$servername", $username, $password); echo "连接成功"; } catch(PDOException $e) { echo $e->getMessage(); } ?>
-
数据库新建
<?php $servername = "mysql_container"; $username = "root"; $password = "123456"; try { $conn = new PDO("mysql:host=$servername", $username, $password); echo "连接成功"; // 设置 PDO 错误模式为异常 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $sql = "CREATE DATABASE SCHOOL"; // 使用 exec() ,因为没有结果返回 $conn->exec($sql); echo "数据库创建成功<br>"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
-
新建表
<?php $servername = "mysql_container"; $username = "root"; $password = "123456"; $dbname = "SCHOOL"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // 设置 PDO 错误模式,用于抛出异常 $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 使用 sql 创建数据表 $sql = "CREATE TABLE student ( id VARCHAR(10) PRIMARY KEY, name VARCHAR(30) NOT NULL, score INT NOT NULL )"; // 使用 exec() ,没有结果返回 $conn->exec($sql); echo "数据表 student 创建成功"; } catch(PDOException $e) { echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
-
表记录的插入
<?php $servername = "mysql_container"; $username = "root"; $password = "123456"; $dbname = "SCHOOL"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 开始事务 $conn->beginTransaction(); // SQL 语句 $conn->exec("INSERT INTO student (id, name, score) VALUES ('031702142', 'HRM', 100)"); $conn->exec("INSERT INTO student (id, name, score) VALUES ('033333333', 'Trump', 60)"); $conn->exec("INSERT INTO student (id, name, score) VALUES ('233333333', 'XiaoMing', 80)"); // 提交事务 $conn->commit(); echo "新记录插入成功"; } catch(PDOException $e) { // 如果执行失败回滚 $conn->rollback(); echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
-
表记录的修改和删除
<?php $servername = "mysql_container"; $username = "root"; $password = "123456"; $dbname = "SCHOOL"; try { $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password); // set the PDO error mode to exception $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 开始事务 $conn->beginTransaction(); // SQL 语句 $conn->exec("UPDATE student SET name='real_Trump' WHERE id='033333333'"); $conn->exec("DELETE FROM student WHERE id='233333333'"); // 提交事务 $conn->commit(); echo "更新数据成功"; } catch(PDOException $e) { // 如果执行失败回滚 $conn->rollback(); echo $sql . "<br>" . $e->getMessage(); } $conn = null; ?>
5.选做
增加一个phpmyadmin
容器,实现web
端的数据库管理。
这里需要修改下docker-compose.yml
并添加一个phpmyadmin
的dockerfile
在docker-compose.yml
最后添加
phpmyadmin:
image: phpmyadmin_image
container_name: phpmyadmin_container
build:
context: .
dockerfile: phpmyadminDockerfile
ports:
- "8080:80" #phpmyadmin默认监听80
environment:
PMA_HOST: mysql_container #指定mysql服务所在的host
创建phpmyadminDockerfile
文件
#基础镜像
FROM phpmyadmin/phpmyadmin:latest
#作者信息
MAINTAINER HRM
#暴露端口
EXPOSE 8080
执行 docker-compose up -d
命令
访问http://localhost:8080/index.php
查看数据库信息
6.遇到的问题
选做题时命令出错,原因是同步数据库的MySQL_Data
目录会被锁
解决方法
sudo chown -R $USER MySQL_Data