乐趣区

关于后端:用-docker-在本地搭建-nginx-静态服务器-反向代理

应用 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 vim
E: Unable to locate package vim

报错 2:更新 apt-get 工具失败

为了解决报错 1,须要更新 apt-get 工具,然而也会因为找不到 deb 源失败。

apt-get update
Err:1 http://deb.debian.org/debian bullseye InRelease
403  connecting to deb.debian.org:80

deb.debian.org 不是很稳固,如果连不上,重复多试几次。

依照程序更新 apt 工具

apt update
apt-get update

更新胜利之后再执行一众常用命令的装置指令

apt-get install vim
apt-get install procps
apt-get install curl
apt-get install iputils-ping
apt-get install net-tools
apt-get install telnet

这样一些罕用的命令就装置好了,能够在容器内应用。如果还有命令没有笼罩到,也对应装置起来即可。

映射本地文件

容器启动了,常用命令也装置好了,实践能够间接进入容器对文件进行操作。但很显著搭建本地环境,不可能所有的文件都进到容器里批改,这样就成玩具了。咱们须要欠缺的计划。
docker 提供了文件挂载的反对,简略说就是把本地的文件映射到容器里,这样实际操作的时候就能够通过批改本地文件的形式来影响容器内部署的内容。

搭建本地 workspace

因为有了文件挂载的反对,咱们能够把须要动静调整 / 须要操作的文件当作本地文件来解决。总结来看就是 nginx 的配置和日志。

mkdir %workspace%/dist
mkdir %workspace%/dist/conf
mkdir %workspace%/dist/static
mkdir %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:latest

docker 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
退出移动版