使用docker在本地搭建nginx环境,dockerdesktop自带一个nginx镜像和例子,其实点击首页的大Run就可以运行包含nginx的最简单的了工艺容器。但是这个最小的容器更接近我们的本地开发环境。至少我们需要解决几个问题:缺少基本命令。nginx的标准镜像基于debianslim镜像。这是一个非常干净和极简的环境,所以当我们运行nginx容器并尝试对其进行一些常规操作时,你会发现很多常用的命令都找不到。比如top、ps、netstat、vi、less、ping等,对我们玩这个容器很不友好。文件管理问题启动nginx进程并不意味着部署完成,因为如果我们要在本地环境用nginx做一些事情,肯定会涉及到很多文件如何管理。比如配置文件、日志、静态资源文件等。网络管理比较复杂的情况是把架构中的所有元素都构建在本地,那么nginx可能还承担了反向代理的作用,需要和其他服务通信还是资源,那么如何管理网络也将成为一个问题。1、安装一个nginx容器:首先让它用标准镜像运行,运行起来非常简单,一行指令即可。dockerrun-p80:80-d--namemyNginx1nginx:latest-p为容器指定一个映射到本地机器的端口,即将nginx容器暴露的80端口映射到本地的80端口--name指定容器的唯一名称。为它创建一个helloworld文件。cd/usr/share/echo"helloworld">index.html这样我们就可以在本地访问这个页面了。2、安装常用命令下面我们来解决上面的问题,安装常用命令,这样我们就可以玩转这个容器了。错误一:安装命令失败。一种尝试是直接通过apt-get工具安装常用命令,但会失败。apt-getinstallvimE:Unabletolocatepackagevimerror2:Failedtoupdatetheapt-gettool为了解决错误1,需要更新apt-get工具,但同样失败,因为找不到deb源.apt-getupdateErr:1http://deb.debian.org/debianbullseyeInRelease403连接到deb.debian.org:80deb.debian.org不是很稳定,如果连接不上,再试一次。依次更新apt工具aptupdateapt-getupdate更新成功后执行很多常用命令的安装说明toolsapt-getinstall安装了telnet等一些常用的命令,可以在容器中使用。如果还有没有涉及到的命令,就相应安装即可。启动映射本地文件的容器,安装常用命令。理论上可以直接进入容器对文件进行操作。但是显然要搭建一个本地环境,不可能把所有的文件都输入到容器中进行修改,所以就成了一个玩具。我们需要一个可靠的解决方案。Docker提供了对文件挂载的支持。简单的说,就是将本地文件映射到容器中,这样在实际运行的时候,通过修改本地文件就可以影响部署在容器中的内容。构建本地工作空间由于支持文件挂载,我们可以将需要动态调整/操作的文件视为本地文件。总结起来就是nginx的配置和日志。mkdir%workspace%/distmkdir%workspace%/dist/confmkdir%workspace%/dist/staticmkdir%workspace%/log在你的workspace中创建dist作为部署目录,包括conf目录存放配置文件,static目录存放静态部署文件;创建日志作为日志输出目录。启动容器dockerrun-d-p80:80-v%workspace%/dist/conf/nginx.conf:/etc/nginx/nginx.conf-v%workspace%/dist/conf/conf.d:/etc/nginx/conf.d-v%workspace%/dist/static:/usr/share/nginx/html-v%workspace%/log:/var/log/nginxnginx:latest挂载后,修改本地文件也可以将实时反映在容器中部署的文件上。3、更复杂的情况:如果反向代理只作为静态资源服务器使用,部署成功后即可播放。更复杂的情况是让nginx起到反向代理的作用,这样部署的nginx也需要通过网络与下游服务通信。我们使用docker的network命令在本地搭建网络,通过指定ip给容器分配ip。实际的企业级应用对于内网划分和ip管理肯定有更专业的方法。我们这里的目标是搭建一个简单易用的本地环境,所以不做参考和比较。创建网络dockernetworkcreate--subnet=172.1.0.0/16native-dev-net启动nginx容器修改nginx容器启动命令,使其加入网络并拥有固定ip。dockerrun-d-p8082:80--networknative-dev-net--ip172.1.0.2-v%workspace%/nginx1/dist/conf/nginx.conf:/etc/nginx/nginx.conf-v%workspace%/nginx1/dist/conf/conf.d:/etc/nginx/conf.d-v%workspace%/nginx1/dist/static:/usr/share/nginx/html-v%workspace%/nginx1/log:/var/log/nginxnginx:latestdockerrun-d-p8083:80--networknative-dev-net--ip172.1.0.3-v%workspace%/nginx2/dist/conf/nginx.conf:/etc/nginx/nginx.conf-v%workspace%/nginx2/dist/conf/conf.d:/etc/nginx/conf.d-v%workspace%/nginx2/dist/static:/usr/share/nginx/html-v%workspace%/nginx2/log:/var/log/nginxnginx:latest启动前置反向代理nginx容器修改nginx配置文件,加上代理转发相关信息。服务器{听80;听[::]:80;服务器名称本地主机;位置/{proxy_set_header主机$host;proxy_set_headerX-Real-Ip$remote_addr;proxy_set_headerX-Forward-For$proxy_add_x_forward_for;proxy_passhttp://172.1.0.2;}location/api{proxy_set_header主机$host;proxy_set_headerX-Real-Ip$remote_addr;proxy_set_headerX-Forward-For$proxy_add_x_forward_for;proxy_passhttp://172.1.0.3;}}启动作为反代理的容器dockerrun-d-p8080:80--networknative-dev-net--ip172.1.0.1-v%workspace%/proxy/dist/conf/nginx.conf:/etc/nginx/nginx.conf-v%workspace%/proxy/dist/conf/conf.d:/etc/nginx/conf.d-v%workspace%/proxy/dist/static:/usr/share/nginx/html-v%workspace%/proxy/log:/var/log/nginxnginx:latest
