Docker配置PHP+Nginx+MySQL

安装MySQL

  • 获取镜像

    docker pull mysql            # 获取mysql镜像
  • 创建测试容器

    # a347a5928046 MySQL镜像ID
    # mysql_test 测试容器名称
    # /mysql/conf 宿主机mysql配置文件夹
    docker run -d -p 23306:3306 --name mysql_test a347a5928046
    # 复制/etc/mysql/my.cnf到宿主主机
    docker cp mysql_test:/etc/mysql/my.cnf /mysql/conf
  • 创建正式容器

    # 上面的测试容器可删除
    docker run -d -p 23306:3306 --name mysql8 \ 
    -v $PWD/mysql/conf/my.cnf:/etc/mysql/my.cnf \
    -v $PWD/mysql/data:/var/lib/mysql \
    -e MYSQL_ROOT_PASSWORD=123456 \
    --privileged=true 
    a347a5928046

安装Nginx

  • 映射目录结构

    docker_www                    # docker_www 主目录
        -mysql                    # mysql
            --conf                # 放配置文件
            --data                # 同步数据文件夹
        -nginx                    # nginx
            --conf.d            # 扩展配置
                --dq.conf        # 新增配置文件
            --logs                # 日志
            --nginx.conf        # nginx主配置文件
        -www                    # www目录->/usr/share/html
            --index.html        # 测试html文件,写入 <p>hello docker nginx</p>
            --info.php            # 写入 phpinfo
  • 获取镜像

    docker pull nginx        # 获取nginx基础镜像
  • 创建测试容器

    # ae2feff98a0c nginx的镜像ID
    # PWD 当前目录, 我这里进入的是docker_www目录
    docker run -d -p 8080:80 -v $PWD/www:/usr/share/html --name nginx_test ae2feff98a0c
    # 测试访问
    curl 127.0.0.1:8080
    #输出
    <p>hello docker nginx</p>
  • 创建可挂载目录Nginx容器

    # ae2feff98a0c nginx的镜像ID
    # PWD 当前目录, 我这里进入的是docker_www目录
    # nginx.conf 可以从上一个测试容器中复制出来,操作命令如下:
    # docker cp 容器名称:/etc/nginx/nginx.conf 宿主机目录
    # docker cp new_nginx_web_1:/etc/nginx/nginx.conf .
    docker run -d -p 8080:80 --name new_nginx_web_1  /
    -v $PWD/nginx/nginx.conf:/etc/nginx/nginx.conf /
    -v $PWD/nginx/conf.d:/etc/nginx/conf.d /
    -v $PWD/www:/usr/share/nginx/html /
    -v $PWD/nginx/logs:/var/log/nginx /
    ae2feff98a0c

安装PHP

  • 获取php镜像

    docker pull php:7.1-fpm        # 获取php基础镜像
  • 创建测试PHP镜像

    # 创建容器
    # 404422fc039e php镜像ID
    docker run -d -v $PWD/www:/var/www/html -p 9000:9000 --name phpfpm_test 404422fc039e
  • 创建正式PHP镜像

    # 先从上一个测试镜像中将配置文件都复制出来
    # 当前处于php目录下
    docker cp phpfpm_test:/usr/local/var/log log        # 复制日志
    docker cp phpfpm_test:/usr/local/etc conf            # 复制配置文件
    
    # 创建
     docker run -d -p 9000:9000  \
     -v $PWD/php/conf:/usr/local/etc \
     -v $PWD/php/log:/usr/local/var/log \
     -v $PWD/www:/var/www/html \
     --link mysql8:mysql8.0                                # 关联mysql8容器
     --name phpfpm_7.1 
     404422fc039e
    
     ### notcie
     ### 如果mysql无法运行,需要到容器中开启pdo扩展

镜像互联

  • Nginx 链接 PHP

    # ae2feff98a0c nginx的镜像ID
    # PWD 当前目录, 我这里进入的是docker_www目录
    # php7.1设置的链接别名,在nginx容器中可以使用
    docker run -d -p 8080:80 --name new_nginx_web_1 \ 
    -v $PWD/nginx/nginx.conf:/etc/nginx/nginx.conf \ 
    -v $PWD/www:/usr/share/nginx/html \ 
    -v $PWD/nginx/logs:/var/log/nginx  \
    --link phpfpm_test:php7.1  
    ae2feff98a0c
  • conf.d/dq.conf文件配置

    # php7.1 就是在创建的容器时 `--link phpfpm_test:php7.1`
    # 在容器中的/etc/hosts文件中,172.17.0.3  php7.1
    server {
        charset utf-8;
        client_max_body_size 128M;
    
        listen 80; ## listen for ipv4
        #listen [::]:80 default_server ipv6only=on; ## listen for ipv6
    
        server_name mine.nginx.com;
        root        /var/www/html;
        index       index index.html index.php;
    
        location / {
            #-e表示只要filename存在,则为真
            if (!-e $request_filename){
                rewrite  ^(.*)$  /index.php?s=$1  last;
                break;
            }
            # Redirect everything that isn't a real file to index.php
            try_files $uri $uri/ /index.php$is_args$args;
        }
    
        # uncomment to avoid processing of calls to non-existing static files by Yii
        #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
        #    try_files $uri =404;
        #}
        #error_page 404 /404.html;
    
        # deny accessing php files for the /assets directory
        location ~ ^/assets/.*\.php$ {
            deny all;
        }
    
        location ~ \.php$ {
            root           /var/www/html;
            fastcgi_pass   php7.1:9000;
            fastcgi_index  index.php;
            fastcgi_split_path_info  ^((?U).+\.php)(/?.+)$;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
            fastcgi_param  PATH_INFO  $fastcgi_path_info;
            fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_path_info;
            include        fastcgi_params;
    
            #include fastcgi_params;
            #fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            #fastcgi_pass 172.17.0.3:9000;
            #fastcgi_pass unix:/var/run/php5-fpm.sock;
            #try_files $uri =404;
        }
    
        location ~* /\. {
            deny all;
        }
    }
  • 测试请求

    curl 127.0.0.1:8080/info.php
本作品采用《CC 协议》,转载必须注明作者和本文链接
别问我八十年代的哪首歌
邓sir
讨论数量: 1

docker-compose 编排下。 可以参考下我这个 github.com/839891627/dnmp

做的算是比较简单,可以参照自己编排个。我做了稍等详细的说明,应该比较容易搞懂 🤝

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!