1. Docker本地网络类型
1.1查看支持网络类型
命令:docker network ls
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
fdd674cff650 bridge bridge local
6636d7f4632d host host local
c1bf5392fc14 none null local
[root@localhost ~]#
1.2 测试使用各类网络类型
1.2.1 none : 无网络模式
1.2.2 bridge : 默认模式,相当于NAT
例:
开启两个bridge模式的容器
在容器内安装ping命令:
yum -y install iproute*
开启容器1 并查看容器1的ip地址
[root@localhost ~]# docker run -it --name c_bri1 --network=bridge centos:6.9 /bin/bash
[root@bc2d5e8e36bc /]# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:02
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
开启容器2 并查看容器2的ip地址
[root@localhost ~]# docker run -it --name c_bri2 --network=bridge centos:6.9 /bin/bash
[root@b912e313b328 /]# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:03
inet addr:172.17.0.3 Bcast:172.17.255.255 Mask:255.255.0.0
容器1与容器2之间可以互相通信
[root@bc2d5e8e36bc /]# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.146 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.095 ms
容器1与容器2也可以访问外网
[root@bc2d5e8e36bc /]# ping baidu.com
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148: icmp_seq=1 ttl=127 time=10.1 ms
64 bytes from 220.181.38.148: icmp_seq=2 ttl=127 time=10.2 ms
[root@b912e313b328 /]# ping baidu.com
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148: icmp_seq=1 ttl=127 time=4.91 ms
64 bytes from 220.181.38.148: icmp_seq=2 ttl=127 time=9.75 ms
宿主机与容器1、2也可以互相通信
[root@localhost ~]# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.115 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.099 ms
[root@localhost ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.050 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.085 ms
1.2.3 host : 公用宿主机Network NameSapce
容器和宿主机共用地址和端口
开启容器1 并查看容器1的ip地址
[root@localhost ~]# docker run -it --name c_host1 --network=host centos:6.9 /bin/bash
[root@localhost /]# ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:0B:60:EB:D7
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
ens32 Link encap:Ethernet HWaddr 00:50:56:32:32:53
inet addr:192.168.153.176 Bcast:192.168.153.255 Mask:255.255.255.0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
开启容器2 并查看容器2的ip地址
[root@localhost ~]# docker run -it --name c_host2 --network=host centos:6.9 /bin/bash
[root@localhost /]# ifconfig
docker0 Link encap:Ethernet HWaddr 02:42:0B:60:EB:D7
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
ens32 Link encap:Ethernet HWaddr 00:50:56:32:32:53
inet addr:192.168.153.176 Bcast:192.168.153.255 Mask:255.255.255.0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
1.2.4 container:与其他容器公用Network Namespace
2. Docker跨主机访问-macvlan实现
两个容器无法连接外网
在宿主机1上创建macvlan,指定子网和网关、绑定的网络接口,名称
[root@localhost ~]# docker network create --driver macvlan --subnet=10.0.0.0/24 --gateway=10.0.0.254 -o parent=ens32 macvlan_1
4ca73106410269cf790539e21de58090b86462bb0a9857201a17ce2c0724621b
[root@localhost ~]#
在宿主机2上也创建macvlan,指定子网和网关、绑定的网络接口,名称
[root@localhost ~]# docker network create --driver macvlan --subnet=10.0.0.0/24 --gateway=10.0.0.254 -o parent=ens32 macvlan_1
6304285dbe039e3502db4f14183392f08a1a69018979ca40845113c551699489
[root@localhost ~]#
在宿主机1上创建容器并查看ip
[root@localhost ~]# docker run -it --network macvlan_1 --ip=10.0.0.1 lamp:1.2 /bin/bash
[root@3283bb277f8b /]# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:00:00:01
inet addr:10.0.0.1 Bcast:10.0.0.255 Mask:255.255.255.0
在宿主机2上创建容器并查看ip
[root@localhost ~]# docker run -it --network macvlan_1 --ip=10.0.0.2 192.168.153.176:5000/frank/centos6.9:v1 /bin/bash
[root@40950af7f564 /]# ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:0A:00:00:02
inet addr:10.0.0.2 Bcast:10.0.0.255 Mask:255.255.255.0
容器间的连通性测试
[root@3283bb277f8b /]# ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=1.21 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=3.41 ms
3. Docker 跨主机访问-overlay实现
3.1 consul简介
Consul是什么?
Consul是一个分布式、高可用的系统,是一个为了解决在生产环境中服务注册,服务发现,服务配置的一个工具,它有多个组件,提供如下几个关键功能:
<1> 服务发现:
Consul的某些客户端可以提供一个服务,例如api或者mysql,其它客户端可以使用Consul去发现这个服务的提供者。使用DNS或者HTTP,应用可以很容易的找到他们所依赖的服务。
<2> 健康检查:
Consul客户端可以提供一些健康检查,这些健康检查可以关联到一个指定的服务(服务是否返回200 OK),也可以关联到本地节点(内存使用率是否在90%以下)。这些信息可以被一个操作员用来监控集群的健康状态,被服务发现组件路由时用来远离不健康的主机。
<3> 键值存储:
应用可以使用Consul提供的分层键值存储用于一些目的,包括动态配置、特征标记、协作、leader选举等等。通过一个简单的HTTP API可以很容易的使用这个组件。
<4> 多数据中心:
Consul对多数据中心有非常好的支持,这意味着Consul用户不必担心由于创建更多抽象层而产生的多个区域。
3.2 拉取consul镜像
[root@localhost ~]# docker pull consul:latest
latest: Pulling from library/consul
188c0c94c7c5: Pull complete
17e15e1d587e: Pull complete
de6d13050091: Pull complete
2cd9fbb86a8f: Pull complete
e582f80d6b30: Pull complete
72b4f4adec89: Pull complete
Digest: sha256:6729ed37212457d5f10047deac649ff7e055ced4405398d560593fbfa364d854
Status: Downloaded newer image for consul:latest
docker.io/library/consul:latest
3.3 启动 consul 服务
(1)启动 consul 服务,实现网络的统一配置管理
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
consul:kv类型的存储数据库(key:value)
docker01、02上:
vim /etc/docker/daemon.json
{
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.100:8500",
"cluster-advertise": "10.0.0.100:2376"
}
vim /etc/docker/daemon.json
{
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://10.0.0.100:8500",
"cluster-advertise": "10.0.0.101:2376"
}
vim /etc/docker/daemon.json
vim /usr/lib/systemd/system/docker.service
systemctl daemon-reload
systemctl restart docker
2)创建overlay网络
docker network create -d overlay --subnet 172.116.0.0/24 --gateway 172.11.0.254 overlay
3)两边启动容器测试
docker run -it --network overlay busybox /bin/sh
每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/docker daemon -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://10.0.0.100:8500 --cluster-advertise=10.0.0.100:2376