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