nginx 在 dcoker 中的使用

这篇文章是对 nginx 的一个实战应用,同时进行内容补充,结合了 docker 让使用 nginx 部署服务更方便

前提

操作环境 M2

使用的是 Homebrew 安装 Ngnix

因为是上一篇的实战介绍,因此省略理论步骤,直接说具体操作步骤

需求就是将本地前端的项目映射到本地 docker 中的 nginx 中,这样当前本地前端文件修改会实时反馈到 nginx 的服务器中,不用手动拷贝文件

确认docker 环境

判断是否已经启动了 docker

1
docker info

如果 Docker 已经启动并正常运行,你会看到 Docker 的详细信息输出。如果 Docker 未启动或有问题,你将会看到相应的错误消息

启动 docker

1
open -a Docker

这将启动 Docker Desktop。如果你已经安装并配置好了 Docker Desktop,它会开始启动 Docker 引擎

镜像

查看当前本地安装的镜像

1
docker images

我之前安装过,如果没有安装,使用命令

1
docker pull nginx

nginx 端口确认

因为之前本地有一个 nginx,非 docker 的,也启动过,所以先关了之前的,防止默认的 80 端口冲突

如果启动了,则关掉,这里我是 homebrew 安装的

1
brew services stop nginx

其他方式的,如果是Linux 等

1
sudo nginx -s stop

使用 Nginx 镜像创建 Docker 容器

1
docker run --name my-nginx-container -p 80:80 -d nginx

启动之后,可以浏览器访问 http://localhost/ 查看是否启动成功

进入容器一探究竟

了解一下容器里面的配置,其实容器底层就是一个轻量级的 Linux 操作系统,然后包含一个 nginx 服务器

进去的命令:

1
docker exec -it my-nginx-container /bin/bash

[!CAUTION]

里面默认是没有安装 vim 的,所以我想编辑容器中的配置文件没成功,可以手动安装,也可以使用 docker cp 复制文件到本地编辑,再复制到容器,这里文章先跳过

使用docker compose 一键启动

前提介绍

使用 时,你是在引用当前用户的主目录。~ 是当前用户主目录的快捷方式。在 macOS 中,用户主目录通常位于 /Users/huangben,其中 huangben 是你的用户名。

例如:

~/Documents 实际上指向 /Users/username/Documents

使用 / 时,你是在引用文件系统的根目录。

历史原因

docker composedocker-compose 是两个不同的命令。

  1. docker compose
    • 这是 Docker CLI 的一个子命令,集成在 Docker CLI 中。
    • 从 Docker 版本 20.10 开始,Docker CLI 中包含了 docker compose 命令。
    • 你可以通过 docker compose version 查看版本信息。
  2. docker-compose
    • 这是一个独立的工具,通常作为一个单独的二进制文件安装。
    • 你可以通过 docker-compose --version 查看版本信息。

这两个命令的功能基本相同,但 docker compose 是 Docker CLI 的一部分,而 docker-compose 是一个独立的工具。

如果你希望使用独立的 docker-compose 工具,可以通过 Homebrew 或其他方式安装它。

推荐 docker compose

准备环境

因为之前my-nginx-container ,所以先删除掉,避免后面容器名称冲突

1
docker rm my-nginx-container

实际操作

  1. 在当前下面创建一个目录 nginx-project ,用来存放接下来的网站内容和配置
1
2
3
4
5
└── nginx-project/
│ └── docker-compose.yml # 核心文件 来管理 Nginx 容器并挂载 website 和 nginx 目录
│ └── website/ # 用来映射到容器中的网站内容,可以要可以不要
│ └── nginx/
│ ├── default.conf # 用来映射到容器中的配置文件
1
2
3
4
5
6
7
8
9
10
11
# docker-compose.yml  yml 是 yaml 简写方式
version: '3.8'
services:
web:
image: nginx:latest
container_name: my-nginx-container
ports:
- "80:80"
volumes:
- /Users/huangben/Documents/bighb-code/Vue/hello_vue3/dist:/usr/share/nginx/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf

左侧是宿主(自己的 MAC) 容器

[!NOTE]

挂载(volumes)将宿主机的目录挂载到容器中时,实际上是创建了一个映射关系,而不是物理复制

/Users/huangben/Documents/bighb-code/Vue/hello_vue3/dist 这里是我本地随便一个文件的前端项目

  1. 需要在打开 Docker Desktop 设置

    配置共享路径

    1. 在左侧菜单中,选择 Resources(资源)。
    2. 然后选择 File Sharing(文件共享)。
    3. 在右侧的输入框中添加你的路径 /Users/huangben/Documents/bighb-code/Vue/hello_vue3/dist,点击右侧 +
    4. 点击 Apply & Restart(应用并重启)按钮,以保存更改并重启 Docker。
  2. 启动运行docker-compose

    1
    docker compose up -d

运行80 端口,显示成功 !

重启docker compose

修改了配置文件需要重启(静态文件不用重启)

1
docker compose exec web nginx -s reload

停止docker compose

停止所有由 docker compose 启动的服务。

1
docker compose stop

停止特定服务

1
docker compose stop web

这里的 web 是在 docker-compose.yml 文件中定义的服务名称。根据你的配置文件中的服务名称替换 web

完全移除容器

1
docker compose down

这将停止并删除所有服务的容器、网络和其他相关资源

检测是否停止

1
ps aux | grep nginx