dockerfile 中的EXPOSE的含义(自问自答)
使用本地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就可以访问到容器提供的服务。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论