>[info] 稍微了解一下即可,实际上不会这样操作,都是通过docker-compose来进行编排的。
[toc]
## 安装Lnmp(多PHP版本)
### 下载对应的镜像版本
https://hub.docker.com/ 搜索镜像
![](https://i.loli.net/2019/05/20/5ce24797b74c673266.png)
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
> 2. 要理解**映射目录**,宿主目录只是映射到容器目录,要站在容器目录的角度来做相应的配置!
> 3. **注意,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/phpredis (选择适合的版本下载)
可以在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