1.环境
ubuntu16 vscode docker docker compose
2.步骤
2.1 拉取nginx镜像
docker pull nginx
启动容器
docker run -rm --name my-nginx -p 8080:80 nginx
--rm 容器停止后可以自动清理容器和相关文件系统,方便调试,避免每次都手动删除然后重启
--name 为容器命名
-p 宿主机8080 端口映射到容器80端口
此时一个ngixn容器已经跑起来了 在宿主机浏览器 输入localhost:8080 便可以正常访问
2.2 指定宿主机目录
在系统创建一个目录 创建一个文件 index.html 里面输入123456
删除之前的容器重新执行命令
docker run --rm --name test-nginx -p 8080:80 -v /docker/www:/usr/share/nginx/html nginx
此时再访问浏览器 localhost:8080 此时打印123456
2.3让nginx配置挂在宿主机文件
我们新建一个nginx config文件
server {
root /usr/share/nginx/html;
index index.html index.php;
server_name localhost;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
再新增一个PHP文件 输出 phpinfo()
目录结构如下
删除之前容器再次运行如下命令
docker run --rm --name test-nginx -p 8080:80 -v /docker/www:/usr/share/nginx/html -v/docker/nginx:/etc/nginx/conf.d nginx
3.拉取php-fpm镜像
docker pull php:fpm
docker run --rm --name php-app php:fpm
此时再次输入localhost:8080/index.php 报502错误 无可用的 cgi
我们请求php文件把这个请求交给php-fpm处理 但是nginx请求fpm的时候请求不了,因为之前的同一台机器里一个机器的各个端口只要处理好可以容易互通,但是现在跨容器怎么关联呢
4.容器的互联
容器是一个虚拟出来的盒子,每个容器都相当于一个进程级别的虚拟环境
4.1 使用--link参数指定连接容器
修改我们刚才创建的ngixn配置文件
server {
root /usr/share/nginx/html;
index index.html index.php;
server_name localhost;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location ~ \.php$ {
fastcgi_pass php-app:9000; # php-app就是我们刚才启动的fpm容器名称
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
增加link 参数重启
docker run --rm --name test-nginx -p 8080:80 -v /docker/www:/usr/share/nginx/html -v /docker/nginx/:/etc/nginx/conf.d --link php-app nginx
刷新页面报错file not found 这是因为还没有 为fmp挂载项目代码
继续修改配置文件
server {
root /usr/share/nginx/html;
index index.html index.php;
server_name localhost;
error_log /var/log/nginx/error.log;
access_log /var/log/nginx/access.log;
location ~ \.php$ {
root /var/www/html; #php-fpm 默认的根目录
fastcgi_pass php-app:9000; # php-app就是我们刚才启动的fpm容器名称
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}
执行fpm挂载项目根目录 重启
docker run --rm --name php-app -v /docker/www:/var/www/html php:fpm
再次刷新页面 出现phpinfo
4.2.使用 --network 指定使用的容器网络实现互联
1,手动创建一个网络
docker network create my-php-network
2,重启fpm 用 --network 显试的声明使用网络
docker run --rm --name php-app --network my-php-network -v /docker/www:/var/www/html php:fpm
2,重启ngixn用 --network 显试的声明使用网络
docker run --rm --name test-nginx -p 8080:80 -v /docker/www:/usr/share/nginx/html -v /docker/nginx/:/etc/nginx/conf.d --network my-php-network nginx
刷新页面 同样显示phpinfo