赞
踩
本文简单介绍通过启动一个nginx和fpm容器来搭建一个php web运行环境,以文档命令为例,H:/home/code/docker/web 目录下可以放多个子项目,只需针对不同的项目配置不同的nginx站点文件,在站点中指定下级项目目录即可,以后台项目admin为例, 则具体的子路径为H:/home/code/docker/web/admin,容器内路径为/var/www/html/admin
root目录指定到下级项目路径
fastcgi_param SCRIPT_FILENAME 指定到下级项目路径
如果需要启动其他PHP的版本,只需要再使用别的端口重新启动一个php-fpm容器即可,只需要在 -d 参数后修改依赖的镜像版本,比如:php:8.1-fpm-alpine、php:7.4-fpm-alpine、php:5.5-fpm-alpine
注:官方PHP镜像缺少常用扩展,比如redis,gd等,需自行基于官方镜像安装扩展二次打包, 或启动后手动安装扩展,也可使用其它途径提供的带常用扩展的镜像。
使用docker compose 一次性编排多个容器,可一键启动项目所需全部容器, 见下文。
前置条件 : 已安装docker
docker network create --driver=bridge nginx_network
- docker run --name php-fpm-81 \
- -v H:/home/code/docker/web:/var/www/html \
- --network nginx_network \
- --ip 172.18.0.3 \
- --privileged=true \
- -d php:8.1-fpm-alpine
- docker run --name nginx-common \
- -p 8008:80 \
- -v H:/home/code/docker/web:/var/www/html \
- -v H:/home/docker/nginx_conf.d:/etc/nginx/conf.d \
- --network nginx_network \
- --ip 172.18.0.4 \
- --privileged=true \
- -d nginx
上述命令参数解析:
--name 为启动的容器命名
-p 映射端口,把本地宿主机的8008端口 映射到容器的80端口,访问本地8008端口即访问容器80端口
-v 映射本地文件目录 到 容器内部目录,比如项目代码目录
--network 关联容器网络
--ip 指定容器ip
--privileged 启用桥接
-d 后台启动一个容器,使用名为为php ,tag为 8.1-fpm-alpine 的镜像,本地不存在会从官方仓库拉取
创建项目 admin.conf 文件, 把文件放到 H:/home/docker/nginx_conf.d 目录中,也就是启动nginx容器时 -v 命令映射的本地nginx站点配置文件夹
- server {
- listen 80;
- server_name 192.168.0.195;
-
- location / {
- if (!-e $request_filename){
- rewrite ^/(.*) /index.php last;
- }
-
- root /var/www/html/admin;
- index index.html index.htm index.php;
- }
-
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- root /var/www/html/admin;
- }
-
- location ~ \.php$ {
- root /var/www/html;
- fastcgi_pass 172.18.0.3:9000; #php容器的ip地址
- fastcgi_index index.php;
- fastcgi_param SCRIPT_FILENAME /var/www/html/admin/$fastcgi_script_name;
- #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
-
- include fastcgi_params;
- }
- }

访问 8008端口 打开admin项目
也可使用docker-compose服务编排,一键启动上述php和nginx等服务容器
创建 docker-compose.yml 文件,内容如下,修改项目路径和配置文件路径为自己的电脑文件夹路径:
- #yaml 配置实例
- version: '3'
- services:
- php:
- container_name: php-fpm-81
- image: php:8.1-fpm-alpine
- restart: always
- networks:
- - nginx_network
- ports:
- - "9000:9000"
- volumes:
- - "H:/home/code/docker/web:/var/www/html" #代码目录
- #- "H:/home/code/docker/php81/etc:/usr/local/etc" #php配置文件夹,可选
- #- "H:/home/code/docker/php81/log:/var/log/php" #log,可选
- networks:
- nginx_network:
- ipv4_address: 172.18.0.3
- nginx:
- container_name: nginx-common
- image: nginx:latest
- restart: always
- environment:
- - TZ=Asia/Shanghai
- ports:
- - "8008:80"
- depends_on:
- - "php"
- volumes:
- - "H:/home/code/docker/web:/var/www/html" #代码目录
- - "H:/home/docker/nginx/nginx_conf.d:/etc/nginx/conf.d" #配置文件目录
- #- "H:/home/docker/nginx/log:/var/log/nginx" #log,可选
- networks:
- nginx_network:
- ipv4_address: 172.18.0.4
-
- networks:
- nginx_network:
- driver: bridge
- ipam:
- config:
- - subnet: 172.18.0.0/16

