Docker容器中Nginx站点根目录网页配置访问

一.宿主机信息

  • 机器系统信息
powershell 复制代码
# 打印操作系统/内核相关信息。
uname -a
# sw_vers = software version,只在 macOS 上有,用来看系统产品版本。
sw_vers
  • 网页目录信息
    /Users/TechFish/my_project/erp_harness01/ecommerce-demo

二.容器系统信息

  • nginx容器
  • 版本、内核信息
powershell 复制代码
# /etc/os-release 看发行版名称和版本;uname -a 看内核。
docker exec nginx-server cat /etc/os-release
docker exec nginx-server uname -a
docker exec nginx-server cat /etc/debian_version

图上3510f75e12b9 是容器 ID,在容器里被当成主机名。aarch64 表示这是 ARM 架构的 Linux,和宿主机Mac 的芯片一致,但系统仍然是 Linux,不是 macOS。

  • 挂载、运行状态、镜像
powershell 复制代码
# 查看挂载
docker inspect nginx-server --format '{{json .Mounts}}' | python3 -m json.tool
# 查看运行状态
docker inspect nginx-server --format '{{.State.Status}}'
# 查看镜像
docker inspect nginx-server --format '{{.Config.Image}}'
  • 容器内部文件系统信息
powershell 复制代码
# 进入容器内部
docker exec -it 3510f75e12b9 bin/bash

nginx 相关目录一般在这些位置:

powershell 复制代码
# 主配置
cat /etc/nginx/nginx.conf

# 站点配置(*最常改这里*)
ls /etc/nginx/conf.d/
cat /etc/nginx/conf.d/default.conf

# 默认静态页
ls /usr/share/nginx/html/

# 访问/错误日志
ls /var/log/nginx/
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log

# 测试配置是否正确
nginx -t

#主配置nginx.conf(/etc/nginx/nginx.conf):

powershell 复制代码
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

#站点配置default.conf(/etc/nginx/conf.d/default.conf)

powershell 复制代码
server {
    listen       80;   # 监听80端口
    listen  [::]:80;
    server_name  localhost;  # 你的域名

    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/html; # 网站文件存放的根目录
        index  index.html index.htm;  # 默认首页文件
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # proxy the PHP scripts to Apache listening on 127.0.0.1:80
    #
    #location ~ \.php$ {
    #    proxy_pass   http://127.0.0.1;
    #}

    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    #
    #location ~ \.php$ {
    #    root           html;
    #    fastcgi_pass   127.0.0.1:9000;
    #    fastcgi_index  index.php;
    #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
    #    include        fastcgi_params;
    #}

    # deny access to .htaccess files, if Apache's document root
    # concurs with nginx's one
    #
    #location ~ /\.ht {
    #    deny  all;
    #}
}

这是默认 nginx 配置,没有做自定义站点。

监听:80(IPv4/IPv6)

server_name:localhost

网站根目录:/usr/share/nginx/html

里面只有一个很小的 index.html

浏览器访问 http://localhost 就会读这个文件

powershell 复制代码
# 看页面内容
cat /usr/share/nginx/html/index.html

# 看宿主机是怎么挂卷的(在宿主机执行,不要进容器)
docker inspect nginx-server --format '{{json .Mounts}}' | python3 -m json.tool

三.Nginx站点根目录网页配置访问

1.配置

容器已经把宿主机目录挂进去了:

宿主机 /opt/nginx-server → 容器 /usr/share/nginx/html(只读)

把 ecommerce-demo/ 的内容放到宿主机的 /opt/nginx-server。放好后访问 http://localhost 就会打开里面的 index.html。

在宿主机执行(不要进容器):

powershell 复制代码
# 先备份现有内容(可选)
sudo mkdir -p /opt/nginx-server
sudo cp -a /Users/TechFish/my_project/erp_harness01/ecommerce-demo /opt/nginx-server/

# 确认容器里能看到
docker exec nginx-server ls /usr/share/nginx/html | head

sudo mkdir -p /opt/nginx-server

作用:确保宿主机上有 /opt/nginx-server。容器把这个目录挂到了 /usr/share/nginx/html,所以这里就是网站根目录的"真实位置"。

sudo cp -a ... /opt/nginx-server/

完整命令:

powershell 复制代码
sudo cp -a /Users/TechFish/my_project/erp_harness01/ecommerce-demo /opt/nginx-server/

复制目录ecommerce-demo到目标目录/opt/nginx-server/

2.访问

注意:

http://localhost/ 不会变成这个站点,仍读 /opt/nginx-server/ 根下的 index.html

四.总结

1.整体在做什么

复制完成后,容器不用重启也能看到新文件(挂载是实时的)。

2.nginx安装位置查看

  • Docker 里的 nginx
    nginx 在容器镜像里,不是宿主机本机安装。
bash 复制代码
# 容器内 nginx 可执行文件路径
docker exec nginx-server which nginx
# 常见结果:/usr/sbin/nginx

# 版本与编译参数(含配置路径等)
docker exec nginx-server nginx -V

# 主配置文件位置
docker exec nginx-server nginx -t
# 会显示类似:configuration file /etc/nginx/nginx.conf
  • 宿主机本机直接安装的 nginx(非 Docker)
powershell 复制代码
which nginx          # 可执行文件
nginx -V             # 安装/编译信息
nginx -t             # 配置文件路径
brew --prefix nginx  # 若用 Homebrew 安装(macOS)

macOS Homebrew 常见路径大致在:/opt/homebrew/opt/nginx 或 /usr/local/opt/nginx

3.容器的信息查看相关命令

  • 容器本身
