基于Docker的Nginx的安装与配置

基于Docker的Nginx的安装与配置

  • [1 为Nginx创建一个容器](#1 为Nginx创建一个容器)
    • [1.1 学习docker run](#1.1 学习docker run)
    • [1.2 通过docker run为Nginx创建并启动一个容器](#1.2 通过docker run为Nginx创建并启动一个容器)
  • [2 配置Nginx](#2 配置Nginx)
    • [2.1 学习docker的bind mount技术](#2.1 学习docker的bind mount技术)
    • [2.2 在Nginx容器中找到想修改的文件所在的目录](#2.2 在Nginx容器中找到想修改的文件所在的目录)
      • [2.2.1 认识nginx.conf文件](#2.2.1 认识nginx.conf文件)
      • [2.2.2 访问Nginx服务,默认返回index.html](#2.2.2 访问Nginx服务,默认返回index.html)
    • [2.3 找到后,在主机创建对应的目录,为后续挂载做准备 [在主机的终端进行操作]](#2.3 找到后,在主机创建对应的目录,为后续挂载做准备 [在主机的终端进行操作])
      • [2.3.1 创建目录](#2.3.1 创建目录)
      • [2.3.2 拷贝文件](#2.3.2 拷贝文件)
      • [2.3.3 在主机中修改Nginx的index.html](#2.3.3 在主机中修改Nginx的index.html)
    • [2.4 删除就Ngingx容器,重启新Nginx容器](#2.4 删除就Ngingx容器,重启新Nginx容器)
    • [2.5 新Nginx容器,新的index.html](#2.5 新Nginx容器,新的index.html)

1 为Nginx创建一个容器

  • 实际中,后端代码部署在远端容器中以向外提供后端服务。
  • 类似的,我们可以在本地为Nginx创建一个容器,并提供Nginx服务。

1.1 学习docker run

  • 一般情况,启动一个服务,需要先拉取该服务的镜像,然后为该镜像启动一个容器。这个可以用一条命令来实现:docker run
  • 通过docker --help查看如何使用docker命令:
  • 进一步查看:docker run --help

Options很多,一般掌握最基本的的,也就够用了。如果遇到不够用的情况,把诉求描述给gpt,让它帮忙写就好了,或者google一下。

1.2 通过docker run为Nginx创建并启动一个容器

  • macOS的shell中执行:
bash 复制代码
docker run \
--restart always \
--name Nginx \
-d \
-p 80:80 \
nginx

常用参数的详细解释:

(1)--restart always:是设定重启策略,意味着无论容器的退出状态码是什么,Docker都会自动重启这个容器。这样可以保证在Docker进程或主机重启后,容器将自动启动。

(2)--name Nginx:是设定这个新建的Docker容器的名字为"Nginx"。如果不设定,Docker将自动给它分配一个随机的名字。

(3)-d是让这个容器在后台运行,而不是在当前的shell里。

(4)-p 80:80是设定端口映射,将主机的80端口映射到容器的80端口。这样,我们可以通过主机的80端口访问到容器内运行的服务。

(5)nginx是这个新建的Docker容器所使用的镜像的名字。

  • 通过本地的Docker客户端(Portainer也可以)查看Nginx容器
  • 已经可以使用Nginx容器提供的Nginx服务了:

2 配置Nginx

不支持定制的软件,不是好软件:)

  • 思路:将Nginx容器中的配置文件拷贝到主机,修改后,再删除之前的Nginx容器,并以"绑定挂载卷"的方式重新启动新Nginx容器,就可以让容器读到更新后的配置文件。
  • 这里直接采用docker的bind mount技术来更新配置文件。

2.1 学习docker的bind mount技术

Docker有两个选项让容器在主机上存储文件,即使在容器停止后文件也能持久保存:volume和 bind mount。

  • bind mount的效果:docker run [省略其他option] -v /path/to/nginx/conf:/etc/nginx/conf.d nginx

将主机上的 /path/to/nginx/conf 目录挂载到 Nginx 容器的 /etc/nginx/conf.d 目录后,在主机的 /path/to/nginx/conf 目录中编辑 Nginx 的配置文件,容器内的 /etc/nginx/conf.d 目录会实时看到这些更改。

  • 因此,要先找到想修改的文件所在的目录。

2.2 在Nginx容器中找到想修改的文件所在的目录

那我们就是要在Nginx容器中通过命令行来交互。

  • 执行命令:docker exec -it Nginx /bin/bash

(1)docker exec:这是Docker的一个命令,用来在运行的容器中执行命令。

(2)-it:这是两个参数,i代表交互模式,t为该命令分配一个伪TTY(终端)

(3)命令含义:在名为Nginx的容器中以交互模式启动一个bash shell

  • 通过查找Nginx配置相关的资料,可以知道我们要关注:/etc/nginx目录

2.2.1 认识nginx.conf文件

  • /etc/nginx/nginx.conf文件是Nginx的主配置文件。它用于存储和管理nginx服务器的配置信息。在这个文件中,咱可以配置如何处理进入服务器的请求,如何转发这些请求,还可以配置日志、缓存和其他的服务器参数等。
  • 这个文件的配置语法是基于指令和参数的,每行都是一个指令和它的参数。指令之间由分号分隔,而参数之间则由空格分隔。

(1)在Nginx容器中,这个配置文件通常会被映射到宿主机的某个文件,以便于在容器外部进行编辑和管理。【这正是我们要做的】

(2)需要注意的是,任何对这个文件的修改都需要重启Nginx服务才能生效。

  • 在Nginx配置中,include指令用于包含其他配置文件,可以使主配置文件保持清晰和简洁,同时也方便管理和维护。当Nginx启动或重启时,它会读取include指令指定的所有文件,并把这些文件的配置内容合并到主配置文件中。[include /etc/nginx/conf.d/*.conf]

因此,我们不仅要关注nginx.conf,还要关注conf.d目录

2.2.2 访问Nginx服务,默认返回index.html

  • 这个index.html在哪?/usr/share/nginx/html/index.html

2.3 找到后,在主机创建对应的目录,为后续挂载做准备 [在主机的终端进行操作]

2.3.1 创建目录

  • mkdir -p ~/docker_mount/nginx/conf/conf.d
  • mkdir -p ~/docker_mount/nginx/html

2.3.2 拷贝文件

  • docker container cp Nginx:/etc/nginx/nginx.conf ~/docker_mount/nginx/conf
  • docker container cp Nginx:/etc/nginx/conf.d/default.conf ~/docker_mount/nginx/conf/conf.d/

(1)/etc/nginx/conf.d/目录下只有default.conf

(2)docker container cp 不支持*,即Nginx:/etc/nginx/conf.d/*是不对的

  • docker container cp Nginx:/usr/share/nginx/html/index.html ~/docker_mount/nginx/html

2.3.3 在主机中修改Nginx的index.html

  • 修改

2.4 删除就Ngingx容器,重启新Nginx容器

  • 删除:docker stop Nginx && docker rm Nginx
  • 以"bind mount"方式重启Nginx容器
bash 复制代码
docker run \
--restart always \
--name Nginx \
-d \
-v /Users/forrest.../docker_mount/nginx/html:/usr/share/nginx/html \
-v /Users/forrest.../docker_mount/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /Users/forrest.../docker_mount/nginx/conf/conf.d:/etc/nginx/conf.d \
-p 80:80 \
nginx

2.5 新Nginx容器,新的index.html

  • 之后直接在主机上修改配置,然后执行:docker stop Nginx && docker start Nginx
相关推荐
雪域迷影7 小时前
PostgreSQL Docker Error – 5432: 地址已被占用
数据库·docker·postgresql
莹雨潇潇8 小时前
Docker 快速入门(Ubuntu版)
java·前端·docker·容器
苹果醋311 小时前
快速玩转 Mixtral 8x7B MOE大模型!阿里云机器学习 PAI 推出最佳实践
spring boot·nginx·毕业设计·layui·课程设计
tangdou36909865512 小时前
Docker系列-5种方案超详细讲解docker数据存储持久化(volume,bind mounts,NFS等)
docker·容器
漫无目的行走的月亮15 小时前
在Docker中运行微服务注册中心Eureka
docker
大G哥17 小时前
记一次K8S 环境应用nginx stable-alpine 解析内部域名失败排查思路
运维·nginx·云原生·容器·kubernetes
妍妍的宝贝18 小时前
k8s 中微服务之 MetailLB 搭配 ingress-nginx 实现七层负载
nginx·微服务·kubernetes
大道归简18 小时前
Docker 命令从入门到入门:从 Windows 到容器的完美类比
windows·docker·容器
zeruns80219 小时前
如何搭建自己的域名邮箱服务器?Poste.io邮箱服务器搭建教程,Linux+Docker搭建邮件服务器的教程
linux·运维·服务器·docker·网站
爱跑步的程序员~19 小时前
Docker
docker·容器