docker安装Nginx

在安装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


版权声明:本文为longfeng995原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。