如何在使用commit提交镜像时指定expose端口?


如果使用Dockerfile创建镜像,设置了expose之后,docker run -P image的时候会自动分配端口。
要是使用commit创建镜像的话,要怎么达到这个效果呢?

场景:原有的的Nginx镜像并未expose 443端口,现在在容器中修改了开启支持SSL,如果使用commit的方式提交镜像为ImageNew的话,那么在新建的容器中就不能使用-P自动分配端口。

所以,这个问题应该如何解决呢?
已邀请:

杨章显 - 思科系统运维工程师

赞同来自:

  1. docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]时不能做到你说的那样,如果不想要端口是随机的,可以在运行container时用-p hostport: containerport设置具体的端口。
  2. 如果镜像没有expose端口,可以在运行时使用--expose选项expose端口。


不知道回答你的问题没,最后个人认为最好用Dockerfile构建自己的容器镜像,因为这样你不但可以控制镜像可以做什么,而且可以控制怎么做。

icebolt - Docker爱好者暗黑

赞同来自:


docker run的时候加上参数-p、-P,其实是做一个端口转发,-p hostport: containerport可以指定端口怎么转发;-P是将所有image指定的端口自动转发一个比较大的端口,但是你image里没有指定,当然不能用-P。

注:容器是否开放端口,和转发无关。如果没有监听对应端口,只会造成转发过来的消息无法处理,而并不会在run的时候报错。

dockerfile自定义镜像是比较好的方式,
第一,dockerfile可以做版本控制,这样有利于多人管理的时候,知道都做了什么修改
第二,dockerfile方便开源交流。
第三,备份体积小。

唯一的缺点就是需要进行build,可以自己做一个专门的虚机、服务器专门做build image;或者利用github+dockerhub自动build你的image,然后用image分发部署。

增加一个例子,说明commit的未暴露端口是可以用-p的指定的
宿主执行
 docker run -i -t centos:centos6 /bin/bash
 进入容器执行
 yum install httpd
 退出到宿主执行
 docker run -d -p 8009:80 centos:apache /bin/bash -c "apachectl -k start && tail -f /var/log/httpd/error_log"

要回复问题请先登录注册