当前位置: 首页 > news >正文

10. docker nginx官方镜像使用方法

        本文介绍docker nginx官方镜像使用方法,因为第一次用,在加上对docker也不是很熟,中间踩了一些坑,为了避免下一次用又踩坑,因此记录如下,也希望能够帮到其它小伙伴。

        官方镜像页面:https://hub.docker.com/_/nginx

        镜像拉取 docker pull nginx

        拉取镜像后可以启动镜像 docker run --name nginx -p 80:80 -d 1ee494ebb83f

        但是光启动镜像,用处不大,因为首先你需要有个有意义的配置文件才比较有用。

        不过也不是一点儿用处没有,至少你可以用它验证你的nginx配置文件有没有错,比如这样:docker exec nginx(容器名称) nginx -t -c /tmp/nginx.conf

        下面就来讲讲配置文件,是我踩坑比较多的地方,我配置文件大概是这样的,中间隐去了我项目中的一些具体内容,不过没关系,不妨碍演示:

user admin;
worker_processes auto;
error_log /home/admin/nginx/logs/nginx_error.log warn;
pid /home/admin/nginx/logs/nginx.pid;
worker_rlimit_nofile 65535;

events {
    use epoll;
    worker_connections 65535;
}

http {
    include mime.types;
    default_type application/octet-stream;
    server_tokens off;

    log_format main '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $bytes_sent '
                    '"$http_j_forwarded_for" "$http_x_forwarded_for" '
                    '"$http_referer" "$http_user_agent" '
                    '"$gzip_ratio"';

    # charset utf-8;
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 300m;
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 0;
    tcp_nodelay on;
    client_body_buffer_size 512k;
    fastcgi_intercept_errors on;

    proxy_connect_timeout 90;
    proxy_read_timeout 180;
    proxy_send_timeout 180;
    proxy_buffer_size 256k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;
    proxy_temp_file_write_size 256k;
    proxy_intercept_errors on;
    server_name_in_redirect off;
    proxy_hide_header X-Powered-By;

    gzip on;
    gzip_min_length 100;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 9;
    gzip_types text/plain application/x-javascript application/javascript text/javascript text/css application/xml application/json;
    gzip_vary on;
    gzip_proxied any;

    error_page 400 401 402 403 404 405 408 410 412 413 414 415 500 501 502 503 506 = http://www.xx.com/error.html;

    server {
        listen 80;
        server_name localhost;

        location /web {
            alias /home/admin/api;
        }

        access_log /home/admin/nginx/logs/api_access.log;
        error_log /home/admin/nginx/logs/api_error.log;
    }
}

        我是这么启动镜像的
