V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jmyz0455
V2EX  ›  Docker

Docker Nginx 为何会默认映射 80 端口?如何修改端口映射?

  •  
  •   jmyz0455 · 2020-04-06 10:25:56 +08:00 · 6753 次点击
    这是一个创建于 1453 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先用以下命令启动 Docker Nginx:

    sudo docker run \
        --name myNginx -d -p 8888:8888 \
        -v /usr/share/nginx/html:/usr/share/nginx/html \
        -v /usr/share/nginx/conf:/etc/nginx/conf.d \
        -v /usr/share/nginx/log:/var/log/nginx\
        -v /usr/share/nginx/crt:/etc/nginx/certs\
        nginx
    

    然后查看容器信息,输出:

    $sudo docker container ls --no-trunc
    CONTAINER ID  IMAGE  COMMAND  CREATED  STATUS  PORTS  NAMES
    ****ab  nginx  "nginx -g 'daemon off;'"  2 hours ago  Up 9 minutes  80/tcp, 0.0.0.0:8888->8888/tcp   myNginx
    
    $docker inspect myNginx | grep \"Ports -A 8
    "Ports": {
        "8888/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "8888"
            }
        ],
        "80/tcp": null
    },
    

    奇怪,明明我没有映射 80 端口喔,为何还是映射了 80 端口,COMMAND 只是 nginx -g 'daemon off;' 没有其他命令。而且容器对应的 hostconfig.json 里面根本搜不到 80 这个关键字。config.v2.json 反而能搜到,删掉后重启容器,输出还是跟上面一样,所以想请教大家以下几个问题:

    1. Docker Nginx 为何会默认映射 80 端口?
    2. 如何修改 Docker Nginx 的端口映射?
    3. 很多教程第一步是 docker pull nginx 而我没有这做,请问拉取不拉取有什么影响吗?
    4. hostconfig.json 和 config.v2.json 的区别是什么?很多文章说两个都要修改,但是搜不到原因。
    12 条回复    2020-04-10 20:35:52 +08:00
    Takamine
        1
    Takamine  
       2020-04-06 10:29:18 +08:00 via Android
    看看你的 nginx 镜像的 DockerFile, EXPOSE 。
    ZField
        2
    ZField  
       2020-04-06 10:37:14 +08:00   ❤️ 1
    -p 8888:80
    好像是这样吧
    ZField
        3
    ZField  
       2020-04-06 10:39:36 +08:00
    @ZField 好像答不对题了,80/tcp, 0.0.0.0:8888->8888/tcp 前面这个应该是容器内部的 nginx 的 80 端口未被映射出去,但是他有,后面这个是你自己设定的映射
    stille
        4
    stille  
       2020-04-06 10:59:52 +08:00
    你在宿主机执行 netstat -ntlp 看看 80 端口肯定没被 docker 占用
    你 grep 的命令不是在容器内执行的么?出来的结果是容器内的端口.
    nginx 本身默认就 80 端口,你起命令用 -p 8888:80,把 80 映射到宿主机的 8888 不就行了.
    jmyz0455
        5
    jmyz0455  
    OP
       2020-04-06 11:18:51 +08:00
    @Takamine 平时 Docker Hub 会有 DockerFile 这一页,但是 [Nginx]( https://hub.docker.com/_/nginx) 没有,请问怎么看呢?

    @ZField @stille 这个默认 80 端口是为什么我还是不懂,可能我要找找 DockerFile, EXPOSE,但是把 80 映射到 8888 的确是个好方法👍
    stille
        7
    stille  
       2020-04-06 11:35:58 +08:00   ❤️ 1
    @jmyz0455 EXPOSE 只是镜像作者声明这个容器用的什么端口,也就是容器内他用的是 80,你要映射到宿主机就用 -p 参数

    像这种官方 docker 镜像基本都有链接到 github 的,你可以找到 dockerfile,但其他也有很多私人镜像是没有提供 dockerfile 的,这就是后话了..
    ZField
        8
    ZField  
       2020-04-06 11:39:33 +08:00
    @jmyz0455 = =你可以进容器内部,查一下 nginx 的配置,甚至修改,不过这就有点违背 docker 的本来作用了
    acrisliu
        9
    acrisliu  
       2020-04-06 11:48:19 +08:00   ❤️ 1
    Dockerfile 中 EXPOSE 80 了。
    happypy1
        10
    happypy1  
       2020-04-06 14:25:08 +08:00
    这是因为 nginx 默认使用 80,dockerfile 也只是声明了我的 80 端口开放。
    jmyz0455
        11
    jmyz0455  
    OP
       2020-04-06 16:50:15 +08:00
    @hcymk2 链接很有用,非常感谢。
    @happypy1 @acrisliu @ZField @stille DockerFile 里写得很清晰,是我之前不会找,谢谢回答。
    hantsy
        12
    hantsy  
       2020-04-10 20:35:52 +08:00
    原始的 Dockerfile 里面设置的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5372 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 07:48 · PVG 15:48 · LAX 00:48 · JFK 03:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.