使用 docker-compose 创建 php+mysql+nginx 容器

原创
2021/09/06 16:41
阅读数 651

使用 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目录中新建phpnginx/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,完美

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部