docker run --name nginx -p 80:80 -v /home/admin/nginx/api.conf:/etc/nginx/conf.d/default.conf -d 1ee494ebb83f
        我启动的时候,把我的nginx配置文件放到了/home/admin/nginx/api.conf 下,并把它映射到了容器的/etc/nginx/conf.d/default.conf文件上,但是这样启动的时候,容器启动不起来,启动报错信息可以用命令 docker logs nginx(容器名称)看到。

        报错原始信息我没有记录下来,意思是说配置文件开头的user admin;这一行不合法,出现在了不该出现的位置。但是我明明用nginx -t -c 验证过的。我把user admin 这行注释掉了,然后docker start nginx 发现还是起不来,查看日志说 worker_processes auto; 这一行不合法,出现在了不应该出现的位置。

        我想了下,觉得肯定是我没明白docker nginx容器的启动方式,然后我大模型了一下,果然,nginx启动的时候,默认会加载/etc/nginx/nginx.conf下的配置文件,这个文件内容大概是这样的

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
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;
    keepalive_timeout  65;

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

        这个文件会include /etc/nginx/conf.d/*.conf;怪不得说我配置文件格式不对呢。

        然后我把配置文件修改成了两部分,一部分作为nginx.conf,一部分作为default.conf, nginx.conf如下:

user admin;
worker_processes auto;
error_log /home/admin/nginx/logs/nginx_error.log warn;
pid /home/admin/nginx/logs/nginx.pid;
worker_rlimit_nofile 65535;

events {
    use epoll;
    worker_connections 65535;
}

http {
    include mime.types;
    default_type application/octet-stream;
    server_tokens off;

    log_format main '$remote_addr - $remote_user [$time_local] '
                    '"$request" $status $bytes_sent '
                    '"$http_j_forwarded_for" "$http_x_forwarded_for" '
                    '"$http_referer" "$http_user_agent" '
                    '"$gzip_ratio"';

    # charset utf-8;
    server_names_hash_bucket_size 128;
    client_header_buffer_size 32k;
    large_client_header_buffers 4 32k;
    client_max_body_size 300m;
    sendfile on;
    tcp_nopush on;
    keepalive_timeout 0;
    tcp_nodelay on;
    client_body_buffer_size 512k;
    fastcgi_intercept_errors on;

    proxy_connect_timeout 90;
    proxy_read_timeout 180;
    proxy_send_timeout 180;
    proxy_buffer_size 256k;
    proxy_buffers 4 256k;
    proxy_busy_buffers_size 256k;
    proxy_temp_file_write_size 256k;
    proxy_intercept_errors on;
    server_name_in_redirect off;
    proxy_hide_header X-Powered-By;

    gzip on;
    gzip_min_length 100;
    gzip_buffers 4 16k;
    gzip_http_version 1.0;
    gzip_comp_level 9;
    gzip_types text/plain application/x-javascript application/javascript text/javascript text/css application/xml application/json;
    gzip_vary on;
    gzip_proxied any;

    error_page 400 401 402 403 404 405 408 410 412 413 414 415 500 501 502 503 506 = http://www.xx.com/error.html;
}

        另一部分作为default.conf(文件名api.conf)的配置如下:

server {
        listen 80;
        server_name localhost;

        location /web {
            alias /home/admin/api;
        }

        access_log /home/admin/nginx/logs/api_access.log;
        error_log /home/admin/nginx/logs/api_error.log;
    }

        然后我用这个命令启动:docker run --name nginx -p 80:80 -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf -v $(pwd)/api.conf:/etc/nginx/conf.d/default.conf -d 1ee494ebb83f

        这次终于不报错格式不对了,但是报错/home/admin/nginx/logs/目录不存在,报错原因是nginx容器中没有这个目录,解决方法是把本地目录挂载到docker中,启动命令我修改成了这样 :docker run --name nginx -p 80:80 -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf -v $(pwd)/api.conf:/etc/nginx/conf.d/default.conf -v /home:/home -d 1ee494ebb83f

        我启动了一把,还是报错,报错的意思是说/etc/mime.types文件不存在,指向这一行代码 include mime.types;我查看了一下,我宿主机中有这个文件,于是我又修改了一把启动命令:docker run --name nginx -p 80:80 -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf -v $(pwd)/api.conf:/etc/nginx/conf.d/default.conf -v /home:/home -v /etc/mime.types:/etc/mime.types -d 1ee494ebb83f

        这次终于起来了!

相关文章:

  • Mybatis的一级、二级缓存
  • win32汇编环境,加速键的应用示例
  • C++模板与STL七日斩:从工业编程到高效数据管理(工业项目)
  • 纷析云:赋能企业财务数字化转型的开源解决方案
  • React 源码揭秘 | 更新队列
  • 28.C++多态1 (多态的概念与简单使用,虚函数,final,override)
  • linux--多进程开发(5)--进程
  • C/C++ | 每日一练 (4)
  • Linux:基础IO
  • 使用 pytest-mock 进行 Python 高级单元测试与模拟
  • 为什么MySQL选择使用B+树作为索引结构
  • 51串口通信实例(蓝牙模块和WiFi模块的介绍和使用)
  • 什么是零拷贝?
  • 模型蒸馏与量化技术:让AI模型“瘦身”却不“降智”的底层逻辑
  • Windows Server 搭建 RADIUS 认证服务器
  • 解决安卓recyclerView滚到底部不彻底问题
  • LeetCode每日精进:622.设计循环队列
  • Linux 病毒扫描工具 ClamAV 使用
  • 4*A100 部署 deepseek-r1-671B
  • Vue 报错error:0308010C:digital envelope routines::unsupported 解决方案
  • 《上海市提振消费专项行动方案》印发
  • 6月底将返回中国,旅日大熊猫获颁“感谢状”
  • 美国公布新型核弹B61-13,威力是广岛原子弹的21倍
  • 存款利率、LPR同日下调,机构称对银行的影响偏正面
  • 上影节开幕影片《酱园弄·悬案》,陈可辛执导,章子怡主演
  • 特朗普亲家有了新工作:美国驻法大使