本文已参与「新人创作礼」活动,一起开启掘金创作之路
Docker的网络就是就是在宿主机中创建一个虚拟的网桥,Docker创建的容器通过该网桥进行通信,每个Docker容器会分配一个独立的IP地址,也就是Container-IP。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。
四种网络模式
| Docker网络模式 | 配置 | 说明 |
|---|---|---|
| host模式 | –net=host | 容器和宿主机共享网卡,容器会使用宿主机的IP和端口,外部可以直接通过IP+端口对它进行访问 |
| container模式 | -net=container:NAME_or_ID | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 |
| none模式 | –net=none | 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。 |
| bridge模式 | –net=bridge | Docker安装时会创建一个名为docker0的虚拟网桥。除非我们进行另外的配置,新创建的容器都会自动连接到这个虚拟网桥提供的风格,bridge网络用于同一主机上的docker容器相互通信,连接到同一个网桥的docker容器可以相互通信。 |
我们最常用的就是host模式和bridge模式,指定模式的方式是 --network=host,例如
# 使用host模式启动nginx
docker run -d --network=host nginx
host模式比较简单就不多做介绍,下面我就简单介绍下bridge模式
图
下面开始测试,测试使用的是bridge网络
创建网络
docker network create test-network
启动容器时,加入创建的网络
docker run -it --network test-network --network-alias mysql -e MYSQL_ROOT_PASSWORD=123 mysql:5.7
启动被链接的容器
docker run -it --network test-network --network-alias centos centos /bin/bash
已经创建好的容器加入网路 --alias strings可以省略,省略后别名为容器名
docker network connect --alias strings my_network container_a
测试
docker run -di --name=mytomcat9001 -p 9001:8080 tomcat
docker run -di --name=mytomcat9002 -p 9002:8080 tomcat
docker network connect --alias tomcat9001 my-network mytomcat9001
docker network connect --alias tomcat9002 my-network mytomcat9002
docker exec -it mytomcat9001 bash
curl tomcat9002:8080