powershell 复制代码
docker ps                        # 运行中的容器
docker ps -a                     # 含已停止的
docker inspect 容器名             # 完整配置(JSON)
docker inspect 容器名 --format '{{json .Mounts}}' | python3 -m json.tool
docker inspect 容器名 --format '{{.State.Status}}'
docker inspect 容器名 --format '{{.Config.Image}}'
docker port 容器名                # 端口映射
docker stats 容器名               # CPU/内存(实时,Ctrl+C 退出)
docker logs 容器名                # 日志
docker logs -f --tail 100 容器名
  • 进容器里看
powershell 复制代码
docker exec -it 容器名 bash
# 没有 bash 时:
docker exec -it 容器名 sh
  • 进去之后:
powershell 复制代码
pwd
ls -al
cat /etc/nginx/nginx.conf
cat /etc/nginx/conf.d/default.conf
which nginx
nginx -V                           # 版本和编译参数
nginx -t                           # 配置是否正确、配置文件路径
ls /usr/share/nginx/html
tail -f /var/log/nginx/access.log
tail -f /var/log/nginx/error.log
  • 不进交互式 shell,也可以直接执行:
powershell 复制代码
docker exec nginx-server ls /usr/share/nginx/html
docker exec nginx-server cat /etc/nginx/conf.d/default.conf
docker exec nginx-server nginx -t

和 nginx 最相关的几项

4.宿主机、Docker Desktop、 容器三层结构

即在宿主机装Docker Desktop,在Docker Desktop装容器

容器和 Docker 那台 Linux 虚拟机共用内核,但目录、用户、已装软件都是镜像自己的。

Docker Desktop(Docker) 是装在 宿主机 上的软件。Linux 容器不能直接跑在 宿主机 上,所以它先在后台启动一台小型 Linux 虚拟机(内核名里的 linuxkit 就是这台虚拟机),容器都跑在这台虚拟机里。

Docker 负责三件事:

1.跑容器

2.端口转发,宿主机 的端口(eg:80) 转到容器的端口 (eg:80),所以浏览器访问 http://localhost 能进到容器

3.目录挂载 (如:Mac 的 /opt/nginx-server 挂到nginx容器的 /usr/share/nginx/html)

docker ps、docker exec、docker inspect 都是在宿主机上发给 Docker,由它去操作里面的容器。

容器是用镜像启动的一个隔离环境。镜像里自带一套 Linux 用户空间和 程序。

容器它看起来像一台小 Linux 电脑(能 ls、cat),但不是完整的另一台机器:内核是 Docker 那台虚拟机的(linuxkit),自己的只是文件系统、进程和网络命名空间。删掉容器,里面没挂到宿主机上的改动就没了。

  • 三者怎么配合
    浏览器打开 http://localhost 时,请求经过这三层:
    1.浏览器在 宿主机(如:Mac) 上访问本机 80 端口。
    2.Docker 把这个端口转进 容器(如:nginx-server)。
    3.容器里的 nginx 读 /usr/share/nginx/html,而这个目录其实就是宿主机(Mac) 上的 /opt/nginx-server。

5.宿主机、linux虚拟机、Docker、 容器四层结构

即在宿主机装linux虚拟机,在linux虚拟机里装Docker,在Docker装容器

这是四层,从外到内各管各的系统,只有挂载和端口转发把它们串起来。

nginx 容器 是用 nginx 镜像启动的隔离环境。里面是 Debian(或 Alpine)的文件系统和 nginx 程序,内核用的是那台 Linux 虚拟机的内核,不是又一台虚拟机。删掉容器,没挂到外面的文件就没了。

  • 访问是怎么串起来的
    假设虚拟机 IP 是 192.168.64.2,容器把 80 映射到虚拟机的 80:

    若希望用 宿主机 的 http://localhost 访问,还要再在虚拟机软件里做一次端口转发:宿主机 的 80 → 虚拟机的 80。这样就是两次转发:

6.Docker与容器

Docker 是工具/平台,容器是它跑起来的一个个实例。

Docker = 用来管容器的平台;Docker 容器 = 平台上跑着的那个应用环境。

  • Docker 是什么

    Docker 是一套用来构建、分发、运行应用的工具,核心包括:

    常用命令如 docker ps、docker run、docker exec,都是在跟 Docker 说话。

  • 容器是什么

    容器是 Docker 根据镜像启动出来的一个运行中的环境:有自己的文件系统、进程、网络命名空间,但通常和宿主机(或底层 Linux)共享内核。

    镜像:像安装包 / 只读模板(容器的模板)

    容器:像根据模板开出来的一台「轻量小电脑」的运行实例

    同一个镜像可以开多个容器;删容器一般不影响镜像。

  • 两者关系

相关推荐
还是大剑师兰特1 天前
解决nginx错误:http://localhost:7000正常,http://localhost:7000/map 报错404
nginx·大剑师
分布式存储与RustFS1 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
玉&心1 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
guo_wen_qiang1 天前
上传本地镜像到harbor中
docker·容器·持续部署
羑悻的小杀马特1 天前
Dockerfile 全景指南:从入门编写dockerfile到生产环境镜像优化实战,一步步带你从啃透制作指令到镜像制作落地!
docker·dockerfile·镜像制作
BianHuanShiZhe1 天前
docker常见命令
docker
正经教主1 天前
【FDE系列】阶段2:Day 43:Docker Compose — 多容器一键编排
人工智能·docker·fde
PC2005-cloud1 天前
Nginx 防盗链配置实战:用 referer 模块保护网站静态资源
nginx
忆~遂愿1 天前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器