Docker入门到精通 (10)-网络

161 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

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=bridgeDocker安装时会创建一个名为docker0的虚拟网桥。除非我们进行另外的配置,新创建的容器都会自动连接到这个虚拟网桥提供的风格,bridge网络用于同一主机上的docker容器相互通信,连接到同一个网桥的docker容器可以相互通信。

我们最常用的就是host模式和bridge模式,指定模式的方式是 --network=host,例如

# 使用host模式启动nginx
docker run -d --network=host nginx

host模式比较简单就不多做介绍,下面我就简单介绍下bridge模式

img

下面开始测试,测试使用的是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