账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    dockerfile 中的EXPOSE的含义(自问自答)
    76
    0

    使用本地dockerfile构建镜像,dockerfile的内容:

    FROM nginx
    COPY ./index.html /usr/share/nginx/html
    EXPOSE 3000

    构建完成后执行:docker run -p 3000:3000 -d nginx:v0
    在浏览器中输入localhost:3000,访问不到服务。
    关于EXPOSE的解释,官方文档给出的是:
    EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。

    好想明白了,你理解的EXPOSE和权威给出的解释不是一个意思。
    nginx运行的时候对外提供的端口默认是80,即便你在这里声明了3000,也不会改变默认的端口80。
    这个EXPOSE毛线用都没有,一般是镜像创建者书写的,一旦写错了,就会误导用户,将人带到坑里。
    因此,在声明EXPOSE的时候,一定要实现查明当前容器默认的服务端口。

    怎么查nginx默认的端口呢?取nginx.config文件中去查。
    首先进入到nginx容器中:docker exec -it 412a3bcbac7f /bin/bash
    然后查询nginx配置文件:whereis nginx.config
    进入配置文件 cd /etc/nginx 所在目录,查看nginx.config文件文件

    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;
    }

    没有找到端口,但是在文件尾部存在include /etc/nginx/conf.d/*.conf;
    直接查看这个文件

        listen       80;
        server_name  localhost;
    
        #charset koi8-r;
        #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;
        #}

    listen 80;listen 80;listen 80;listen 80;listen 80;listen 80;
    自己可以去修改。默认就可以了。

    既然nginx默认提供的端口是80,那么在启动docker的时候,宿主机和容器的端口映射就存在限制。
    宿主机这边端口随意,只要这个端口没有被占有就可以。容器这边必须是80端口。比如我的是3000:80
    在浏览器中输入http://127.0.0.1:3000就可以访问到容器提供的服务。

    3
    打赏
    收藏
    点击回答
    您的回答被采纳后将获得:提问者悬赏的 11 元积分
        全部回答
    • 0
    • 无心无忧i 普通会员 1楼

      在Dockerfile中,EXPOSE是一个可选参数,用于在容器启动时暴露容器的公共端口。它的基本语法是:EXPOSE <port范围>

      例如,如果要在容器启动时暴露80端口,可以使用以下的Dockerfile:

      ```Dockerfile

      使用官方的Node.js镜像作为基础镜像

      FROM node:14

      设置工作目录为当前目录

      WORKDIR /usr/src/app

      将文件复制到容器中

      COPY package*.json ./

      安装Node.js依赖

      RUN npm install

      配置生产环境的npm配置

      RUN npm ci --prod

      设置80端口为容器的公共端口

      EXPOSE 80

      在容器启动时,运行main.js

      CMD ["node", "main.js"] ```

      在这个Dockerfile中,EXPOSE 80表示在容器启动时,80端口将暴露给主机。

      当这个Dockerfile被运行时,当主机通过80端口访问容器时,容器的80端口将被暴露给主机。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部