【docker专题(5)】安装Lnmp(多PHP版本与宝塔)

[info] 稍微了解一下即可,实际上不会这样操作,都是通过docker-compose来进行编排的。

安装Lnmp(多PHP版本)

下载对应的镜像版本

https://hub.docker.com/ 搜索镜像

【docker专题(5)】安装Lnmp(多PHP版本与宝塔)

docker pull mysql:8.0
docker pull mysql:5.7
docker pull php:7.2-fpm
docker pull php:5.6-fpm
docker pull nginx:1.15

创建容器,映射工作目录和端口

# 创建php:5.6-fpm的容器并命名php56,将容器的9000端口映射到主机的9000端口。
# 注意:左边是宿主机,右边是docker
# 注意:挂载的目录要和nginx配置的root目录一致
docker run -d -p 9000:9000 --name php56 -v /home/docker/wwwroot:/usr/share/nginx/html php:5.6-fpm

# 停止上面版本之后再创建其他版本的PHP
# 进入容器后再通过docker-php-ext-install来安装对应的扩展 docker-php-ext-install mysqli
docker run -d -p 9000:9000 --name php72 -v /home/docker/wwwroot:/usr/share/nginx/html php:7.2-fpm

# 创建mysql容器,同一个镜像可以创建多容器(镜像就像是类,容器就像是实例)
docker run -d -p 3307:3306 --name mysql57-master  -e  MYSQL_ROOT_PASSWORD=123456  mysql:5.7
docker run -d -p 3308:3306 --name mysql57-slave  -e  MYSQL_ROOT_PASSWORD=123456 mysql:5.7

# 创建nginx容器
# 1. 第一个“-v”,是项目位置,把项目放到挂载到的目录下即可
# 2. 第二个“-v”,是挂载的主配置文件"nginx.conf",注意"nginx.conf"文件内有一行
#    "include /etc/nginx/conf.d/*.conf;" ,
#     这个include指向了子配置文件的路径,此处注意include后所跟的路径一定不能出错
# 3. 第三个“-v”,把docker内子配置文件的路径也挂载了出来,注意要与 “2.” 中include指向路径一致
# 4. nginx.conf是挂载了一个文件(docker是不推荐这样用的),conf.d挂载的是一个目录
# 注意,一定要先创建目录再挂载
docker run \
    --name nginx115 \
    -d -p 80:80  \
    -v /home/docker/wwwroot:/usr/share/nginx/html  \
    -v /home/docker/nginx/nginx.conf:/etc/nginx/nginx.conf \
    -v /home/docker/nginx/vhost:/etc/nginx/conf.d  \
nginx:1.15

[info] 1. 挂载的目录可以用nsenter命令进入容器中查看,注意,不要用docker attach。 甚至还可以用 docker exec -i -t container_name /bin/bash

  1. 要理解映射目录,宿主目录只是映射到容器目录,要站在容器目录的角度来做相应的配置!
  2. 注意,php的挂载目录要与nginx的挂载目录要一致,否则会出现File not found.错误!

配置

[danger] 注意,所有的配置是以容器根目录开始;不要设置成映射的宿主机目录。

nginx.conf

user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
}

hello_world.conf

server {

  listen 80;
  server_name  localhost;

  # 这里是容器的位置!
  root  /usr/share/nginx/html;
  index index.php index.html;

  location / {
    index index.php index.html index.htm;
    if (!-e $request_filename) {
      rewrite ^/(.*)$ /index.php?$1 last;
      break;
    }
  }

  location ~ \.php$ {
    # 这里的ip是对应PHP版本的容器的ip地址
    # docker inspect -f '{{.NetworkSettings.IPAddress}}'  容器名
    # 版本切换的话,就是停止和启动对应版本的容器即可
    fastcgi_pass 172.17.0.2:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
  }
}

安装PHP扩展

docker exec -it php5.6 /bin/bash
docker-php-ext-install mysqli (mysql,gd,curl,...)

安装镜像中非自带的php扩展:例如 php-redis扩展:
php-redis扩展下载地址:https://github.com/phpredis/p... (选择适合的版本下载)
可以在php容器内使用wget下载,也可以在ubuntu中下载后拷贝到容器中。

#将ubuntu中的/data/phpredis3.1.2拷贝到容器的/usr/src/php/ext/目录下并重命名为redis 。
docker cp /data/phpredis3.1.2 php5.6:/usr/src/php/ext/redis

PHP链接其他容器的mysql

<?php
$dbms='mysql';     //数据库类型
$host='172.17.0.3'; //容器ip
$port=3306;
/*
$host='172.28.3.199'; //宿主机ip
$port=3307;

注意:
端口映射: 3307:3306
容器ip:172.17.0.3
宿主机ip:172.28.3.199
如果要通过容器ip来链接的话,端口要填写容器ip的端口3306。
而不是映射到宿主机的3307端口。
如果要通过宿主机ip来链接的话,端口要写映射到宿主机的端口3307。
*/

$dbName='test';    //使用的数据库
$user='root';      //数据库连接用户名
$pass='123456';          //对应的密码
$dsn="$dbms:host=$host;port=$port;dbname=$dbName";
try {
    $dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
    echo "连接成功<br/>";
    foreach ($dbh->query('SELECT * from test') as $row) {
        print_r($row);
    }
    $dbh = null;
} catch (PDOException $e) {
    die ("Error!: " . $e->getMessage() . "<br/>");
}

docker宝塔面板安装(不建议,做测试可以用)

docker pull centos:7

# 因为要用于swoole开发,所以开的端口比较多
# 只用在开发环境
docker run -it -p 20:20 -p 21:21 -p 80:80 -p 8080:8080 -p 443:443 -p 3366:3306 -p 6399:6379 -p 888:888 -p 8888:8888 -p 9500:9500 -p 9501:9501 -p 9502:9502 -p 9503:9503 -p 9504:9504 -p 9505:9505 --name bt_panel  -v /home/docker/wwwroot:/home/wwwroot centos:7

# 下载必要工具
yum -y update  && yum -y install initscripts screen wget

# 防止网络掉线或意外退出,可以使用screen工具
screen -S install_bt

# 安装宝塔面板
wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

安装完输出以下内容

==================================================================
Congratulations! Installed successfully!
==================================================================
# 自行替换成内网ip
Bt-Panel: http://180.168.76.242:8888/6a863329
username: vzsybxji
password: 455e4a2a

# 宝塔命令
https://www.bt.cn/btcode.html