docker-compose ports和expose的区别

docker-compose中有两种方式可以暴露容器的端口:portsexpose

1 ports

ports暴露容器端口到主机的任意端口或指定端口,用法:

ports:
  - "80:80"         # 绑定容器的80端口到主机的80端口
  - "9000:8080"     # 绑定容器的8080端口到主机的9000端口
  - "443"           # 绑定容器的443端口到主机的任意端口,容器启动时随机分配绑定的主机端口号

不管是否指定主机端口,使用ports都会将端口暴露给主机。

2 expose

expose暴露容器给link到当前容器的容器,用法:

expose:
  - "3000"
  - "8000"

以上指令将当前容器的端口30008000暴露给link到本容器的容器。

ports的区别是,expose不会将端口暴露给主机。

3条评论

无敌翔哥 says: 回复

Hi ,但是不用expose,其他link到Mysql的容器也能访问3306啊

歪麦 says:

那应该是用了ports,这样所有的容器、以及主机,都可以访问MySQL容器的3306了

Guangyu says: 回复

expose只是用来标记一下,没有任何实际的效果,官方文档上说给link用其实是种误导。
当用link的时候,解决了每次启动容器时IP变化的问题,用link名字就可解析到对应的IP了。但是,这和端口没有任何关系,因为没有link情况下,通过IP+端口也能从一个容器访问另一个容器的服务,有link的情况下,如果不知道端口,即使expose了,别的容器也不会知道link的那些容器上expose了什么端口。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

昵称 *