使用 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
目錄中新建php
和nginx/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
,完美