docker容器怎样实现绑定公网IP/浮动IP
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker容器怎样实现绑定公网IP/浮动IP相关的知识,希望对你有一定的参考价值。
有多种方法:1、把端口用 --publish forward 进容器里,或者说把端口发布出来。如 docker run -p 80:80 nginx
2、把某个虚拟或物理 interface bridge 进容器里,可以用一个叫 pipework 的工具:
3、直接不对容器网络做虚拟化/隔离,用 --net=host
准备工作
在使用 weave 之前,你需要在所有宿主机上安装 Docker 环境,参考这些教程,在 Ubuntu 或 CentOS/Fedora 发行版中安装 Docker。
Docker 环境部署完成后,使用下面的命令安装 weave:
$ wget https://github.com/zettio/weave/releases/download/latest_release/weave
$ chmod a+x weave
$ sudo cp weave /usr/local/bin
注意你的 PATH 环境变量要包含 /usr/local/bin 这个路径,请在 /etc/profile 文件中加入一行(LCTT 译注:要使环境变量生效,你需要执行这个命令: source /etc/profile):
export PATH="$PATH:/usr/local/bin"
在每台宿主机上重复上面的操作。
Weave 在 TCP 和 UDP 上都使用 6783 端口,如果你的系统开启了防火墙,请确保这两个端口不会被防火墙挡住。
在每台宿主机上启动 Weave 路由器
当你想要让处于在不同宿主机上的容器能够互相通信,第一步要做的就是在每台宿主机上启动 weave 路由器。
第一台宿主机,运行下面的命令,就会创建并开启一个 weave 路由器容器(LCTT 译注:前面说过了,weave 路由器也是一个容器):
$ sudo weave launch
第一次运行这个命令的时候,它会下载一个 weave 镜像,这会花一些时间。下载完成后就会自动运行这个镜像。成功启动后,终端会输出这个 weave 路由器的 ID 号。
下面的命令用于查看路由器状态:
$ sudo weave status
第一个 weave 路由器就绪了,目前为止整个 peer 对等网络中只有一个 peer 成员。
你也可以使用 docker 的命令来查看 weave 路由器的状态:
$ docker ps
第二台宿主机部署步骤稍微有点不同,我们需要为这台宿主机的 weave 路由器指定第一台宿主机的 IP 地址,命令如下:
$ sudo weave launch <first-host-IP-address>
当你查看路由器状态,你会看到两个 peer 成员:当前宿主机和第一个宿主机。
当你开启更多路由器,这个 peer 成员列表会更长。当你新开一个路由器时,要指定前一个宿主机的 IP 地址,请注意不是第一个宿主机的 IP 地址(LCTT 译注:链状结构)。
现在你已经有了一个 weave 网络了,它由位于不同宿主机的 weave 路由器组成。
把不同宿主机上的容器互联起来
接下来要做的就是在不同宿主机上开启 Docker 容器,并使用虚拟网络将它们互联起来。
假设我们创建一个私有网络 10.0.0.0/24 来互联 Docker 容器,并为这些容器随机分配 IP 地址。
如果你想新建一个能加入 weave 网络的容器,你就需要使用 weave 命令来创建,而不是 docker 命令。原因是 weave 命令内部会调用 docker 命令来新建容器然后为它设置网络。
下面的命令是在宿主机 hostA 上建立一个 Ubuntu 容器,然后将它放到 10.0.0.0/24 网络中,分配的 IP 地址为 10.0.0.1:
hostA:~$ sudo weave run 10.0.0.1/24-t -i ubuntu
成功运行后,终端会显示出容器的 ID 号。你可以使用这个 ID 来访问这个容器:
hostA:~$ docker attach <container-id>
在宿主机 hostB 上,也创建一个 Ubuntu 容器,IP 地址为 10.0.0.2:
hostB:~$ sudo weave run 10.0.0.2/24-t -i ubuntu
访问下这个容器的控制台:
hostB:~$ docker attach <container-id>
这两个容器能够互相 ping 通,你可以通过容器的控制台检查一下。
如果你检查一下每个容器的网络配置,你会发现有一块名为“ethwe”的网卡,你分配给容器的 IP 地址出现在它们那里(比如这里分别是 10.0.0.1 和 10.0.0.2)。
Weave 的其他高级用法
weave 提供了一些非常巧妙的特性,我在这里作下简单的介绍。
应用分离
使用 weave,你可以创建多个虚拟网络,并为每个网络设置不同的应用。比如你可以为一群容器创建 10.0.0.0/24 网络,为另一群容器创建 10.10.0.0/24 网络,weave 会自动帮你维护这些网络,并将这两个网络互相隔离。另外,你可以灵活地将一个容器从一个网络移到另一个网络而不需要重启容器。举个例子:
首先开启一个容器,运行在 10.0.0.0/24 网络上:
$ sudo weave run 10.0.0.2/24-t -i ubuntu
然后让它脱离这个网络:
$ sudo weave detach 10.0.0.2/24<container-id>
最后将它加入到 10.10.0.0/24 网络中:
$ sudo weave attach 10.10.0.2/24<container-id>
现在这个容器可以与 10.10.0.0/24 网络上的其它容器进行通信了。这在当你创建一个容器而网络信息还不确定时就很有帮助了。
将 weave 网络与宿主机网络整合起来
有时候你想让虚拟网络中的容器能访问物理主机的网络。或者相反,宿主机需要访问容器。为满足这个功能,weave 允许虚拟网络与宿主机网络整合。
举个例子,在宿主机 hostA 上一个容器运行在 10.0.0.0/24 中,运行使用下面的命令:
hostA:~$ sudo weave expose 10.0.0.100/24
这个命令把 IP 地址 10.0.0.100 分配给宿主机 hostA,这样一来宿主机 hostA 也连到了 10.0.0.0/24 网络上了。显然,你在为宿主机选择 IP 地址的时候,需要选一个没有被其他容器使用的地址。
现在 hostA 就可以访问 10.0.0.0/24 上的所有容器了,不管这些容器是否位于 hostA 上。 参考技术A 绑定公网IP有多种方法:
1、把端口用 --publish forward 进容器里,或者说把端口发布出来。如 docker run -p 80:80 nginx
2、把某个虚拟或物理 interface bridge 进容器里,可以用一个叫 pipework 的工具:
3、直接不对容器网络做虚拟化/隔离,用 --net=host
浮动IP
浮动IP目前没有成熟的方案,在我看来,一个是自己写agent来通过iptables自动完成漂移,另一个是寄希望于官方的libnetwork 参考技术B 绑定公网IP有多种方法:
1、把端口用 --publish forward 进容器里,或者说把端口发布出来。如 docker run -p 80:80 nginx
2、把某个虚拟或物理 interface bridge 进容器里,可以用一个叫 pipework 的工具:
3、直接不对容器网络做虚拟化/隔离,用 --net=host
浮动IP
浮动IP目前没有成熟的方案,在我看来,一个是自己写agent来通过iptables自动完成漂移,另一个是寄希望于官方的libnetwork
docker 容器不能联网
Unknown Endpoint: Inaccessible host: `dynamodb.us-east-1.amazonaws.com‘
别慌!Docker容器内不能联网的6种解决方案
注:下面的方法是在容器内能ping通公网IP的解决方案,如果连公网IP都ping不通,那主机可能也上不了网(尝试ping 8.8.8.8)
1.使用--net:host选项
- sudo docker run --net:host --name ubuntu_bash -i -t ubuntu:latest /bin/bash
2.使用--dns选项
- sudo docker run --dns 8.8.8.8 --dns 8.8.4.4 --name ubuntu_bash -i -t ubuntu:latest /bin/bash
3.改dns server
- vi /etc/default/docker
- 去掉“docker_OPTS="--dns 8.8.8.8 --dns 8.8.4.4"”前的#号
4.不用dnsmasq
- vi /etc/NetworkManager/NetworkManager.conf
- 在dns=dnsmasq前加个#号注释掉
- sudo restart network-manager
- sudo restart docker
5.重建docker0网络
- pkill docker
- iptables -t nat -F
- ifconfig docker0 down
- brctl delbr docker0
- docker -d
6.直接在docker内修改/etc/hosts
以上是关于docker容器怎样实现绑定公网IP/浮动IP的主要内容,如果未能解决你的问题,请参考以下文章