文章目录
一、docker网络模式
基于docker run创建容器时,可以使用–net选项指定容器的网络模式,docker有4种网络模式。
网络模式 | 设置命令 | 详细说明 | 应用场景 |
---|---|---|---|
host模式 | - -net=host | host模式,容器不会获得一个独立的network namespace,而是与宿主机共用一个network namespace,容器不会虚拟出自己的网卡、配置自己的ip等,而是使用宿主机的ip和端口。 | 当网络不应与Docker主机隔离,但又希望容器的其他方面隔离时,主机网络是最佳选择。 |
container模式 | - -net=container | container模式,指定新创建的容器和已经存在的一个容器共享一个network namespace,而不是和宿主机共享,新创建的容器不会创建自己的网卡、配置自己的ip,而是和指定的容器共享ip、端口等。两个容器除网络方面相同外,其他的如文件系统、进程列表等还是隔离的。 | |
none模式 | - -net=none | none模式,容器拥有自己的network namespace,但是并未对容器进行任何网络配置,需要手工为容器添加网卡、配置ip等。可以使用pipework工具为容器指定ip等信息。 | 第三方网络插件使您可以将docker与专用网络集成。 |
bridge模式 | - -net=bridge | bridge模式是容器默认的网络模式,该模式会为每个容器分配独立的network namespace,设置ip、路由等信息,默认会将容器连接到一个虚拟网桥交换机docker0上,容器之间组成一个局域网,可以相互访问。 | 当您需要多个容器在同一docker主机上进行通信时,最好使用用户定义的网桥网络。用户定义的网桥网络的容器会自动将所有端口彼此公开,而不会向外界公开任何端口。默认网桥网络上运行相同的应用程序堆栈,则需要使用-p或–publish 标志分别打开Web端口和数据库端口。这意味着docker主机需要通过其他方式阻止对数据库端口的访问。 |
macvlan模式 | Macvlan网络允许您将MAC地址分配给容器,使其在网络上显示为物理设备。Docker守护程序通过其MAC地址将流量路由到容器。 | 从VM设置迁移或需要容器看起来像网络上的物理主机(每个主机都有唯一的MAC地址)时,Macvlan网络是最好的。 | |
overlay模式 | 覆盖网络 | 覆盖网络将多个docker守护程序连接在一起,并使群集服务能够相互通信。还可以使用覆盖网络来促进群集服务和独立容器之间或不同Docker守护程序上的两个独立容器之间的通信。 | 当您需要在不同Docker主机上运行的容器进行通信时,或者当多个应用程序使用集群服务一起工作时,覆盖网络是最好的。 |
docker网络官方文档:https://docs.docker.com/network/
二、容器网桥bridge创建过程
docker容器默认使用docker桥接网络。ip地址会自动分配,每个容器都是连接到网桥上,如果想让容器与宿主机同一网段的其他宿主机之间能访问,需在启动的时候将docker容器的某个端口映射到该宿主机的端口,其他宿主机连接宿主机的Ip和端口即可访问容器。
1、启动容器,首先会在宿主机上创建一对虚拟网卡设备,组成一条数据通道,连接两个网络设备。
2、docker将虚拟网卡设备一端放到新建的容器内,命名为eth0,另一端放在宿主机,以veth***类似的名字命名,并将此设备加入到docker0网桥中。
3、从docker0子网中分配一个ip给容器使用,并设置docker0的ip为容器的默认网关。
4、此时,容器与宿主机可以互相通信,连接同一网桥的容器也可相互通信,同时容器也可以访问外网。但是其他宿主机不能访问docker容器的ip,需要通过NAT将容器ip的port映射为宿主机的ip和port,方可访问。
三、下载docker镜像(以centos为例),创建centos容器,查看运行容器的IP
1、下载tomcat镜像,默认会下载最新版本的centos镜像。
docker pull centos
2、若要使用其它版本的centos镜像(例:centos:centos7.7.1908),可以到官网:https://hub.docker.com,搜索centos,进入centos页面,找到想要下载的版本,复制加版本号的命令进行下载。
docker pull centos:centos7.7.1908
3、下载完毕后,查看下载的镜像。
docker images
4、创建容器mycentos。
docker run -itd --name mycentos centos:centos7.7.1908 /bin/bash
- - name : 是给容器起一个别名,方便使用,没有–name选项时docker默认会给容器一个随机字符串的名称。/bin/bash启动一个一直停留在后台运行的容器
5、在命令行输入docker ps,可以看到正在运行的容器。
docker ps
6、进入容器mycentos的shell终端。
docker exec -it mycentos /bin/bash
7、查看运行中的mycentos容器的IP地址。
cat /etc/hosts
四、docker命令创建用户定义的网桥网络
1、创建用户定义的网桥网络my-net。
docker network create --driver bridge my-net
2、列出docker的网络。
docker network ls
3、查看my-net网桥网络。
docker network inspect my-net
4、配置Linux内核以允许IP转发(否则创建容器时报错“WARNING: IPv4 forwarding is disabled. Networking will not work.”)。
sysctl net.ipv4.conf.all.forwarding=1
5、创建4个容器。- -network my-net指定容器在docker run命令期间连接到此网络。(cent1、cent2连接到my-net,cent3连接到默认bridge,cent4连接到my-net和默认bridge)
docker run -dit --name cent1 --network my-net centos:centos7.7.1908
docker run -dit --name cent2 --network my-net centos:centos7.7.1908
docker run -dit --name cent3 centos:centos7.7.1908
docker run -dit --name cent4 --network my-net centos:centos7.7.1908
docker network connect bridge cent4
6、查看容器运行状态。
docker container ls
或
docker ps
7、检查my-net和bridge桥接网络连接容器。容器cent1和cent2连接my-net,容器cent3连接默认bridge。
docker network inspect my-net
docker network inspect bridge
8、容器不仅可以通过IP地址进行通信,还可以将容器名称解析为IP地址,此功能称为自动服务发现。
网络连接测试结果:cent4同时连接在默认bridge和my-cat上,cent1、cent2都连接在my-cat上所以cent1、cent2、cent4互相连通;cent3连接在默认bridge上所以cent3、cent4互相连通。cent3和cent1、cent2连接在不同网桥,所以互相不通。
cent1与cent2、cent3、cent4连接测试过程(cent1与cent2、cent4连通,与cent3不通)
docker exec -it cent1 /bin/bash
ping -c 2 cent2
ping -c 2 172.18.0.3
ping -c 2 cent4
ping -c 2 172.18.0.4
ping -c 2 cent3
ping -c 2 172.17.0.2
cent2与cent1、cent3、cent4连接测试过程(cent2与cent1、cent4连通,与cent3不通)
docker exec -it cent2 /bin/bash
ping -c 2 cent1
ping -c 2 172.18.0.2
ping -c 2 cent4
ping -c 2 172.18.0.4
ping -c 2 cent3
ping -c 2 172.17.0.2
cent3与cent1、cent2、cent4连接测试过程(cent3与cent1、cent2不通,与cent4连通(需指定IP地址bridge网桥))
docker exec -it cent3 /bin/bash
ping -c 2 cent1
ping -c 2 172.18.0.2
ping -c 2 cent2
ping -c 2 172.18.0.3
ping -c 2 cent4
ping -c 2 172.18.0.4
ping -c 2 172.17.0.3
cent4与cent1、cent2、cent3连接测试过程(cent4与cent1、cent2、cent3(需使用IP地址bridge网桥)连通)
docker exec -it cent4 /bin/bash
ping -c 2 cent1
ping -c 2 172.18.0.2
ping -c 2 cent2
ping -c 2 172.18.0.3
ping -c 2 cent3
ping -c 2 172.17.0.2
9、测试容器是否可以连接到互联网百度。
ping -c 2 www.baidu.com
10、停止并移除所有容器和my-net网络。
docker container stop cent1 cent2 cent3 cent4
docker container rm cent1 cent2 cent3 cent4
docker network rm my-net
五、使用第三方插件创建用户自定义的网桥网络,设置容器固定的IP地址
1、安装网桥设备。
yum install -y bridge-utils
2、编辑/etc/sysconfig/network-scripts/ifcfg-ens33,修改网卡配置如下图。
vi /etc/sysconfig/network-scripts/ifcfg-ens33
增加内容
BRIDGE="br0"
注释内容
IPADDR="192.168.1.150"
PREFIX="24"
GATEWAY="192.168.1.1"
DNS1="8.8.8.8"
3、编辑桥接网卡配置文件/etc/sysconfig/network-scripts/ifcfg-br0,修改网卡配置内容如下。
vi /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.1.150
PREFIX=24
GATEWAY=192.168.1.1
DNS1=8.8.8.8
4、重启network服务。
systemctl restart network
5、查看docker桥接网卡。
brctl show
6、创建容器staticcentos,并指定网络模式为none。
docker run -itd --net=none --name staticcentos centos:centos7.7.1908 /bin/bash
- -net=none,设置网络模式, - - name : 是给容器起一个别名,方便使用。/bin/bash启动一个一直停留在后台运行的容器
7、安装git工具,获取pipework可执行程序。
yum install -y git
git clone https://github.com/jpetazzo/pipework
ls
pwd
cp /root/pipework/pipework /usr/local/bin/
8、使用pipework工具设置容器staticcentos的IP地址。
pipework br0 staticcentos 192.168.1.158/24@192.168.1.1
9、进入容器staticcentos的shell终端,此时使用:"cat /etc/hosts"命令无法看到设置的固定IP地址。
docker exec -it staticcentos /bin/bash
cat /etc/hosts
10、yum安装net-tools工具,使用ifconfig命令即可查看设置的固定IP。
yum install -y net-tools
ifconfig
11、通过pipework指定的静态IP,当容器重启之后,静态IP会丢失,所以每次重新启动容器之后都需重新指定该固定IP。
pipework br0 staticcentos 192.168.1.158/24@192.168.1.1
docker exec staticcentos ifconfig