在安装好Docker后,其默认提供了三种网络模式:bridge、host和none。其中bridge是Docker默认的网络模式,在该模式下,容器拥有自己的IP namespace,容器可以通过宿主机上的docker0网桥与别的容器、宿主机或者外部网络进行通信。此外我们还可以通过端口映射的方式让外部环境也能访问到容器内部。
Docker默认的网络模式如下图所示:
bridge网络模式
Docker三种网络模式:
下面我们通过busybox来进行演示。
BusyBox 是一个集成了一百多个最常用 Linux 命令和工具(如 cat、echo、grep、mount、telnet 、ping、ifconfig 等)的精简工具箱,它只需要几 MB 的大小,很方便进行各种快速验证,被誉为“Linux 系统的瑞士军刀”。
下载busybox镜像:
通过该镜像创建两个容器test1和test2:
使用docker network inspect bridge
命令查看bridge网络详情:
可以看到test1和test2都连接到了bridge(因为是Docker默认的网络模式),并且test1内部IP为172.17.0.2,test2内部IP为172.17.0.3。
我们看下在test1容器内部是否可以ping通test2的IP:
可以看到是没问题的。
看下test1内部ping宿主机IP(192.168.33.10)和外部网络是否可行:
link
我们可以在创建容器的使用使用--link
来让容器间的网络建立映射关系。
我们删除test2容器,重新创建test2容器,并且让其和test1建立网络映射关系:
这样我们就可以在test2容器内部使用ping test1
ping通test1网络了:
创建自定义网桥
我们可以通过docker network create
来创建自定义的网桥,比如我们创建一个新的网桥,名称为my-bridge:
模式选择的是bridge。
我们让test1和test2容器都连接到这个新的网桥上(也可以在创建容器的时候使用--network
来指定需要连接的网桥):
查看my-bridge详情:
可以看到test1和test2都连接上来了。
使用自定义网桥有个明显的好处是,容器间可以通过容器名称进行网络通信(无需在创建容器的时候使用--link
来指定)。我们在创建test1容器的时候并没有使用--link test2
来连接test2,我们看看在连接到my-bridge后,test1内部是否可以通过ping test2
ping通test2 IP:
可以看到是没问题的。
端口映射
在宿主机上我们是无法访问Docker容器内部网络的,不过我们可以通过端口映射的方式来实现这个需求。
以MySQL为例子,我们拉取MySQL镜像:
1 | docker pull mysql:5.7.25 |
在创建MySQL容器的时候可以使用-p
或-P
让容器暴露的端口和宿主机的端口进行映射:
-e
指定环境变量。
-p 3306:3306
(冒号前面的端口为宿主机端口,后面的端口为容器端口)的意思是,让容器暴露的3306端口映射到宿主机的3306端口,这样我们就可以在宿主机外部通过192.168.33.10:3306来连接MySQL容器了:
Docker的host和none网络模式使用较少这里就不介绍了。
参考🔗:https://docs.docker.com/v17.09/engine/userguide/networking/#set-the-environment-variables-manually