在项目通过docker上线的时候遇到了点坑,简单记录下吧,也避免后来的人采坑;docker中的网络有几种
1.bridge
桥接的方式,这种是默认的网络连接方式,也是最常用的网络连接方式,桥接网络可以让你的应用运行在一个隔离的网络中,网络中的容器可以互相访问,一般我们将应用的端口映射出去,以便主机外的网络通过这个端口进行访问,比如容器中应用的端口是8080,映射到主机的端口是9090,那么主机以外的网络通过ip:9090可以访问容器中的应用;而容器之间是通过容器的端口进行访问,比如你又起了一个docker容器叫mysql,端口是3306,那么你应用里面的数据库的连接地址是mysql:3306;注意这种情况下,是直接可以通过容器的名称进行访问的,不需要地址配置成localhost:3306;docker-compose中可以这么配置;
environment:
# - _JAVA_OPTIONS=-Xmx512m -Xms256m
- SPRING_PROFILES_ACTIVE=prod,swagger
- SPRING_DATASOURCE_URL=jdbc:mysql://aiops-mysql:3306/aiops?useUnicode=true&characterEncoding=utf8&useSSL=false
- JHIPSTER_SLEEP=10 # gives time for the database to boot before the application
ports:
- 9999:8080
2.host
共享主机的网络,这种情况下,容器直接使用主机的网络,端口映射无效了;这种情况下,容器失去了隔离性;应用的端口就是主机网络的端口,比如容器中应用的端口是8080,那么直接访问本地的8080就可以访问容器中的应用了;而且这种情况下无法通过容器的名称来访问了,只能通过ip地址
environment:
# - _JAVA_OPTIONS=-Xmx512m -Xms256m
- SPRING_PROFILES_ACTIVE=prod,swagger
- SPRING_DATASOURCE_URL=jdbc:mysql://localhost:3306/aiops?useUnicode=true&characterEncoding=utf8&useSSL=false
- SPRING_DATASOURCE_USERNAME=root
3.macvlan
这种方式允许指定一个mac地址,把它映射为一个网络中的物理地址;
可以通过docker network ls查看docker中所有的网络;默认我们的应用会使用“appName_default”这个网络;
在实际项目中遇到的问题是,服务器上把docker的桥接方式删除外网访问的权限,导致无法访问外网,所以考虑使用host的模式,在docker-compose中可以直接使用这种方式;
然后是mysql容器,两种情况,一种情况是如果mysql的3306在主机上已经被占用,比如服务器上已经安装了一个mysql,这种情况mysql继续使用bridge模式的,然后app中连接的时候使用localhost,如果没有被占用,也可以直接使用host模式,灵活选择;
总结:默认的情况下,docker应用中的网络情况我们是不用做特殊处理的,如果有特殊情况,可以试试host模式;不同的容器可以在不同的网络中,连接方式也有所区别;