一、关于Docker

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

因为对比传统虚拟机有启动快、性能提升、运维成本等等绝对优势,越来越受开发运维童鞋的青睐。

二、关于Docker网络模式分类

1、bridge模式,--net=bridge(默认)

2、host模式,--net=host

3、container模式 使用–net =container:指定容器名

4、none模式,--net=none

5、用户自定义模式

三、关于Docker网络模式详解

3.1 bridge模式

Docker网络的默认模式,在docker run启动容器的时候,如果不加--net参数,就默认采用这种网络模式。安装完docker,系统会自动添加一个供docker使用的网桥docker0。容器通过DHCP获取一个与docker0同网段的IP地址,并默认连接到docker0网桥,并将docker0的IP地址作为网关实现容器与宿主机的网络互通,另外,同一个宿主机下同样使用bridge模式的容器可以直接通讯。

实验部分

环境:VMware 安装Centos7虚拟机。

首先在Centos虚拟机中安装容器

yum -y install docker-io  ####安装docker

启动容器服务并检查启动状态systemctl start docker

启动docker服务后会发现主机多了一个docker0网卡 (PS:目前本机是通过192.168.32.129这个地址可以直接上网的)。

我们启动一个Centos的容器并进入bash,由于我们没有本地没有centos的镜像文件,默认就直接从Docker的官网镜像仓库下载。

[root@cesrc ~]# docker run -itd centos /bin/bash

查看启动的容器

[root@cesrc ~]# docker ps –a

进入容器里面,查看IP配置。

[root@cesrc ~]# docker attach b670

默认没有ifconfig命令,yum安装下net-tools

yum install net-tools

查看容器的ip和路由配置,容器分到了与docker0同段地址并将默认路由指向docker0

此容器可以直接上网

iptables -t nat –vnL,查看docker生成的iptables,可以看出相当于docker0对容器做了SNAT,

再启动一个容器

docker run -itd --name centos2 centos /bin/bash

此主机上的容器间可以直接通讯

此模式的网络工作模式如下图所示

3.2 host模式

容器将不会虚拟出自己的网卡,配置自己的IP等,而是直接使用宿主机的IP和端口,但是文件系统是和宿主机隔离的

docker run -itd --net=host --name host-rq centos /bin/bash

进入容器

容器的进程如下,是和宿主机独立。

3.3 Container模式

此模式指定新创建的容器和已经存在的一个容器共享一个 Network,和已有指定的容器出了网络方面其他都是独立的。

创建原始的一个容器s-centos

[root@cesrc ~]# docker run -itd --name s-centos centos /bin/bash

be7425c3fac6845c9d8d150f9b8c710f9268611fa3a6d86d59444ea1e4bfe415

创建新容器d-centos并使用原有容器的网络

[root@cesrc ~]# docker run -itd --net=container:s-centos --name d-centos centos /bin/bash

d576e3009391111688004f57c1549572fd534d33d0e7ee7cc1e02a785f6c8c14

分别进入容器内部,查看IP配置和文件系统是否独立

S-centos

D-centos

3.4 None模式

此模式下创建的不会创建网络,容器里面就不会有ip容器中只有lo,用户可以在此基础上,对容器网络做定制,若想使用pipework手工配置指定docker容器的ip地址,必须要在none模式下才可以

docker run -itd --net=none --name n-centos centos /bin/bash

None模式下生成的容器必须经过手工配置后才可以上网。

3.5 用户自定义模式

用户自定义模式主要可选的有三种网络驱动:bridge、overlay、macvlan。bridge驱动用于创建类似于前面提到的bridge网络;overlay和macvlan驱动用于创建跨主机的网络,本例中我们使用Flannel和etcd使用overlay技术实现docker跨物理机通信。

Flannel实现的容器的跨主机通信通过如下过程实现:

在etcd中规划配置所有主机的docker0子网范围;每个主机上的flanneld根据etcd中的配置,为本主机的docker0分配子网,保证所有主机上的docker0网段不重复,并将结果(即本主机上的docker0子网信息和本主机IP的对应关系)存入etcd库中,这样etcd库中就保存了所有主机上的docker子网信息和本主机IP的对应关系;当需要与其他主机上的容器进行通信时,查找etcd数据库,找到目的容器的子网所对应的outip(目的宿主机的IP),将原始数据包封装在VXLAN或UDP数据包中,IP层以outip为目的IP进行封装;由于目的IP是宿主机IP,因此路由是可达的,VXLAN或UDP数据包到达目的宿主机解封装,解出原始数据包,最终到达目的容器。

(图片摘自网络)

实验规划

Node1节点安装etcd步骤如下

1、安装etcd程序

yum install -y etcd

2、修改etcd配置文件,配置文件在/etc/etcd/etcd.conf,本实验etcd单机部署,群集配置部分没有做严格更改。配置如下:

#[Member]

#ETCD_CORS=""

