Docker上一篇:Dockerfile暴力入门
Docker下一篇:
Docker网络
在一台安装Docker的Linux机器上执行ifconfig
命令,可以发现出现一个名为docker0
的虚拟网桥:
Docker网络常用命令
查看Docker网络命令的帮助docker network --help
:
查看Docker网络模式列表docker network ls
:
查看网络源数据docker network inspect [network_name]
删除网络docker network rm [network_name]
查看容器的网络docker inspect [container_name]
Docker网络的作用
- 用于实现容器间的互联和通信以及端口映射
- 容器IP变动时,可以通过服务名连接(类似于SpringCloud的服务名)
网络模式
网络模式 | 简介 | 命令 |
---|---|---|
bridge | 为每一个容器分配、设置IP等,并将容器连接到docker0 虚拟网桥。默认为该模式。 | --network bridge |
host | 容器将不再虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口 | --network host |
none | 容器有独立的Network namespace,但并没有对齐进行任何网络设置,如分配veth pair和网桥连接、IP等。 | --network none |
container | 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等。 | --network container:NAME |
bridge模式
Docker服务默认会创建一个docker0
网桥,该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0
接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
在启动一个容器时,如果没有指定network的话默认使用的网桥模式就是bridge
,使用的就是docker0
。
网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫veth pair)
每个容器实例内部也有一块网卡,每个接口叫eth0;
docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。
Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。
容器之间互相访问时,以docker0
为网关;当宿主机与容器之间访问时,以docker0
为网关。
在宿主机运行一个centos_ssh:7
的容器(构建可以ssh登录的centos7),在容器内执行ip addr
(如果提示找不到命令,请安装initscripts
):
可以看到有一个24: eth0@if25
,在宿主机执行ip addr
,则将会看到有一个25: vethadb701b@if24
:
这就是上述的eth0
和veth
。
host模式
host模式是指直接使用宿主机的IP地址与外界进行通信,不再需要额外进行NAT转换。在这种模式下,容器将不会虚拟出自己的网卡,而是使用宿主机的IP和端口。
命令:docker run -d --network host --name [container_name] [image]
(不需要指定端口)
none模式
禁用网络功能,可以理解为不与外界有网络连接,且没有网卡。网络只有lo
标识,即127.0.0.1
。
命令:docker run -d -p [master_port]:[container_port] --network none --name [container_name] [image]
container模式
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。
新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。
命令:docker run -d -p [master_port]:[new_container_port] --network container:[net_container_name] --name [new_container_name] [image]
。
如果net_container
挂掉了,则new_container
的网络模式会变成none
模式。
自定义模式
在实际开发环境中,容器的IP是可能会变化的,为了保证服务的可用性,需要用容器名代替容器IP去查找服务。
步骤:
- 新建自定义网路
- 新建容器时指定容器名
- 新建容器时指定网络
docker network create test
docker run --network test --name centos1 -d centos_ssh:7
docker run --network test --name centos2 -d centos_ssh:7
之后,在容器内部就可以通过容器名互相访问了。
Docker上一篇:Dockerfile暴力入门
Docker下一篇: