Docker的网络机制

Docker的网络有三种类型(driver): bridge, host 和 null.

  • birdge: 就如同桥接的switch/hub, 使用bridge网络的container会分配一个当前bridge配置的子网IP, 在通过run创建container时通过 --ip 指定.
  • host: 需要使用 --network=host 参数指定. 使用主机网络, 此时 container 的网络会附属在主机上, 两者是互通的. 例如在container中的服务监听8080端口, 则主机的8080端口就会自动映射到这个端口.
  • none: 需要使用 --network=none 参数指定. 不分配局域网的IP

可以通过命令 docker network ls 和 docker network inspect [name] 查看

$ docker network ls
NETWORK ID NAME DRIVER SCOPE
771ed6aaa9f8 bridge bridge local
243e4b881761 host host local
1c2c6b04e22c none null local $ docker network inspect bridge
[
{
"Name": "bridge",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
...
}
]

在宿主机上, 通过ifconfig能看到bridge的网关IP, 而container IP是不能直接看到的.

创建自定义Network

启动Docker容器的时候,使用默认的网络是不支持指派固定IP的

docker run -itd --net bridge --ip 172.17.0.10 centos:latest /bin/bash
6eb1f228cf308d1c60db30093c126acbfd0cb21d76cb448c678bab0f1a7c0df6
docker: Error response from daemon: User specified IP address is supported on user defined networks only.

需要使用自定义的network, 创建完后, 在宿主机上能看到新的bridge 的网关IP

$ docker network create --subnet=192.168.250.1/24 mybridge
760fb4aec8aef1eacece34d3a28aee1eabde7c47ce8ef9ec646c7c320a4da195 $ docker network ls
NETWORK ID NAME DRIVER SCOPE
771ed6aaa9f8 bridge bridge local
243e4b881761 host host local
760fb4aec8ae mybridge bridge local
1c2c6b04e22c none null local

使用固定IP创建Container

$ docker run --name eureka -itd --net mybridge --ip 192.168.250.3 scot-eureka:latest /bin/bash
ba7f9fcb4178c5181d3ea85eca5d03a132b8f32727c1ca0ee13bfd1ec15e4cc8 $ ping 192.168.250.3
PING 192.168.250.3 (192.168.250.3) 56(84) bytes of data.
64 bytes from 192.168.250.3: icmp_seq=1 ttl=64 time=0.102 ms
64 bytes from 192.168.250.3: icmp_seq=2 ttl=64 time=0.102 ms

使用固定IP启动官方4.0.11版本的redis (启动latest=5.0.0版本的redis, 无法链接6379端口, 尚未检查具体原因, 4.0.11是没问题的)

$ docker run   -d --name redis2 --net mybridge --ip 192.168.250.2 redis:4.0.

Docker的 Macvlan 网络

创建macvlan网络, 可以使docker的虚拟网卡直接绑定宿主机的物理网卡, 直接与宿主机所在网络进行通讯. 此时, 除了宿主机和docker容器之间无法通信以外, docker容器与容器之间, 容器与宿主机网段其他机器之间都可以互访.

参考的说明 https://docs.docker.com/v17.09/engine/userguide/networking/get-started-macvlan/ 其中特别提到的, 这是因为安全隔离所造成的, 如果需要宿主机和容器之间通信, 需要增加子网卡.

Communication with the Docker host over macvlan

When using macvlan, you cannot ping or communicate with the default namespace IP address. For example, if you create a container and try to ping the Docker host’s eth0, it will not work. That traffic is explicitly filtered by the kernel modules themselves to offer additional provider isolation and security.

A macvlan subinterface can be added to the Docker host, to allow traffic between the Docker host and containers. The IP address needs to be set on this subinterface and removed from the parent address.

创建macvlan的命令

1
2
3
4
5
6
7
8
# 断开连接
$ docker network disconnect bridge-local redis
# 删除网络
$ docker network rm bridge-local
# 创建网络
$ docker network create -d macvlan --subnet=192.168.252.0/24 --gateway=192.168.252.1 --aux-address="parent_host=192.168.252.151" -o parent=enp2s0f0 bridge-local
# 将运行中的docker连接至bridge-local
$ docker network connect bridge-local redis --ip 192.168.252.10

参考 http://networkstatic.net/configuring-macvlan-ipvlan-linux-networking/

以及如何在Ubuntu18.04下配置subinterface https://askubuntu.com/questions/971126/17-10-netplan-config-with-bridge

