一.宿主机信息
- 机器系统信息
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.访问
- 复制操作后目录结构:

nginx 的 root 是 /usr/share/nginx/html,所以:
http://localhost/ecommerce-demo/ → 会打开里面的 index.html
http://localhost/ecommerce-demo/index.html → 也可以



注意:
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)共享内核。
镜像:像安装包 / 只读模板(容器的模板)
容器:像根据模板开出来的一台「轻量小电脑」的运行实例
同一个镜像可以开多个容器;删容器一般不影响镜像。
-
两者关系

