基于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
相关推荐
神奇侠20242 小时前
快速入手K8s+Docker+KubeSphere+DevOps
docker·kubernetes·devops
帽儿山的枪手3 小时前
通过网络命名空间实现网络分流的思想及方法
网络协议·docker·dns
ronshi4 小时前
docker 多主机容器组网
docker·多主机容器组网
小码过河.6 小时前
CentOS 安装 Docker
linux·docker·centos
laimaxgg8 小时前
Dockerfile
linux·运维·服务器·ubuntu·docker
与passion共存9 小时前
Linux系统下Docker安装
linux·docker
西伯利亚猹9 小时前
Windows系统docker desktop安装(学习记录)
运维·docker·容器
LCY13310 小时前
centOS 安装和配置docker
linux·docker·centos
泉城老铁10 小时前
nginx配置负载均衡一文解决
nginx
遇见火星11 小时前
基于Docker容器的CICD项目Jenkins/gitlab/harbor/Maven实战
docker·容器·gitlab·jenkins·maven·harbor·cicd