(1)完成Docker-compose的安装
1、下载Docker-compose
2、添加执行权限和测试
(2)Dockerfile编写
- Dockerfile-nginx
//Dockerfile FROM nginx LABEL author=zxl #由于yml文件里面有配置文件的挂载,所以这里不用过多操作。
//default.conf server { listen 80; server_name localhost; location / { root /var/www/html; # nginx容器中web文件存放目录,和yml对应 index index.html index.htm index.php; } location ~ .php$ { root /var/www/html; # php容器中web文件存放目录,和yml对应 fastcgi_pass zphp:9000; # php服务器默认端口9000 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
- Dockerfile-php
FROM php:7.4-fpm LABEL author=zxl RUN apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev && docker-php-ext-install pdo pdo_mysql && docker-php-ext-configure gd --with-freetype --with-jpeg && docker-php-ext-install -j$(nproc) gd && rm -rf /var/cache/apt/* && rm -rf /var/lib/apt/lists/*
- Dockerfile-mysql
由于mysql的配置不是很复杂,所以这里就放到yml文件里面
- index.php
<?php $host = "zdb"; $username = "root"; $password = "123456"; $dsn="mysql:host=$host;"; try { $db = new PDO($dsn, $username, $password,array(PDO::ATTR_PERSISTENT=>true)); echo "连接成功"; } catch(PDOException $e) { echo "连接失败"; echo $e->getMessage(); } //创建数据库和表 $db->exec("create database if not exists leilei;"); echo "数据库创建成功!<br>"; $db->exec("use leilei;"); $db->exec("create table if not exists test1(name char(20));"); echo "表格创建成功!<br>"; //插入数据 $sql2 = "INSERT INTO test1 (name) VALUES ('wg');"; $db->exec($sql2); echo "记录插入成功!<br>"; //查看数据 echo "查看数据:<br>"; showdata($db); //修改数据 $db->exec("update test1 set name='baozi' where name='wg';"); echo "修改后的数据:<br>"; showdata($db); //删除数据 $db->exec("delete from test1;"); echo "删除后的数据:<br>"; showdata($db); function showdata($db){ $sql = "select * from test1"; $result = $db->query($sql); if(is_object($result)){ while ($arr = $result->fetch()) { print_r($arr); } echo "<br/>"; } else{ print_r($db->errorinfo()); echo "<br/>"; } } ?>
- 查看文件树结构(由于mysql_data里面文件过多,所以只看了两层)
(3)使用Compose实现多容器运行机制
- 编写compose文件
version: '3' services: nginx: container_name: zngx build: context: . dockerfile: Dockerfile-nginx ports: - "80:80" volumes: - ./web_dir/:/var/www/html/ - ./default.conf:/etc/nginx/conf.d/default.conf networks: - front_end php: container_name: zphp build: context: . dockerfile: Dockerfile-php environment: MYSQL_PASSWORD: 123456 volumes: - ./web_dir/:/var/www/html/ networks: - front_end - back_end depends_on: - mysql mysql: image: mysql:5.7 container_name: zdb restart: always volumes: - ./mysql_data:/var/lib/mysql ports: - "3306:3306" environment: TZ: 'Asia/Shanghai' MYSQL_ROOT_PASSWORD: 123456 command: ['mysqld', '--character-set-server=utf8'] networks: - back_end phpmyadmin: build: context: . dockerfile: Dockerfile-phpmyadmin container_name: phpmyadmin ports: - "8080:80" environment: PMA_HOST: zdb networks: - back_end networks: front_end: back_end:
- 运行docker-compose.yml文件
(4)服务测试
- 验证index.html
- 验证index.php
- 相关测试代码参考PHP与MySQL的教程。
(5)Phpmyadmin
- 在yml文件里面添加phpmyadmin
- 写一个Dockerfile-phpmyadmin
- 浏览器输入8080端口进入首页登录
- 登录进入并查看表信息(由于index.php最后执行delete操作,所以没有数据)
- 修改index.php,向里面插入数据并验证
六、小结
1、由于在写yml文件时无意间加入了table,导致运行时报错。
key:一行一行的去用backspace检验table的存在。唉,自己种下的恶果自己要尝。
2、在build phpmyadmin时由于要访问mysql_data里面的文件,但恰恰里面的文件却都加锁了。
key:一个个把需要用到的文件赋予读写权限
3、在调用index.php时,报出空对象异常
key:原因是我在index.php连接数据库时用的host时localhost,而实际上运行的容器zdb拥有自己独立的IP,这里将host改为zdb或容器IP。并且后面加上长连接!