`

Docker容器使用静态独立的外部IP(便于集群组建)

 
阅读更多
http://my.oschina.net/gudaoxuri/blog/513923

需要使用Docker虚拟化Hadoop/Spark等测试环境,并且要可以对外提供服务,要求是完全分布式的部署(尽量模拟生产环境)。那么我们会遇到几个问题:

Container IP 是动态分配的
Container IP 是内部IP,外部无法访问(如对外提供HDFS服务可能会遇到Client无法访问DataNode,因为DataNode注册的是内部IP)
针对第一个问题有不少的方案,可以指定静态的IP,对第二个问题,我们可以使用--net=host解决,但这会导致对外只有一个IP,集群各个Slave的端口都要修改。至于pipework简单地看了下,好像也解决不了。

所以目前看上去只能使用看上去不是很优雅的方案解决,如下:

Solution

方法很简单:为Docker宿主网卡绑定多个IP,把这些IP分配给不同的容器。

//这是示例,我是在windows下用Docker toolbox运行的
root@default:~# ifconfig
docker0   Link encap:Ethernet  HWaddr 02:42:8C:8E:80:F1  
          inet addr:172.17.42.1  Bcast:0.0.0.0  Mask:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

eth0      Link encap:Ethernet  HWaddr 08:00:27:24:D1:F5  
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe24:d1f5/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:222 errors:0 dropped:0 overruns:0 frame:0
          TX packets:164 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:32277 (31.5 KiB)  TX bytes:28136 (27.4 KiB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:76:1D:9B  
          inet addr:192.168.99.100  Bcast:192.168.99.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe76:1d9b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:66 errors:0 dropped:0 overruns:0 frame:0
          TX packets:64 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:9001 (8.7 KiB)  TX bytes:10469 (10.2 KiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:16 errors:0 dropped:0 overruns:0 frame:0
          TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:1152 (1.1 KiB)  TX bytes:1152 (1.1 KiB)

//eth1网卡是可以与外部交互,所以我们添加IP到这个网卡上
//第一步:添加了两个IP           
root@default:~# ifconfig eth1:0 192.168.99.10 netmask 255.255.255.0 up
root@default:~# ifconfig eth1:1 192.168.99.11 netmask 255.255.255.0 up
//再次查看,多了两个IP
root@default:~# ifconfig
...

eth1      Link encap:Ethernet  HWaddr 08:00:27:76:1D:9B  
          inet addr:192.168.99.100  Bcast:192.168.99.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe76:1d9b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2258 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1685 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:207033 (202.1 KiB)  TX bytes:209587 (204.6 KiB)

eth1:0    Link encap:Ethernet  HWaddr 08:00:27:76:1D:9B  
          inet addr:192.168.99.10  Bcast:192.168.99.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

eth1:1    Link encap:Ethernet  HWaddr 08:00:27:76:1D:9B  
          inet addr:192.168.99.11  Bcast:192.168.99.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
...

//第二步:运行容器,指定IP,这里的示例容器开启的SSH服务,后面拿它测试
root@default:~# docker run -d -p 192.168.99.10:222:22 --name ssh1 gudaoxuri/scala-2.11-env
root@default:~# docker run -d -p 192.168.99.11:222:22 --name ssh2 gudaoxuri/scala-2.11-env
root@default:~# docker ps
CONTAINER ID        IMAGE                      COMMAND               CREATED             STATUS              PORTS                       NAMES
ab024af9c954        gudaoxuri/scala-2.11-env   "/usr/sbin/sshd -D"   4 seconds ago       Up 3 seconds        192.168.99.11:222->22/tcp   ssh2
259351134d16        gudaoxuri/scala-2.11-env   "/usr/sbin/sshd -D"   15 seconds ago      Up 14 seconds       192.168.99.10:222->22/tcp   ssh1

//测试连接,在Docker宿主机上SSH到第一个容器
root@default:~# ssh 192.168.99.10 -p222
The authenticity of host '[192.168.99.10]:222 ([192.168.99.10]:222)' can't be established.
RSA key fingerprint is ac:fe:4b:89:f8:51:b7:e9:9c:34:62:f9:80:38:4b:bf.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.99.10]:222' (RSA) to the list of known hosts.
root@192.168.99.10's password: 
Last login: Wed Oct  7 13:12:35 2015 from 192.168.99.1
//成功进入
[root@259351134d16 ~]# 
//在第一个容器中SSH到第二个容器
[root@259351134d16 ~]# ssh 192.168.99.11 -p222
root@192.168.99.11's password: 
Last login: Wed Oct  7 13:14:53 2015 from 172.17.42.1
//也OK了
[root@ab024af9c954 ~]#

Reference

http://stackoverflow.com/questions/25036895/how-to-expose-docker-containers-ip-and-port-to-outside-docker-host-without-port/25041782#25041782

http://dl528888.blog.51cto.com/2382721/1604167
分享到:
评论

相关推荐

    详解docker容器分配静态IP

    最近因为工作要求需要用学习使用docker,最后卡...但这里有一个问题,这个IP地址并不是静态分配的,这对我们的对容器的实例的网络管理造成一了些困难。这里笔者并不想直接给出解决方案,因为那样子并没有什么卵用,理解

    创建docker容器,配置容器ip桥接,在容器内安装tomcat

    要配置容器 IP 桥接网络,需要使用 Docker 的网络配置命令。首先,需要创建一个桥接网络: `docker network create -d bridge mybridge` 然后,需要将容器连接到桥接网络: `docker run -it --name mycontainer -...

    Docker 容器与容器云(高清扫描版)

    从实践者的角度出发,以Docker和Kubernetes为重点,沿着“基本用法介绍”到“核心原理解读”到“高级实践技巧”的思路,一本书讲透当前主流的容器和容器云技术,有助于读者在实际场景中利用Docker容器和容器云解决...

    docker容器入门与实践期末考试总复习.docx

    容器虚拟化技术可以为一组进程分配独立的运行环境,限制他们能使用的资源,并防止进程之间互相干扰。 Namespace 和 Cgroup 是容器虚拟化技术的核心组件。Namespace 实现了隔离,Cgroup 实现了资源控制。Namespace ...

    Docker容器之内网独立IP访问的方法

    今天在学习Docker容器的时候,在虚拟机中创建并开启了一个nginx的container,然后通过端口映射的方法,即将container的80端口映射到虚拟机的80端口,然后在宿主机上通过访问虚拟机的IP从而访问到Docker容器的Nginx...

    Docker 容器与容器云(第2版)

    本书从实践者的角度,在讲解Docker高级实践技巧的同时,深入到源代码层次,为读者梳理出Docker容器技术和基于Docker的容器云技术(如Kubernetes)的实现方法和设计思路,帮助读者理解如何在实际场景中利用Docker解决...

    Docker容器技术-Docker-compose使用案例.pptx

    ### Docker-compose入门案例:使用Docker Compose运行Tomcat容器 #### 创建`docker-compose.yml`文件 在运行Tomcat容器前,我们需要编写一个`docker-compose.yml`文件。例如,我们可以创建一个名为`tomcat.yml`的...

    docker容器无法访问宿主机端口的解决

    最近在工作时遇到一个问题,docker容器无法访问宿主机的redis,telent6379端口不通。 经排查发现,该服务器启用了防火墙,防火墙把6379的端口的访问授权给docker0网卡访问即可。 操作如下: firewall-cmd –...

    prometheus监控docker容器详细资料—超详细,超全面(带文档和相关软件包)

    - 使用`cadvisor`:一个开源工具,能够更详细地收集Docker容器的资源使用情况,包括容器内部应用的指标。 3. **Prometheus Client Libraries**: - 在Docker容器内运行的应用程序可以使用Prometheus客户端库(如...

    第四章:Docker容器升华--swarm集群1

    2. **加入集群**:其他主机使用 `docker swarm join` 命令,用管理节点的 token 和 IP 加入集群。 3. **检查集群状态**:使用 `docker node ls` 查看加入的节点,`docker service inspect` 查看集群详情,`docker ...

    Docker容器与容器云(第二版)

    docker容器与容器云的文档,有助于理解docker的知识。

    虚拟化与Docker容器技术.pdf

    2. 资源限制:Docker 容器的资源使用受到宿主操作系统的限制。 Docker 容器技术是一种轻量级的虚拟化技术,它可以提供快速、灵活和可靠的应用程序部署解决方案。 知识点: 1. 虚拟化技术分类:系统虚拟化和进程...

    Docker 容器与容器云(第2版) PDF带电子目录

    Docker 容器与容器云(第2版) PDF版本,带电子目录,结构清晰

    Kubernetes(K8S)集群管理Docker容器(部署篇)

    环境说明:操作系统:Ubuntu16.04orCentOS7Kubernetes版本:v1.8.3Docker版本:v17.09-ce均采用当前最新稳定版本。关闭selinux。打开下面网址,下载下面两个红色框框的包。...kubernetes-node-linux-amd64.tar.gz上传到...

    Docker容器部署tomcat出现中文乱码.docx

    Docker 容器中 Tomcat 部署出现中文乱码解决方案 在 Docker 容器中部署 Tomcat 时,可能会遇到中文乱码的问题,这是由于 Docker 容器的 locale 设置导致的。在本文中,我们将介绍如何解决这个问题。 什么是 locale...

    Docker容器绑定外部IP和端口的方法

    Docker允许通过外部访问容器或者容器之间互联的方式来提供网络服务。 以下操作通过myfirstapp镜像模拟,如何制作myfirstapp镜像请点击此处。 1、外部访问容器 容器启动之后,容器中可以运行一些网络应用,通过-p或-...

Global site tag (gtag.js) - Google Analytics