【技术沙龙002期】数据中台:宜信敏捷数据中台建设实践|宜信技术沙龙 将于5月23日晚8点线上直播,点击报名

一、关于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/bashbe7425c3fac6845c9d8d150f9b8c710f9268611fa3a6d86d59444ea1e4bfe415

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

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

分别进入容器内部,查看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  #集群内部通信使用的URLETCD_LISTEN_CLIENT_URLS=http://127.0.0.1:2379,http://192.168.32.129:2379    #供外部客户端使用的URL#ETCD_MAX_SNAPSHOTS="5"#ETCD_MAX_WALS="5"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 etcdsystemctl 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 runsFLANNEL_ETCD_ENDPOINTS="http://192.168.32.129:2379" ##设置etcd地址和端口信息# etcd config key.  This is the configuration key that flannel queries# For address range assignmentFLANNEL_ETCD_PREFIX="/network"# Any additional options that you want to passFLANNEL_OPTIONS="-iface=ens33"     ##设置Flannel与etcd通讯网卡

3、设置启动参数

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

4、启动Docker和Flannel服务

systemctl enable docker flanneldsystemctl start docker flannel

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

iptables -PFORWARD ACCEPT

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

docker run -itd centos /bin/bashdocker ps –adocker 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.0

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 /]# lsbin 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

作者:网络安全-王志强

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

来源:宜信技术学院

转载于:https://blog.51cto.com/14159827/2397193

初学Docker容器网络不得不看的学习笔记相关推荐

  1. Docker容器网络

    Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/Netfilter.网桥.路由等.接下来, ...

  2. 手工模拟实现 Docker 容器网络!

    大家好,我是飞哥! 如今服务器虚拟化技术已经发展到了深水区.现在业界已经有很多公司都迁移到容器上了.我们的开发写出来的代码大概率是要运行在容器上的.因此深刻理解容器网络的工作原理非常的重要.只有这样将 ...

  3. docker容器网络及其配置

    docker容器网络及其配置 文章目录 docker容器网络及其配置 虚拟化网络 单主机与多主机的Docker网络 单节点容器间通信 不同节点容器间通信 Docker网络驱动 选择Docker网络驱动 ...

  4. Docker容器网络实例管理

    Docker容器网络实例管理 Linux内核实现名称空间的创建 ip netns命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作.ip netns命令来自于i ...

  5. 解锁TrueNAS SCALE 三方docker容器网络访问限制,默认是关闭的;并添加Portainer-CE容器webGUI管理器

    解锁TrueNAS SCALE 三方docker容器网络访问限制,默认是关闭的:并添加Portainer-CE容器webGUI管理器 本教程环境版本:TrueNAS-SCALE-21.06-BETA. ...

  6. Docker容器网络解析

    Docker 容器网络的发展历史 在 Dokcer 发布之初,Docker 是将网络.管理.安全等集成在一起的,其中网络模块可以为容器提供桥接网络.主机网络等简单的网络功能. 从 1.7 版本开始,D ...

  7. Swift网络开发之NSURLSession学习笔记

    为什么80%的码农都做不了架构师?>>>    Swift网络开发之NSURLSession学习笔记 先上效果图:        功能: -单个任务下载 -暂停下载任务 -取消下载任 ...

  8. docker容器网络 - 同一个host下的容器间通信

    2019独角兽企业重金招聘Python工程师标准>>> 对于复杂的应用,不可避免需要多个服务部署在多个容器中,并且服务间存在相互间通信的情况.比如服务A需要连接mysql的容器.本文 ...

  9. Kubernetes Docker 容器网络终极之战(十四)

    与 Docker 默认的网络模型不同,Kubernetes 形成了一套自己的网络模型,该网络模型更加适应传统的网络模式,应用能够平滑的从非容器环境迁移到 Kubernetes 环境中. 自从 Dock ...

最新文章

  1. Android-如何开发一个功能强大的图片选择器
  2. 【转载】springboot:如何优雅的使用mybatis
  3. 数据蒋堂 | 从一道招聘考题谈起
  4. php学数据结构,PHP 程序员学数据结构与算法之《栈》
  5. CEF:给客户端内嵌一个Chrome吧
  6. 巴黎市中心降下2019年第一场雪
  7. 成本预算的四个步骤_全网推广步骤有哪些?
  8. 作者:王学志(1979-),男,中国科学院计算机网络信息中心副研究员
  9. 面试官系统精讲Java源码及大厂真题 - 02 String、Long 源码解析和面试题
  10. mac电脑本地运行MapReduce, Permission denied
  11. JBox2D For Android - hello box2d
  12. 多线程的实现方式_一文搞懂Java多线程使用方式、实现原理以及常见面试题
  13. 【clickhouse】ClickHouse表引擎 MergeTree 索引与数据存储方式 一级索引 二级索引
  14. SAP License:IMG子菜单
  15. (转)mysql 无法设置外键的原因总结
  16. WPS2000中实现立体字效果(转)
  17. server2003 必要的系统优化和安全设置
  18. Android中自定义注解处理器
  19. kali系统破解WiFi密码(二)
  20. 全网唯一:surfacepro系列用户重启或解锁后蓝牙失灵终极解决方法【绝对有效】

热门文章

  1. mysql-python安装出错
  2. 从Spring Boot信息泄露到AWS控制台劫持(攻破aws亚马逊服务器)
  3. distribution was not found and is required by the application错误
  4. Linux下的用户、组和权限的详细解释
  5. wireshark怎么抓包、wireshark抓包详细图文教程,简单介绍(及wireshark与wireshark legacy差别 )
  6. 语法分析与中间代码生成
  7. 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)
  8. requests模块(代理)篇
  9. VS-设置签出独占锁
  10. bzoj:1026: [SCOI2009]windy数(数位dp)