应用docker在本地搭建nginx环境,docker desktop自带了一个nginx镜像和示例,其实在首页点击大大的Run就能跑一个最简略的蕴含nginx过程的容器了。
但这个极简的容器间隔成为咱们在本地的开发环境还差一点点。至多咱们须要解决几个问题:
根底命令缺失
nginx的规范镜像基于debian slim镜像,这是一个很洁净的极简的环境,所以当咱们跑起了nginx容器,尝试对它做一些惯例操作的时候,会发现很多罕用的命令找不到。
比方top,ps,netstat,vi,less,ping等,这对于咱们玩这个容器十分不敌对。
文件治理问题
nginx过程启动了并不等于部署残缺了,因为如果咱们要在本地环境对nginx做些什么,肯定会波及到诸多文件如何治理的问题。比方配置文件,log,动态资源文件等。
网络管理问题
更简单的状况是要在本地搭建架构里的所有元素,那么nginx可能还要承当反向代理的角色,须要与其余的服务或者资源互通,那么如何管理网络,也会成为一个问题。
1. 装置一个nginx容器:先让它跑起来
有了规范镜像,跑起来十分的简略,只须要一行指令即可。
docker run -p 80:80 -d --name myNginx1 nginx:latest-p 为容器指定了一个映射到本机的端口,即把nginx容器裸露的80端口映射到本地的80端口上。-- name 为容器指定了一个举世无双的名字。
再为其创立一个hello world文件。
cd /usr/share/echo "hello world" > index.html
这样咱们就能够在本地拜访到这个页面了。
2. 装置常用命令
当初咱们来解决下面的问题,将罕用的命令装置起来,以便咱们玩这个容器。
报错1: 装置命令失败
有一种尝试是间接通过apt-get工具装置常用命令,然而会失败。
apt-get install vimE: Unable to locate package vim
报错2: 更新apt-get工具失败
为了解决报错1,须要更新apt-get工具,然而也会因为找不到deb源失败。
apt-get updateErr:1 http://deb.debian.org/debian bullseye InRelease403 connecting to deb.debian.org:80
deb.debian.org 不是很稳固,如果连不上,重复多试几次。
依照程序更新apt工具
apt updateapt-get update
更新胜利之后再执行一众常用命令的装置指令
apt-get install vimapt-get install procpsapt-get install curlapt-get install iputils-pingapt-get install net-toolsapt-get install telnet
这样一些罕用的命令就装置好了,能够在容器内应用。如果还有命令没有笼罩到,也对应装置起来即可。
映射本地文件
容器启动了,常用命令也装置好了,实践能够间接进入容器对文件进行操作。但很显著搭建本地环境,不可能所有的文件都进到容器里批改,这样就成玩具了。咱们须要欠缺的计划。
docker提供了文件挂载的反对,简略说就是把本地的文件映射到容器里,这样实际操作的时候就能够通过批改本地文件的形式来影响容器内部署的内容。
搭建本地workspace
因为有了文件挂载的反对,咱们能够把须要动静调整/须要操作的文件当作本地文件来解决。总结来看就是nginx的配置和日志。
mkdir %workspace%/distmkdir %workspace%/dist/confmkdir %workspace%/dist/staticmkdir %workspace%/log
在你的workspace里创立dist作为部署目录,蕴含conf目录寄存配置文件,static目录寄存动态部署文件; 创立log作为日志输入目录。
启动容器
docker run -d -p 80: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/nginx nginx:latest
挂载之后,对本地文件的批改也会实时反映在容器内部署的文件上。
3. 简单一点的状况:反向代理
如果只是作为动态资源服务器,部署胜利之后就能够玩起来了。简单一点的状况是让nginx表演反向代理的角色,这样部署的nginx还须要通过网络与上游的服务通信。
咱们应用docker的network命令在本地搭建一个网络,通过指定ip的形式来为容器赋予ip。理论的企业级利用对于外部网络分区、ip治理肯定会有更加业余的形式,这里咱们的指标只是为了搭建一个简略易用的本地环境,所以不做参考和比照。
创立一个网络
docker network create --subnet=172.1.0.0/16 native-dev-net
启动nginx容器
批改一下nginx容器启动命令,使其退出网络,并且领有一个固定ip。
docker run -d -p 8082:80--network native-dev-net --ip 172.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/nginx nginx:latestdocker run -d -p 8083:80--network native-dev-net --ip 172.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/nginx nginx:latest
启动前置反向代理nginx容器
批改nginx配置文件,加上代理转发相干信息。
server { listen 80; listen [::]:80; server_name localhost; location / { proxy_set_header Host $host; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forward-For $proxy_add_x_forward_for; proxy_pass http://172.1.0.2; } location /api { proxy_set_header Host $host; proxy_set_header X-Real-Ip $remote_addr; proxy_set_header X-Forward-For $proxy_add_x_forward_for; proxy_pass http://172.1.0.3; }}
启动作为反向代理的容器
docker run -d -p 8080:80--network native-dev-net --ip 172.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/nginx nginx:latest