在安装Nginx之前,我们可以先查看一下我们的镜像:
docker images
唉,什么都没有~
开始我们的魔术!
首先,咱们需要先安装Nginx的镜像,使用下面的命令:
docker pull nginx:latest这样的话,就会安装Nginx的最新版本。
但是!不建议这样做....
因为Nginx最新版本,不一定是最稳定的版本,并且最新版本,有可能我们的一些老项目,或者同事、同学正在开发的项目,是另外的版本,那么这么做,显然不是最好的。
或许当前最新版本能兼容之前的老版本,但建议,可以的话,就规定好使用的是哪个版本,大家做到统一,这样团队开发才是最好的,否则可能会造成,A同学能跑,B同学出现异常。咱们使用docker的初衷,也就是保证环境的一致性。
所以建议安装Nginx时指定版本,使用下面的命令:
docker pull nginx:1.22然后执行 "docker images" 查看安装好的镜像,可以看到 TAG 是1.22

但是呢,咱们看版本不能以这个"TAG"来看,因为"TAG"只是一个标签,如果我们使用的是 "latest"下载最新版本,这个TAG 显示的就是"latest"
所以查看镜像Nginx版本命令,需要使用下面这条命令:
docker image inspect IMAGE ID | grep -i version
这里就可以看到"NGINX_VERSION=1.22.1",就是我们下载的版本了。
现在是 2023年2月4日,前两天我使用"docker pull nginx:latest" 安装最新版本,我记得是 1.23 版本。有兴趣的同学也可以使用 latest 安装一下,然后再看一下版本。
以上,我们就安装好Nginx镜像了
安装好镜像,假设我们直接去浏览器,输入"localhost"查看,显然是不行的,因为我们只是安装好了一个Nginx,并没有启动Nginx服务,也没有做对应的配置。。。
所以!接下来,我们还要去"docker 容器"里进行一系列操作。
接下来的内容未成年人请在父母陪同下观看。
我们使用命令,看一下容器:
docker ps -a
好的,可以看到,什么都没有。
有同学会提问了,为什么后面要加一个"-a",因为很多时候,直接 "docker ps" 就能看容器呀。
回答:因为不加"-a"只能看到正在运行的容器,加了"-a"就会显示所有的容器,包含:运行中、未运行的。
我们开始安装Nginx容器。
执行命令:
docker run --name nginx-test -p 80:80 -v D:/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v D:/docker/nginx/log:/var/log/nginx -v D:/docker/nginx/html:/usr/share/nginx/html -v D:/docker/nginx/conf/vhosts:/etc/nginx/vhosts -d IMAGE ID
命令中,各项参数解释:
run 在新容器中运行命令
--name 为容器分配一个名称。上面我们分配的名称就叫"nginx-test"
-p 将容器的端口发布到。上面的"80:80",就是将我们的80端口,映射到容器里的80端口,第一个80就是我们环境中的,第二个80是docker容器中的
-v 绑定挂载卷。就拿其中第一个"D:/docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf"说明,前者很容易看出,我的环境是Windows环境,所以是D盘,然后一直到 nginx.conf 配置文件,中间有一个英文冒号":"就是映射到docker容器中的"nginx.conf"配置文件,将两者进行绑定,这样我们在"D:/docker/nginx/conf/nginx.conf"中修改配置文件,docker容器中的配置文件,也会相对应跟着修改。
-d 在后台运行container并打印容器ID
补充(关键):
上面很顺利吧,没有出现任何异常,那是因为我在此之前就将配置文件调整好了的。第一次按照上面流程操作的同学,可能会出现下面这个异常:

根据里面的错误内容能发现,是挂载错误,一个是文件,另一个是目录。
因为我现在是在Windows环境下执行的,所以我们可以打开硬盘看一下目录是怎样的。

"nginx.conf"这应该是我们的配置文件,文件!!!
然而自动生成时,它却是一个目录,所以我们需要修改成文件。

这样的话就可以了。
不过还不够!
因为它是配置文件,我们需要配置Nginx
复制下面的内容到"nginx.conf"即可
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
map $time_iso8601 $logdate {
'~^(?<ymd>\\d{4}-\\d{2}-\\d{2})' $ymd;
default 'date-not-found';
}
include vhosts/*.conf;
client_max_body_size 10000m;
}
同学们能看见,当前目录里,除了"nginx.conf"文件,还有一个"vhosts"目录。
也能看到,在"nginx.conf"中,我们最下方有一行"include vhosts/*.conf;"
include的中文意思是:包括。
根据这个配置内容,我们可以简单理解就是,vhosts中的所有*.conf 文件,都包含。
为什么会这么做呢?
因为Nginx配置中,有一个server块,如果我们有多个微项目,全部写在 nginx.conf 中,那么日积月累下来,显然是会越堆越多,维护起来也就会越麻烦。所以就可以单独拿出来进行管理
来到"vhosts"目录,我们在里面创建一个"localhost.conf"文件

因为里面我们只有server块,所以做一个简略的配置,将下面的内容复制进去:
server {
listen 80;
server_name localhost;
root /usr/share/nginx/html;
location / {
index index.html;
}
}
root 指向的是"/usr/share/nginx/html",为什么呢?
回到上面,我们运行容器时,-v 挂载中,容器内的html 地址,就是"/usr/share/nginx/html",所以我们指向的是docker容器内的地址,而并不是Windows下的地址。
好的,Nginx的配置好了,那我们启动容器呢。
因为上面我们已经创建了容器,只是启动容器时报的错误,所以无需再run
可以先看一下容器,执行下面的命令:
docker ps -a
能看到,容器是已经存在的,status是Created,状态是创建。
那我们运行这个容器,可以执行下面这个命令:
docker start CONTAINER ID
然后我们再看一下容器的信息:
docker ps -a
能看到,状态已经不是之前的"Created",而是变成了"Up 57 seconds" 意思是已经运行了57秒
好的,容器运行成功,根据我们的Nginx配置,上面的"localhost.conf"文件,里面的"server_name"域名地址,使用的是"localhost",端口是80,那么我们就可以在浏览器上直接访问。

哦豁。。。
咋个出现了一个403?
如果说403具体原因,那好像就有点多了。但我们可以想一想,我们自己是否还有什么东西没有做好呢?
可以检查一下。
然后发现我们挂载中,有"nginx.conf"、"log"、"html"、"vhosts"
其中"nginx.conf"和"vhosts"我们已经配置了,那么"log"和"html"呢?
可以看一下log

咦,里面自动生成了两个文件,一个是"access.log",另一个是"error.log"
打开两个文件,发现里面是记录的nginx日志。
那么转头去看看"html"呢

发现里面什么文件都没有,那可就不对了。
我们可以看到,在"localhost.conf"文件里,"server"块中,"location"里面,有index文件的,意思是默认情况下打开"index.html"文件,但是我们这个"html"目录下,是没有"index.html"文件的。那是不是这个原因导致的403呢?
先加一个"index.html"文件试试

然后我们再去访问一下浏览器试试:

发现没有403了,但是是一篇空白的,为什么呢?
因为我们创建的"index.html"文件,是一个空的文件,没有任何内容的。那么我们加入一些html的代码看看:
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<h1>Hello World</h1>
<div>这里是入口index.html文件</div>
</body>
</html>保存后,再去刷新一下浏览器:

哇,这魔术太有趣了。。。
以上是在Windows环境下操作部署的,解答一个同学们可能感兴趣的问题,因为我当初也很想知道。就是上面这一套,适用于linux吗???
答案是,适应!!!
别问我怎么知道的,我在windows下跑了一遍之后,按照上面的流程在linux上运行,一切OK