docker 分配宿主机网段 IP 及固定容器 IP

  • docker
  • 2020-01-07 22:50:48
  • 浏览 232
简介如果你没有很多的服务器(硬件),又想玩一些或者学习一些集群架构,正好你的个人PC又性能不佳,无法用虚拟机的方式虚拟很多很多的设备,那可以尝试一下性能消耗较小的docker容器,搭建与学习集群知识,或者,只是玩。

警告:在生产环境以下做法都不适用。
建议: 在生产环境请使用 Kubernetes。
特殊用途:没有一堆服务器,又想尝试学习搭建一些集群使用。

基础环境

1.虚拟机 VirtualBox
2.操作系统 Ubuntu 18.04.3 LTS
3.容器引擎 Docker 19.03.5

虚拟机设置

在虚拟机上安装 Ubuntu 系统,安装完毕后需要将网卡设置为混杂模式

配置网桥

宿主机与docker如果要使用一样的网段,可以建立一个网桥,将宿主机网卡桥接到该网桥上。Ubuntu18.04的网络配置文件为/etc/netplan/50-cloud-init.yaml,编辑该文件,代码如下:

network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: no
      dhcp6: no
  bridges:
    br0:
      interfaces: [enp0s3]
      dhcp4: no
      addresses: [192.168.1.251/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [192.168.1.1,8.8.8.8]

新建了一个名字为br0的网桥,并将网卡enp0s3桥接上来,设置使用静态IP 192.168.1.251。使用命令netplan apply启用新的网络配置,使用命令ifconfig查看网络配置是否生效。

尝试ping外网确认配置的网络是通的。

配置docker

默认情况下,docker启动时会创建一个名为docker0的网桥,并使用该网桥,需要修改docker的启动配置,不再使用docker0的默认网桥,转而使用新建的br0网桥。修改/etc/docker/daemon.json文件(文件不存在就创建一个),加入如下配置:

{
  "bridge":"br0"
}

使用命令systemctl restart docker重启docker引擎。

运行容器

可以使用官方的busybox镜像来启一个容器进行测试。

Busybox是一个集成了一百多个最常用Linux命令和工具的软件工具箱,它在单一的可执行文件中提供了精简的Unix工具集。BusyBox可运行于多款POSIX环境操作系统中,如Linux(包括Andoroid)、Hurd、FreeBSD等。Busybox既包含了一些简单实用的工具,如cat和echo,也包含了一些更大,更复> 杂的工具,如grep、find、mount以及telnet。可以说BusyBox是Linux系统的瑞士军刀。

执行命令

run -it --rm --name test busybox

容器起来后,在容器里执行ifconfig命令查看IP地址。

虽然分配了和宿主机一样的网段,但是分配的IP是192.168.1.1,docker会从依次往上分配IP,如果再启一个容器分配的就是192.168.1.2了,但这不是想要的,IP不能控制分配非常舒服。

配置固定IP

要固定IP需要使用到pipework。

pipework 是由 Docker 的工程师 Jérôme Petazzoni 开发的一个 Docker 网络配置工具,由 200 多行 shell 实现,方便易用。

执行以下代码获取pipework:

git clone https://github.com/jpetazzo/pipework
cp pipework/pipework /usr/local/bin/

停止刚才创建的测试容器,它不符合要求,从新创建一个容器。

docker run -it --rm --network none --name test busybox

使用--network none在创建的时候不分配IP,稍后使用pipwork分配。此时查看容器里是没有IP的。

使用pipwork分配固定的IP,执行如下命令:

pipework br0 test 192.168.1.100/24@192.168.1.251

在这里的br0是上面新建的网桥,test是新建的容器名称,@符合后面的是网关地址,需要写宿主机的IP地址。重新进入容器执行ifconfig查看。

此时,容器的IP就已经是刚才指定分配的了。其实固定分配IP也可以通过docker create network实现,那是另外一个故事了,现在先把这个故事讲完,最后,测试一下容器的网络情况。

测试

容器ping外网,结果

容器ping宿主机,结果

宿主机ping容器,结果

我的电脑ping容器,正在用的这个,非虚拟机(宿主机),结果

容器ping我的电脑,结果,肯定通的,不用测试!!!

文章评论