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

使用 docker-compose 創建 php+mysql+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 exec -it php73 /bin/sh 如果進入不了,可以用管理員身份運行 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 stop,

  • 重啓容器docker-compose up -d

  • 測試一下 創建nginx/www/mysqli.php文件;

<?php

$con = mysqli_connect("192.168.72.161","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 庫

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,完美

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章