docker(02) docker 部署了 nginx,並出現了 403 forbidden 解決方案。
1.問題描述。
root@hongpon316:~# docker ps
container id image command created status ports names
3d267f39cdb4 nginx_addpaths "/docker-entrypoint.…" 5 hours ago up 4 hours 0.0.0.0:3345->80/tcp, :3345->80/tcp new_mynginx
862ead87f829 nginx:latest "/docker-entrypoint.…" 19 hours ago up 6 hours 0.0.0.0:3340->80/tcp, :3340->80/tcp mynginx_01
root@hongpon316:樹資料 New Mynginx 的掛載目錄結構。
data── nginx
conf nginx.conf
html log? access.log
error.log
nginx.conf
4 directories, 4 files
root@hongpon316:curl localhost:3345,出現 403 禁止錯誤。
nginx/1.21.5
root@hongpon316:~#
2. 檢視錯誤日誌並分析問題。
分析問題的原因。
Open Data Nginx 日誌錯誤日誌檢視。
大概可能是因為資料夾下沒有檔案。 這是對我如何安裝的評論。
1.不要掛載 nginx。 直到你掛載它conf(因為它會報告錯誤),2從不同的 nginx 容器複製 nginxconf out。
3.你可以修改nginxconf,自定義配置項。
root@hongpon316:docker ps 檢視當前正在執行的容器。
container id image command created status ports names
862ead87f829 nginx:latest "/docker-entrypoint.…" 36 minutes ago up 36 minutes 0.0.0.0:3340->80 TCP,:3340->80 TCP Mynginx 01 有乙個正在執行的 nginx 容器。
root@hongpon316:/# docker exec -it mynginx_01 /bin/bash
root@862ead87f829:/# ls
bin dev docker-entrypoint.sh home lib64 mnt proc run srv tmp var
boot docker-entrypoint.d etc lib media opt root sbin sys usr
root@862ead87f829:/# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
root@862ead87f829:/etc/nginx# ls
conf.d fastcgi_params mime.types modules nginx.conf scgi_params uwsgi_params
root@862ead87f829:/etc/nginx# cat nginx.conf 檢視 nginxconf 配置檔案。
root@862ead87f829:/# read escape sequence ctrl+p+q
root@hongpon316:/# docker cp mynginx_01:/etc/nginx/nginx.conf 資料從 mynginx 01 容器複製 nginx.conf out。
successfully copied 2.56kb to /data/
root@hongpon316:/#
4.建立乙個正式就緒的 nginx 容器。
root@hongpon316:/# docker run -d --name new_mynginx -p 3345:80 -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v data nginx log: var log nginx -v data nginx html: usr share nginx html nginx addpaths 重新輸入掛載命令(因為之前掛載不成功,但是容器已經建立好了,所以需要使用 docker ps -a 刪除名為 nginx addpaths 的容器,然後輸入命令)。
3d267f39cdb4bd55ca18adc0998c35bb55628baeb35b8e6279f6d6857be30f09
root@hongpon316:/# docker ps
container id image command created status ports names
3d267f39cdb4 nginx_addpaths "/docker-entrypoint.…" 56 seconds ago up 56 seconds 0.0.0.0:3345->80/tcp, :3345->80/tcp new_mynginx
862ead87f829 nginx:latest "/docker-entrypoint.…" 13 hours ago up 18 minutes 0.0.0.0:3340->80/tcp, :3340->80/tcp mynginx_01
root@hongpon316:/# docker inspect -f "}"new mynginx 檢視容器 new mynginx 的掛載點。
root@hongpon316:/#
1.我正在使用 docker cp mynginx 01:等 nginx nginxconf 資料避免掛載"/data/nginx/conf/nginx.conf" to rootfs at "/etc/nginx/nginx.conf"。因為容器不會通過掛載複製到我主機的對應資料夾。
2.同理,當使用 docker 掛載容器內的 usr share nginx html 資料夾時,主機(即我的伺服器)的 usr 本地 nginx html 資料夾沒有任何檔案。
因為當 docker 掛載資料夾時,它不會將容器資料夾的內容複製到我主機的相應資料夾中。
3.而當你進入容器時,在usr share nginx html資料夾下找不到索引html檔案,可能是因為這個資料夾已經掛載到了主機的usr本地nginx html上,訪問這個資料夾就相當於訪問主機的usr本地nginx html,所以索引html 檔案,即預設conf 配置檔案html index.訪問 htm 行中指定的檔案時,找不到該檔案,並發生 403 禁止訪問錯誤。
總結。 使用 docker -v 掛載檔案時,最好將所有檔案放在主機上的容器中。 容器服務啟動時生成的檔案可以單獨保留,並在主機上自動生成。
第三,解決方案。
3.1 檢視我的掛載命令。
docker run
d-name new_mynginx
p 3345:80
v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
v /data/nginx/log:/var/log/nginx
v /data/nginx/html:/usr/share/nginx/html
nginx_addpaths
3.2 參考說明。
第乙個 -v:掛載 nginx 的主配置檔案,方便在主機上直接修改容器的配置檔案。
第二個 -v:將 nginx 日誌掛載到容器中,容器執行完畢後,可以直接檢視主機這個目錄下的 nginx 日誌。
第三個 -v:掛載乙個靜態頁面目錄。
3.3. 解決辦法:將容器內的檔案複製到主機。
建立 nginx 容器。
docker run -d --name nginx -p 8880:80 nginx
建立乙個掛起目錄。
mkdir -p /data/nginx/
複製 nginx 容器中的檔案。
1)nginx.將 conf 複製到主機,在 nginx 容器中新增 etc nginx nginx nginx.conf 檔案被複製到主機上的資料 nginx conf 目錄下。
docker cp nginx:/etc/nginx/nginx.conf /data/nginx/conf/
2) 替換 conf將 d 資料夾複製到主機,並在 nginx 容器中新增 etc nginx conf.d 目錄複製到主機上的資料 nginx conf 目錄。
docker cp nginx:/etc/nginx/conf.d /data/nginx/conf/
3)將html目錄複製到主機上,將nginx容器中的usr share nginx html目錄複製到主機上的data nginx目錄下。
docker cp nginx:/usr/share/nginx/html /data/nginx/
v /data/nginx/conf/conf.d:/etc/nginx/conf.d \
v /data/nginx/log:/var/log/nginx \
v /data/nginx/html:/usr/share/nginx/html \
privileged=true nginx