在上述文件存在的目录 执行 docker-compose up -d 命令启动容器, 访问8008端口查看项目运行情况
创建redis配置文件 myredis.conf , 对应本地文件夹为H:/home/code/docker/redis
- port 6379
- timeout 65
- maxclients 10000
- databases 16
- maxmemory 1048576000
- appendonly yes
- #protected-mode no #关闭保护模式
- #bind 0.0.0.0
- requirepass 123456 #设置密码
启动redis
- docker run \
- --name php-redis \
- --restart=always \
- --log-opt max-size=100m \
- --log-opt max-file=2 \
- -p 6375:6379 \
- -v H:/home/code/docker/redis/myredis.conf:/etc/redis/redis.conf \
- -v H:/home/code/docker/redis/data:/data \
- --network nginx_network \
- --ip 172.18.0.5 \
- --privileged=true \
- -d redis redis-server /etc/redis/redis.conf \
- --appendonly yes --requirepass 123456
创建配置文件my.cnf,放入目录为 H:/home/code/docker/mysql/conf
- [client]
- default-character-set=utf8
- [mysql]
- default-character-set=utf8
- [mysqld]
- init_connect='SET collation_connection = utf8_unicode_ci'
- init_connect='SET NAMES utf8'
- character-set-server=utf8
- collation-server=utf8_unicode_ci
- skip-character-set-client-handshake
- skip-name-resolve
启动mysql
- docker run
- -p 3307:3306 \
- --name mysql \
- --restart=always \
- -v H:/home/code/docker/mysql/data:/var/lib/mysql \ #数据目录
- -v H:/home/code/docker/mysql/conf:/etc/mysql/conf.d \ #配置目录
- -v H:/home/code/docker/mysql/log:/var/log/mysql \ #log目录
- --network nginx_network \
- --ip 172.18.0.6 \
- --privileged=true \
- -e MYSQL_ROOT_PASSWORD=123456 \
- -d mysql:5.7
docker-compose启动 php+nginx+redis+mysql
附带php、nginx、redis、mysql 版本的docker-compose.yml 文件如下
- #yaml 配置实例
- version: '3'
- services:
- php:
- container_name: php-fpm-81
- image: php:8.1-fpm-alpine
- restart: always
- networks:
- - nginx_network
- ports:
- - "9000:9000"
- volumes:
- - "H:/home/code/docker/web:/var/www/html" #代码目录
- #- "H:/home/code/docker/php81/etc:/usr/local/etc" #php配置文件夹,可选
- #- "H:/home/code/docker/php81/log:/var/log/php" #log,可选
- networks:
- nginx_network:
- ipv4_address: 172.18.0.3
- nginx:
- container_name: nginx-common
- image: nginx:latest
- restart: always
- environment:
- - TZ=Asia/Shanghai
- ports:
- - "8008:80"
- depends_on:
- - "php"
- volumes:
- - "H:/home/code/docker/web:/var/www/html" #代码目录
- - "H:/home/docker/nginx/nginx_conf.d:/etc/nginx/conf.d" #配置文件目录
- #- "H:/home/docker/nginx/log:/var/log/nginx" #log,可选
- networks:
- nginx_network:
- ipv4_address: 172.18.0.4
- redis:
- image: redis:latest
- container_name: php-redis
- restart: always
- privileged: true #root权限
- ports:
- - "6375:6379"
- volumes:
- - "H:/home/code/docker/redis/myredis.conf:/etc/redis/redis.conf"#配置目录
- - "H:/home/code/docker/redis/data/:/data" #数据目录
- networks:
- nginx_network:
- ipv4_address: 172.18.0.5
- command: redis-server /etc/redis/redis.conf #已对应的配置文件启动
- mysql:
- image: mysql:5.7
- container_name: php-mysql
- privileged: true
- ports:
- - "3307:3306"
- volumes:
- - "H:/home/code/docker/mysql/data:/var/lib/mysql" #数据目录
- - "H:/home/code/docker/mysql/conf:/etc/mysql/conf.d" #配置目录
- - "H:/home/code/docker/mysql/log:/var/log" #log目录
- environment:
- - MYSQL_ROOT_PASSWORD=123456
- networks:
- nginx_network:
- ipv4_address: 172.18.0.6
- networks:
- nginx_network:
- driver: bridge
- ipam:
- config:
- - subnet: 172.18.0.0/16

查看镜像
docker images
查看容器
docker ps
docker ps -a
构建自定义镜像
docker build -t my_images:1.0 .
查看容器信息
docker inspect 容器id
登录docker容器内部
docker exec -it 容器id bash
宿主机和容器复制文件
docker cp /home/docker/nginx/xxx 容器id:/etc/nginx/xxx
docker cp 容器id:/etc/nginx/xxx /home/docker/nginx/xxx
docker网络
查看网络列表:docker network list
查看网络详情:docker network inspect 网络名称
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。