ETCD_DATA_DIR="/var/lib/etcd/host129.etcd"  #etcd数据保存目录

#ETCD_WAL_DIR=""

#ETCD_LISTEN_PEER_URLS=http://192.168.32.129:2380  #集群内部通信使用的URL

ETCD_LISTEN_CLIENT_URLS=http://127.0.0.1:2379,http://192.168.32.129:2379    #供外部客户端使用的URL

#ETCD_MAX_SNAPSHOTS=""

#ETCD_MAX_WALS=""

ETCD_NAME="host129"    #etcd实例名称

3、设置后期分给docker容器的网段

etcdctl mk /network/config '{"Network":"172.18.0.0/16", "SubnetMin": "172.18.1.0", "SubnetMax": "172.18.254.0"}'

4、设置开机启动etcd服务并启动该服务

systemctl enable etcd

systemctl start etcd

Node2节点安装etcd步骤如下

1、安装Docker和Flannel服务

yum install -y docker flannel

2、修改Flannel配置文件如下

Flanneld configuration options

# etcd url location.  Point this to the server where etcd runs

FLANNEL_ETCD_ENDPOINTS="http://192.168.32.129:2379" ##设置etcd地址和端口信息

# etcd config key.  This is the configuration key that flannel queries

# For address range assignment

FLANNEL_ETCD_PREFIX="/network"

# Any additional options that you want to pass

FLANNEL_OPTIONS="-iface=ens33"     ##设置Flannel与etcd通讯网卡

3、设置启动参数

cd /usr/libexec/flannel/
./mk-docker-opts.sh –i

4、启动Docker和Flannel服务

systemctl enable docker flanneld

systemctl start docker flannel

5、开启宿主机转发功能{一定要打开,很多网上教程都没有提这个,造成无法联通}

iptables -PFORWARD ACCEPT

6、创建容器并进入容器,查看IP

docker run -itd centos /bin/bash

docker ps –a

docker attach 6c

在Node2节点上的操作同样在Node3执行一遍,最终看到Node3的获取的IP如图:

测试容器

Node2和node3上的容器是可以互相访问

宿主机上生成了到各个node的路由条目

上述方式可以实现跨主机的docker通讯,除此之外还有其他两种方式:

  • 在宿主机上添加到其他主机容器的静态路由方式

  • 桥接方式

这两种方式都比较好理解,参考网络摘抄的两张图片

原文链接:https://www.cnblogs.com/yy-cxd/p/6553624.html

静态路由方法:

桥接方法:

四、关于Docker的常用概念和命令总结

4.1 Docker 镜像

我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu 16.04 最小系统的 root 文件系统。

4.2 Docker 容器

镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

4.3 Docker Registry

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

有公有,有私有。

镜像管理命令

1) 获取镜像

从 Docker 镜像仓库获取镜像的命令是

docker pull

其命令格式为:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

命令参考

docker pull ubuntu:16.04 

不指定tag默认就是从阿里云仓库下载最新的

docker pull mirrors.aliyun.com:ubuntu 

2) 列出镜像

docker image ls

列表包含了 仓库名、标签、镜像 ID、创建时间 以及 所占用的空间。

3) 删除镜像

docker rmi 镜像Id 删除镜像文件

docker rmi -f 镜像ID强制删除镜像

4) 容器管理

docker create 创建不启动

docker start启动容器

docker stop 容器名称 终止容器

docker restart 容器名称重启容器

docker rm id 删除容器

docker run -it centos /bin/sh 创建并启动容器 exit后容器自动退出,若想以守护进程方式继续运行,需要改为docker run -itd centos /bin/sh

docker ps 查看运行中的容器

docker ps –a 查看所有容器,包含停止的容器。

5) 进入容器

docker attch 名字进入容器

docker exec -it``` 容器```id command | docker exec -it 7813e41ec005 /bin/sh

6) 导出容器至文件

docker export -o test_for_run_tar 容器ID

或 docker export 容器ID >test_for_stop_tar

7) 导入文件变成镜像

docker import test_for_run_tar - test/ubuntu:v1.

8) 数据管理

a)数据卷是一个可供容器使用的特殊目录,将操作系统的目录映射到容器

docker run -d -P --name web -v /src/webapp:/opt/webapp centos /bin/sh

挂载主机的/src/webapp到容器的/opt/webapp目录,默认可读写

docker run -d -P --name web -v /src/webapp:/opt/webapp:ro centos /bin/sh

只读模式

b)数据卷容器,可供其他容器共享使用的容器

先建立一个数据卷容器

root@localhost /]# docker run -it -v /cunchu --name chuchurongqi centos

[root@90bd63b06074 /]# ls

bin cunchu dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

[root@90bd63b06074 /]# cd cunchu/

[root@90bd63b06074 cunchu]# vi qiang.txt

新建一个其他容器,使用--volumes-from 数据卷容器名字实现挂载容器卷里面的数据卷。

