docker-compose的ports、expose、links、depends_on的使用技巧

1. 介绍

1.1 介绍

今天福哥要把ports、expose、links、depends_on几个docker-compose的功能的作用和使用技巧教给大家。

这几个功能的作用相互之间有交集,网上很多教程写的都不对,非常容易误导人~~

大家可以跟着福哥把这几个功能是干什么的?怎么使用?等等问题彻彻底底的弄清楚!

2. ports和expose的区别

简单说就是ports用来把服务端口映射给宿主机,可以访问宿主机IP地址的人都可以访问ports映射出来的端口。

而expose用来把服务端口开放给其他服务,客户端服务可以通过links功能访问服务端服务的端口。

3. Dockerfile的EXPOSE和docker-compose的expose的区别

其实这俩个是一回事儿!

如果Dockerfile里面通过EXPOSE暴露了端口出来,那么在通过docker-compose创建的服务也会暴露这个端口出来。

如果Dockerfile里面没有暴露端口出来,可以在后面通过docker-compose的expose把服务的端口暴露出来。

4. ports

4.1 映射到端口

使用下面的参数可以将服务的80端口映射宿主机的8080端口(也可以是其他端口)。

1
2
3
4
5
6
services:

nginx:
image: tflinux_nginx1.20
ports:
- 8080:80123456

4.2 映射到地址

使用下面的参数可以将服务的80端口映射到宿主机的10.16.1.1的8080端口(也可以是其他端口)。

1
2
3
4
5
6
services:

nginx:
image: tflinux_nginx1.20
ports:
- 10.16.1.1:8080:80123456

4.3 随机映射

使用下面的参数可以将服务的80端口映射到宿主机的一个随机的端口上。

1
2
3
4
5
6
services:

nginx:
image: tflinux_nginx1.20
ports:
- 80123456

5. expose

expose主要就是把服务的端口映射出来给其他服务使用的。

注意:如果服务的镜像本身已经通过EXPOSE暴露端口了,这里就可以省略通过expose再暴露一遍了。

1
2
3
4
5
6
services:

nginx:
image: tflinux_nginx1.20
expose:
- 80123456

6. links

links的目的是把一个服务的名称在当前服务里面创建一个别名,例如:持久化服务的名称和当前服务的配置文件里面写的不一样,就可以通过这个links改成一样的。

6.1 application.properties

1
2
3
4
sql.mysql.jdbc-url=jdbc:mysql://server_mysql:3306/tfums?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&tinyInt1isBit=false&serverTimezone=UTC&autoReconnect=true&useSSL=false
sql.mysql.username=root
sql.mysql.password=abcdef
sql.mysql.driverClassName=com.mysql.cj.jdbc.Driver1234

6.2 docker-compose.yml

1
2
3
4
5
6
services:

tomcat:
image: tflinux_tomcat9.0
links:
- mysql:server_mysql123456

7. depends_on

通过depends_on告诉docker-compose当前服务启动之前先要把depends_on指定的服务启动起来才行。例如:kafka依赖zookeeper,nginx依赖php-fpm等等。

1
2
3
4
5
6
7
8
9
10
11
services:

kafka:
image: tflinux_kafka
depends_on:
- zookeeper

php-nginx:
image: tflinux_php-nginx
depends_on:
- php-fpm1234567891011

8. 实践

8.1 maintain

福网在TFLinux上面搭建了一个maintain服务,这个服务用来通过终端方式连接MySQL、MongoDB、Redis、Elasticsearch等等持久化服务,可以进行维护性的调试。

8.2 docker-compose.yml

福哥通过links把MySQL、Redis、MongoDB、Elasticsearch四个服务建立了一套别名。

然后福哥又通过depends_on指定maintain服务依赖这四个服务。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
services:

maintain:
build:
dockerfile: Dockerfile
context: ./image/nginx1.20
container_name: maintain
image: nginx1.20
links:
- mysql:server_mysql
- redis:server_redis
- mongo:server_mongo
- elasticsearch:server_es
depends_on:
- mysql
- redis
- mongo
- elasticsearch123456789101112131415161718

8.3 测试

更新docker-compose后,通过maintain容器名称切入到容器里面,测试四个服务的端口。

home/topic/2021/0603/18/8fdc557beb6233c6fa2bf432fffe69e8.png

都可以正常连接,没有问题!

9. 总结

今天福哥带着童鞋们把docker-compose的ports、expose、links、depends_on几个功能的作用给大家讲解了一下,然后又通过实例maintain服务给童鞋们演示了如何利用这几个功能实现服务端口的授权的目的。

10. P.S

福哥在公众号、头条、知乎等等平台上面发布的文章都是从同福网转载的,由于这些平台发布的文章不能修改,而技术文章又无可避免地会又更新,所以大家如果在这些平台上面阅读的文章有问题的话,可以到同福网上面浏览最新版本~~