Docker 安装php开发环境(linux)

240 阅读4分钟

前言:我使用了宝塔,已经安装了docker. 可以使用docker -v 查看一下。

docker -v

image.png

一、安装MYSQL

  1. 拉取镜像

    // 拉取最新版的mysql
    docker pull mysql
    
    //拉取指定版本的mysql
    docker pull mysql:5.7
    ```
    

可以使用docker images 查看是否拉取镜像 image.png

  1. 运行MySQL
    #运行最新版 Mysql
    docker run --name mysql --restart=always --privileged=true -p 3306:3306 -v /docker/mysql/conf:/etc/mysql/conf.d -v /docker/mysql/data:/var/lib/mysql -v /docker/mysql/log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=12345678 -d mysql
    #运行制定版本
    docker run --name mysql_57 --restart=always --privileged=true -p 3306:3306 -v /docker/mysql/conf:/etc/mysql/conf.d -v /docker/mysql/data:/var/lib/mysql -v /docker/mysql/log:/var/log/mysql -e MYSQL_ROOT_PASSWORD=12345678 -d mysql:5.7
    

参数说明:

  •  run:创建一个新的容器

  • --name:指定容器的名称

  • -p:端口映射(宿主机端口:容器端口)

  • -e: 传入环境变量

  • -d: 后台运行

  • --restart=always ( Docker 重启时容器也跟随启动)

  • --privileged=true (Docker 为容易内的 root 用户赋予真正的 root 权限,不然会提示 log 目录权限不足)

  • -v docker/mysql/conf:/etc/mysql/conf.d (将配置目录挂载到容器内的配置目录)

  • -v docker/mysql/data:/var/lib/mysql (将数据存储目录挂载到容器内的出局存储目录)

  • -v /docker/mysql/log:/var/log/mysql (将日志目录挂载到容器内的日志目录)

    没有报错忽略下面内容

    常见的报错为Docker容器中的MySQL服务的3306端口映射到主机的3306端口,但宿主机这个端口已经被其他进程使用了。

    解决办法有两种:

    • 更改容器端口号例如( -p 3307:3306 )在运行前,查看当前所有容器docker ps -a,防止名字冲突,如果重复 使用 docker rm 容器id 删除。

    image.png

    • 关闭宿主机3306端口
    sudo lsof -i :3306 
    sudo kill -9 <PID>
    
  1. 如果想要对默认数据进行修改,允许远程访问,需进入容器内执行操作
$ docker exec -it mysql bash

$ mysql -u root -p 12345678
$ mysql-> ALTER user 'root'@'%' IDENTIFIED WITH mysql_native_password BY '12345678';
$ mysql-> FLUSH PRIVILEGES;

二、安装NGINX

  1. 拉取镜像
docker pull nginx
  1. 启动容器,并且访问 locahost:端口 就可打开nginx 欢迎页面了
# 如果80端口占用,根据个人实际情况修改,如果改为其他端口需要在服务器中心安全组开放对应端口号
 docker run -d -p 80:80 --name nginx nginx

image.png

  1. 创建目录存储 Nginx 的配置和日志
mkdir -p /docker/nginx && cd /docker/nginx
mkdir conf log
#创建www目录
cd /docker 
mkdir www
  1. 从容器内复制配置文件到宿主机,经配置文件映射到容器内对应的目录中
docker cp nginx:/etc/nginx/conf.d/default.conf /docker/nginx/conf/default.conf
  1. 重建容器
docker run --name nginx -p 81:80 -v /docker/nginx/conf:/etc/nginx/conf.d -v /docker/www:/usr/share/nginx/html -v /docker/nginx/log:/var/log/nginx -d nginx

6.查看容器 docker ps -a

image.png

三、安装PHP

  1. 拉取PHP镜像
#我拉取的是php7.4的,也可以拉取其他版本的
docker pull php:7.4-fpm
  1. 创建容器
    #先查看一下php 的IMAGE ID 
    docker images
    #把镜像id 填进去
    docker run --name php-fpm -p 9000:9000 -d 38f2b691dcb8

image.png

  1. 创建目录存储php配置文件和日志
mkdir -p /docker/php && cd /docker/php
mkdir conf log
  1. 从容器中复制配置文件
docker cp php-fpm:/usr/local/etc/php-fpm.d/www.conf /docker/php/conf/www.conf
docker cp php-fpm:/usr/local/etc/php/php.ini-production /docker/php/conf/php.ini
  1. 重新启动容器
#删除原来的php容器
docker rm php-fpm
#重新启动容器  最后面-d 后面写php 镜像的id
docker run --name php-fpm --link mysql:mysql -v /docker/www:/var/www/html -v /docker/php/conf/www.conf:/usr/local/etc/php-fpm.d/www.conf -v /docker/php/conf/php.ini:/usr/local/etc/php/php.ini -d 38f2b691dcb8(替换自己的php-fpm镜像id)

--link <name or id>:alias : 可以用来链接2个容器,使得源容器和接收容器之间可以互相通信    
      name和id是源容器的name和id,alias是源容器在link下的别名

连接 PHP 和 Mysql 容器后,PHP 脚本连接数据库时,host 的值为 'mysql'

6.设置nginx 和 php 在同一个docker 网络

#创建网络
docker network create mynetwork
#设置它们在同一个网络
docker network connect mynetwork php-fpm
docker network connect mynetwork nginx

7.Nginx 容器支持 PHP-FPM 容器,修改 Nginx 的配置文件 default.conf

server {
        listen       80;
        server_name  localhost;
        root /var/www/html;
        charset utf-8;

        access_log  /var/log/nginx/access.log  main;
        error_log  /var/log/nginx/error.log;

        location / {
            index  index.html index.htm index.php;
            try_files $uri $uri/ /index.php?$query_string;
        }
        #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   html;
        }

        location ~ \.php$ {
            fastcgi_index index.php;
            #php-fpm容器名:端口号
            fastcgi_pass   php-fpm:9000;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include       fastcgi_params;
        }

        location ~ /\.ht {
            deny  all;
        }
}

在docker/www下创建index.php ,打开看是否正常

<?php
phpinfo();

image.png