[root@localhost /]# docker run -it --volumes-from chuchurongqi --name db2 centos

作者:网络安全-王志强

原文首发于:宜信安全应急响应中心

来源:宜信技术学院

初学Docker容器网络不得不看的学习笔记的更多相关文章

  1. docker容器网络bridge

    我们知道docker利用linux内核特性namespace实现了网络的隔离,让每个容器都处于自己的小世界里面,当这个小世界需要与外界(宿主机或其他容器)通信的时候docker的网络就发挥作用了,这篇 ...

  2. Docker容器网络-基础篇

    开源Linux 一个执着于技术的公众号 Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/N ...

  3. Docker容器网络篇

    Docker容器网络篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Docker的网络模型概述 如上图所示,Docker有四种网络模型: 封闭式网络(Closed conta ...

  4. 【转】理解Docker容器网络之Linux Network Namespace

    原文:理解Docker容器网络之Linux Network Namespace 由于2016年年中调换工作的原因,对容器网络的研究中断过一段时间.随着当前项目对Kubernetes应用的深入,我感觉之 ...

  5. Docker容器网络配置

    Docker容器网络配置 1.Linux内核实现名称空间的创建 1.1 ip netns命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作.ip netns命令 ...

  6. 两台主机间docker容器网络互通

    服务器1: 网络172.30.0.0/16 服务器2: 网络172.31.0.0/16 服务器1和服务器2上的docker容器网络之间是无法互通的,如果需要互通,需要做以下配置: 服务器1上执行: i ...

  7. docker容器网络—单主机容器网络

    当我们在单台物理机或虚拟机中运行多个docker容器应用时,这些容器之间是如何进行通信的呢,或者外界是如何访问这些容器的? 这里就涉及了单机容器网络相关的知识.docker 安装后默认 情况下会在宿主 ...

  8. Docker容器网络-实现篇

    通常,Linux容器的网络是被隔离在它自己的Network Namespace中,其中就包括:网卡(Network Interface).回环设备(Loopback Device).路由表(Routi ...

  9. 5、Docker容器网络

    使用Linux进行IP层网络管理的指     http://linux-ip.net/html/ # yum install iproute http://linux-ip.net/html/tool ...

随机推荐

  1. python基础——18(面向对象2+异常处理)

    一.组合 自定义类的对象作为另一个类的属性. class Teacher: def __init__(self,name,age): self.name = name self.age = age t ...

  2. 我给女朋友讲编程CSS系列(2)- CSS语法、3大选择器、选择器优先级

    首先看一下使用Css设置h1标签字体颜色和大小的例子,效果图如下: 新建一个网页test.html,然后复制粘贴下面的内容: <html> <head> <style t ...

  3. IOS笔记051-手势使用

    UIGestureRecognizer 利用UIGestureRecognizer,能轻松识别用户在某个view上面做的一些常见手势 UIGestureRecognizer是一个抽象类,定义了所有手势 ...

  4. day02_05.除数与被除数

    第5题 除数与被除数 编程需要一定数学能力,在这看看你找到了几个有用条件, 又该如何来运用他们呢? 学习是互通的 题目:两个自然数相除,商3余10,被除数,除数,商,余数的和是163,求被除数,除数. ...

  5. 菜鸟之路——机器学习之HierarchicalClustering层次分析及个人理解

    这个算法.我个人感觉有点鸡肋.最终的表达也不是特别清楚. 原理很简单,从所有的样本中选取Euclidean distance最近的两个样本,归为一类,取其平均值组成一个新样本,总样本数少1:不断的重复 ...

  6. [Cocos2dx Bug] [win32] Function CCFileUtils::fullPathFromRelativeFile forget consider the path separated by '\\'

    [Cocos2dx 2.2.4] [win32平台Bug] const char* CCFileUtils::fullPathFromRelativeFile(const char *pszFilen ...

  7. [AHOI2017/HNOI2017][bzoj4827] 礼物 [FFT]

    题面 传送门 思路 首先,有一个结论:两个手环增加非负整数亮度,等于其中一个增加一个整数亮度(可以为负) 我们令增加量为$x$,旋转以后的原数列为${a}{b}$那么现在的费用就是: $\sum_{i ...

  8. 个人环境搭建——版本控制SVN

    版本控制SVN SVN服务器配置: 第一部分:svn服务器搭建(主要是四步走) 参考:http://www.son1c.cn/show/920.html 一,安装Subversion sudo apt ...

  9. Python之时间:datetime模块

    datetime在time基础之上封装了一些方法.但是time是经常使用的,datetime中的功能,time都能实现 一.datetime的三个模块 datetime.date datetime.t ...

  10. python没学好

    环境 装东西用pip3不是pip 运算 //是下取整 py的浮点数也没有大小限制,但是超出一定范围就直接表示为inf 条件语句与循环 if xxx:, elif:, else:, 'for x in ...