准备
docker pull mysql
docker pull nginx
docker pull bitnami/php-fpm
关键命令:
docker ps -a # 查看宿主机部署的所有容器
docker exec -it containerid /bin/bash # 进入正在运行的容器的内部
docker inspect container # 查看容器的详细信息,比如查找IPAddress等
关键参数:
-v 宿主机目录:虚拟机目录
-p 宿主机端口:虚拟机端口
--name my-name 指定下容器的别名
-d 以deamon守护进程的形式运行
--restart: always(挂掉就重启), on-failure:Number(失败就重启,到达Number次数上限后不再重启), no(永不重启) 需要注意的是--restart是由docker的守护进程完成的,一般都会和-d参数共同出现
--expose port 暴露虚拟机内部的某个端口
MYSQL
- 启动mysql服务
docker run --name some-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest
- 查找出mysql服务的本地IP地址
docker ps -a # 找出mysql容器的id
docker inspect mysql-container-id # 找到里面的IPAddress即可
- 修改root用户权限以用于访问。
mysql -uroot -p123456
use mysql
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';
alter user 'root'@'%' identified by '123456';
FLUSH PRIVILEGES;
NGINX
- 启动NGINX服务
➜ nginx ls
conf.d www
➜ nginx docker run -d -p 80:80 -v $PWD/www:/usr/share/nginx/html -v $PWD/conf.d/:/etc/nginx/conf.d --name local-nginx nginx
需要注意的是__宿主机的路径映射到虚拟机的对应目录__下之前,记得本地先mkdir。
PHP-FPM
- 启动php-fpm服务
➜ nginx docker run -d -p 9000:9000 --name local-phpfpm -v /Users/biao/Docker/nginx/www:/var/www/html bitnami/php-fpm
affcf36a04fe38fe92f2d1535a816d4993076e0fbcba9fc6adcfb1911e62b19b
➜ nginx docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
affcf36a04fe bitnami/php-fpm "php-fpm -F --pid /o…" 3 seconds ago Up 2 seconds 0.0.0.0:9000->9000/tcp local-phpfpm
def7c36da7bb nginx "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes 0.0.0.0:8080->80/tcp local-nginx
fcc02b919109 mysql:latest "docker-entrypoint.s…" 19 minutes ago Up 19 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp local-mysql
需要注意的是这里的宿主机www目录被映射到了php-fpm的html目录下,和上一步的NGINX其实共享了宿主机的同一个目录。
连接php-fpm和NGINX的配置,核心在于fastcgi_pass参数,利用IP+端口的形式,让NGINX请求php-fpm的处理,而不能使用unix-socket这种形式,因为后者只能在同一台机器上处理。容器化后肯定就不能用这种形式了。
修改conf.d目录下的default.conf为如下内容:
server {
listen 80 default_server;
server_name _;
root /usr/share/nginx/html;
location / {
index index.html index.htm index.php;
autoindex off;
}
location ~ \.php(.*)$ {
root /var/www/html/;
fastcgi_pass 172.17.0.4:9000; #php容器的IP地址
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;
}
}
测试
测试NGINX访问PHP-fpm,在www目录下创建phpinfo.php
文件
<?php
echo phpinfo();
然后访问链接:http://localhost/phpinfo.php
测试NGINX访问数据库以及php, 在www目录下创建testdb.php
<?php
$dbms='mysql'; //数据库类型
$host='172.17.0.2'; //数据库主机名,此处写mysql 容器的名字
$dbport = '3306';
$dbName='mysql'; //使用的数据库
$user='root'; //数据库连接用户名
$pass='123456'; //对应的密码
$dsn="$dbms:host=$host;port=$dbport;dbname=$dbName";
try {
$dbh = new PDO($dsn, $user, $pass); //初始化一个PDO对象
echo "successful!<br/>";
//你还可以进行一次搜索操作
foreach ($dbh->query('SELECT * from user') as $row) {
print_r($row); //你可以用 echo($GLOBAL); 来看到这些值
}
$dbh = null;
} catch (PDOException $e) {
die ("Error!: " . $e->getMessage() . "<br/>");
}
结语
这篇文章参考了很多优秀的前辈们的经验,越是发现docker真是个好东西。有什么想法,不用担心本地装软件破坏了宿主机环境,也不用跑到多台服务器上哐哐哐的一顿操作。一切都可以在docker轻松上轻松完成,简单,迅捷,高效。
参考自:
- [docker 安装nginx+mysql+php] https://blog.51cto.com/12123659/2301479