【docker专题(5)】安装Lnmp(多PHP版本与宝塔)
[info] 稍微了解一下即可,实际上不会这样操作,都是通过docker-compose来进行编排的。
安装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
- 要理解映射目录,宿主目录只是映射到容器目录,要站在容器目录的角度来做相应的配置!
- 注意,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