转载: https://blog.csdn.net/a516972602/article/details/86376990/
为什么要用docker,docker基本的一些命令不再本文章的讨论范围。

docker部署web项目需要用到几个服务:php,nginx,redis等等,本篇文章讲一下PHP,nginx以及redis的使用,更多的服务流程跟启动这三个服务雷同。php使用5.6版本。当然也可以使用最新版,流程是一样的

1: 首先把先把用到的镜像拉到本地:

docker pull php:5.6-fpm
docker pull nginx
docker pull redis

2: 启动之前先创建一个docker网络,使用docker来连接多个容器。

docker network create -d bridge php-net

3: 因为代码我们都是在本地修改,然后做个映射到各个docker中去就可以了。首先启动redis,因为redis不需要做映射,启动最简单:

docker run --name redis -d --network php-net -p 6379:6379 redis

4: 下面开始启动php跟nginx容器,因为我们是在本地开发,所以需要挂载主机web目录到容器,假设我们本地web目录为/data/website,然后由容器服务来运行这个web项目

#  -p 9001:9000  后面这个9000是php的端口, 目前发现改了php会运行不起来
docker run --name php -d --network php-net -p 9001:9000 -v /data/website:/data  php:5.6-fpm

// 先运行容器
docker run --name nginx -d --network php-net -p 80:80 -v /data/website:/data  nginx:latest
// 拷贝配置文件到宿主机
docker cp nginx:/etc/nginx/conf.d/default.conf  /data/nginx/conf.d/default.conf
// 删除临时容器
docker rm -f nginx
// 再次运行容器
docker run --name nginx -d --network php-net -p 80:80 \
-v /data/website:/data \
-v /data/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf  \
nginx:latest

5: 这样3个容器就启动了,他们在统一docker网络内,可以通过ip互相进行访问。

接下来划重点部分 配置nginx,以及安装php扩展。因为官方的php是一个纯净的php环境,需要我们一个个扩展去安装。

首先进入nginx容器找到nginx配置文件配置

docker exec -it nginx bash
cd  /etc/nginx/conf.d
vim default.conf

在default.conf配置文件中填入以下内容

server{
    listen 80;
    server_name localhost;
    location / {
        root /data;  #对应主机挂载到nginx容器中的/data代码目录
        index index.php index.html index.htm;
    }
    location ~\.php(.*)$ {
        root /data;     #对应主机挂在到php容器中的/data代码目录
        fastcgi_pass 172.19.0.3:9000;   #此地址为php容器的内网ip
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data$fastcgi_script_name;  
        fastcgi_param PATH_INFO $1;   #此行配置pathinfo,tp框架必须使用pathinfo
        include fastcgi_params;
    }
}

ps: docker容器内vim 无法使用
apt-get update
apt-get install vim

6: 编辑完配置文件之后进行重载配置

service nginx reload

7: 之后再进入到php-web容器里面开始安装用到的扩展,这里我们安装几个比较常用的扩展,流程基本都一样

docker exec -it php bash
cd /usr/local/bin  
./docker-php-ext-install pdo_mysql  
./docker-php-ext-install mysql
./docker-php-ext-install mysqli
docker-php-ext-install bcmath
docker-php-ext-install mbstring
apt-get update && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev
docker-php-ext-install -j$(nproc) iconv
docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/
docker-php-ext-install -j$(nproc) gd
pecl install redis-4.0.1 && pecl install xdebug-2.6.0 && docker-php-ext-enable redis xdebug

一口气安装了mysql,bcmath,gd,mbstring,redis等扩展

8: 重启php容器服务

docker restart php

这样一个完整的web项目就使用docker部署完成了,没有安装mysql容器,因为安装方式雷同,在连接的时候注意使用他们的内网ip去连接,如果想要连接宿主机,那么使用ifconfg命令找到docker0开头的那行,那个ip就是宿主机的ip,通过这个ip可以请求宿主机,比如我们在宿主机上又个mysql,那么可以使用ip:port来访问,容器之间也是使用内网ip来互相访问,进入每个容器然后cat /etc/hosts来获取ip

ps: mysql 配置远程访问


docker run -d -p 3306:3306  -e MYSQL_ROOT_PASSWORD=root --name mysql -v /data/mysql5.5:/var/lib/mysql mysql:5.5.53

$ sudo docker exec -it mysql bash # 进入 MySQL 容器

$ mysql -uroot -p # 登录 MySQL,执行后输入密码进入 MySQL

$ use mysql; # 选择使用 mysql 数据库

MySQL 8 配置

CREATE USER 'james'@'%' IDENTIFIED BY '123456asd';
# 创建一个账号-james,用来进行远程访问;
# '%'代表的是所有IP,如果可以尽量设置指定 IP 或 IP 段
#  CREATE USER 'james'@'192.168.%.%' IDENTIFIED BY '123456asd';
 
GRANT ALL ON *.* TO 'james'@'%';
# 赋予所有权限给之前创建的账号:james
 
ALTER USER 'james'@'%' IDENTIFIED WITH mysql_native_password BY '123456asd';
# 确认使用密码{123456asd}登录此账号{james}
# 密码尽量复杂,安全性更高。
 
FLUSH PRIVILEGES;
# 刷新权限

MySQL 5.7 配置

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
# {usernama} 是远程访问登录的用户名,不建议用 root;
# {password} 是远程访问的登录密码;
# '%'代表的是所有IP,如果可以尽量设置指定 IP 或 IP 段
#  GRANT ALL PRIVILEGES ON *.* TO 'username'@'111.198.227.%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;
# 刷新权限

nginx 配置

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /data/app;
        index  index.php index.html index.htm;
  		if (!-e $request_filename) {
           rewrite  ^(.*)$  /index.php?s=$1  last;
           break;
           # break; 必须要加, 不加就有问题....
        }
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /data/app;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    location ~ \.php$ {
        root           /data/app;
        fastcgi_pass   172.18.0.5:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /data/app$fastcgi_script_name;
        fastcgi_param  PATH_INFO $1;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

nginx 配置负载均衡

// default.conf 文件内容

upstream myServer {
    # ip_hash;
    server 192.168.108.100:80;
    server 192.168.108.101:80;
}

server {
    listen       80;
    server_name  localhost;
           
    location / {
         proxy_pass   http://myServer;
    }
}

docker nginx 404 访问不了php程序

注意配置中的php IP地址: fastcgi_pass 172.18.0.5:9000;

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