Docker的网络类型和固定IP设置的更多相关文章

  1. Docker安装nacos1.0.0固定ip单机模式

    1 从dockerHub拉取镜像到本地 docker pull nacos/nacos-server:1.0.0 2 创建目录(宿主机) 2.1 日志目录 mkdir -p /docker/nacos ...

  2. docker单机网络类型

    docker单机网络类型概述 Docker 安装时会自动在 host 上创建三种网络  分别为 bridge    host   none .   可用 docker network ls 命令查看 ...

  3. Docker桥接宿主机网络与配置固定IP地址

    有些需求是把这个容器与宿主机在同一个网段,但是本人不建议这样子去操作,因为一个容器本身就是一个封装好的服务.建议去按默认的网络去实现. 临时设置 [root@linux-docker01 ~]# vi ...

  4. VirtualBox中CentOS7.2 网络配置(固定IP+联网)

    一.前言 用虚拟机装Linux系统时,经常会出现一些问题.比如:从主机到虚拟机之间网络不通:虚拟机中无法联网:虚拟机中的IP地址不固定.为了解决这些问题,我曾花了不少时间.在此,记下填坑方法. 二.环 ...

  5. VirtualBox中CentOS7.2 网络配置(固定IP+联网)(亲测有效)

           https://www.linuxidc.com/Linux/2018-04/151924.htm 一.前言 用虚拟机装Linux系统时,经常会出现一些问题.比如:从主机到虚拟机之间网络 ...

  6. Docker的网络类型

    四种网络类型: None:不为容器配置任何网络功能,--net=noneContainer:与另一个运行中的容器共享Network Namespace,--net=container:containe ...

  7. 桌面版Ubuntu系统固定IP设置和Network-manager设置

    我自己的学校是绑定MAC和IP上网的.这种方法名义上说是为了安全,不过是个搞计算机的都知道随便修改一下MAC就可以使用别人的IP了. 不提蛋疼的事情了,先来说说网络的配置吧 我用的是Ubuntu14. ...

  8. vm 中 centOS 7 固定ip设置

    虚拟机中,centOS通过NAT连接,设置固定IP上网. 本地主机 VMware Network Adapter VMnet8  状态信息: 描述: VMware Virtual Ethernet A ...

  9. ubuntu 15.10 设置静态ip 分配固定ip 设置dns 设置网关 命令行配置ip 固定ip不生效怎么办

    要用到的文件: 配置接口信息 /etc/network/interfaces 配置内容: auto eth0 iface eth0 inet static address 192.168.216.18 ...

随机推荐

  1. 基于 arduino 的低功耗无线传感结点设计

    发送端 仿真图: *仿真图中使用使用TMP传感器(LM34)代替实际使用的DHT11传感器. 连接方式: DHT11的正极(VCC)与5V电源接口连接 DHT11的负极(GND)与GND连接 DHT1 ...

  2. DAY11 函数(二)

    一.函数的对象 1.1定义:函数名就是存放了函数的内存地址,存放了内存地址的变量都是对象,即 函数名 就是 函数对象 1.2函数对象的应用 1 可以直接被引用 fn = cp_fn def fn(): ...

  3. js 里面的那些节省字节的写法 a|0 void 0等等

    //取整 parseInt(a,10); Math.floor(a); ~~a; //节省之后的写法 a|0; //节省之后的写法 //四舍五入 Math.round(a); a+.5|0; //节省 ...

  4. 连接SQLsever数据库在C#中不能操作的问题

    最近小组成员在用C#连接数据库进行操作的时候,总是注册不起用户,提示为sql.client值不能为NULL,经过了一上午的百度查询,讨论,总是找不到问题所在,不得已去问了老师,老师是专业的软件工程师, ...

  5. 跟随我在oracle学习php(7)

    盒子模型布局 盒子模型:每个标签都是一个盒子 计算宽高:box-sizing:border-box盒子的宽度就是设置的宽度,里面的内容自适应 从里到外:padding(内边距) Border(边框) ...

  6. Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

    Android 设备的CPU类型(通常称为”ABIs”) 引用: https://blog.csdn.net/ouyang_peng/article/details/51168072 armeabiv ...

  7. 读取磁盘:LBA方式

    LBA简介 磁盘读取发展 IO操作读取硬盘的三种方式: chs方式 :小于8G (8064MB) LBA28方式:小于137GB LBA48方式:小于144,000,000 GB LBA方式访问使用了 ...

  8. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  9. redis缓存工具类

    import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis ...

  10. 创建学生类 有姓名 学校 和年龄 覆盖toString() 1放到集合ArrayList 然后 2在第2个位置插入1个学生信息 3判断 刘德华这个学生是否存在 存在就打出来, 4输出全部学生信息 直接打印对象

    学生类 package com.lanxi.demo1; public class Student { //创建属性 姓名,学校,年龄 private String name; private Str ...