本章主要解决两个问题
1, 同一主机下两个或者多个容器间相互访问且外网无法访问
2,不同主机下的两个或者多个容器间相互访问且外网无法访问
参考文章:
https://www.runoob.com/docker/docker-container-connection.html
https://www.cnblogs.com/mrhelloworld/p/docker11.html
https://blog.csdn.net/u013355826/article/details/84987233
先看docker的网络模式 docker network ls
bridge: 为每一个容器分配、设置 IP 等,并将容器连接到一个 docker0 虚拟网桥,默认为该模式。 容器重启后IP会变动
host: 容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP 和端口。
none: 容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,IP 等。
container: 新创建的容器不会创建自己的网卡和配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。
以上是docker网络模式
而docker 间的通讯主要有
1,通过容器ip访问,这个属于bridge模式
2,通过宿主机的ip:端口访问,暴露容器端口
3,通过link建立连接(官方不推荐使用)
4,通过 User-defined networks(推荐)
User-defined networks
创建网络 docker network create test-network
网络名称: test-network
启动容器的时候加入创建的网络
docker run 命令行为: docker run -itd --name alpine_1 --net test-network 7731472c3f2a
创建两个应用 docke1和docker2
docker1的代码:
@GetMapping("/")
public String getHotList(String name) {
System.out.println("收到: "+name);
String result = HttpUtil.doGet("http://docker2:8002/docker2/?name="+name);
return name+" -----> "+result ;
}
docker1的yml配置
server:
# 自定义端口号
port: 8001
servlet:
context-path: /docker1
docker2的代码:
@GetMapping("/")
public String getHotList(String name) {
System.out.println("收到: "+name);
return "docker2"+ name;
}
docker2的yml配置
server:
# 自定义端口号
port: 8002
servlet:
context-path: /docker2
运行docker-compose
指定自定义网络
docker-compose.yml
version: "3.7"
services:
alpine_1:
image: <镜像id>
container_name: docker1
tty: true
ports:
- 8001:8001
networks:
- test-network
alpine_2:
image: <镜像id>
container_name: docker2
tty: true
networks:
- test-network
networks:
test-network:
driver: bridge
使用默认网络:
version: "3.7"
services:
alpine_1:
image: f88d9a6758a7
container_name: docker1
tty: true
ports:
- 8001:8001
#networks:
# - test-network
alpine_2:
image: d624057fd6a4
container_name: docker2
tty: true
#networks:
# - test-network
networks:
default:
driver: bridge
使用已有网络:
提前要创建网络 docker network create test
version: "3.7"
services:
alpine_2:
image: d624057fd6a4
container_name: docker2
tty: true
networks:
default:
external:
name: test