docker-compose ports和expose的区别
docker-compose
中有两种方式可以暴露容器的端口:ports
和expose
。
1 ports
ports
暴露容器端口到主机的任意端口或指定端口,用法:
ports: - "80:80" # 绑定容器的80端口到主机的80端口 - "9000:80" # 绑定容器的80端口到主机的9000端口 - "443" # 绑定容器的443端口到主机的任意端口,容器启动时随机分配绑定的主机端口号
不管是否指定主机端口,使用ports
都会将端口暴露给主机和其他容器。
2 expose
expose
暴露容器给link
到当前容器的容器,或者暴露给同一个networks
的容器,用法:
expose: - "3000" - "8000"
以上指令将当前容器的端口3000
和8000
暴露给其他容器。
和ports
的区别是,expose
不会将端口暴露给主机,主机无法访问expose
的端口。
上一篇: MySQL Explain 解析
下一篇: Docker LNMP环境搭建
Hi ,但是不用expose,其他link到Mysql的容器也能访问3306啊
那应该是用了ports,这样所有的容器、以及主机,都可以访问MySQL容器的3306了
expose只是用来标记一下,没有任何实际的效果,官方文档上说给link用其实是种误导。
当用link的时候,解决了每次启动容器时IP变化的问题,用link名字就可解析到对应的IP了。但是,这和端口没有任何关系,因为没有link情况下,通过IP+端口也能从一个容器访问另一个容器的服务,有link的情况下,如果不知道端口,即使expose了,别的容器也不会知道link的那些容器上expose了什么端口。
expose是主机访问不到仅各个容器可以访问,而ports是主机和容器都能访问
参见: https://stackoverflow.com/questions/40801772/what-is-the-difference-between-docker-compose-ports-vs-expose
容器间默认暴露所有端口,但可以调整策略,这时候expose就很有用了