初学Docker容器网络不得不看的学习笔记
【技术沙龙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容器网络不得不看的学习笔记相关推荐
- Docker容器网络
Docker的技术依赖于Linux内核的虚拟化技术的发展,Docker使用到的网络技术有Network Namespace.Veth设备对.Iptables/Netfilter.网桥.路由等.接下来, ...
- 手工模拟实现 Docker 容器网络!
大家好,我是飞哥! 如今服务器虚拟化技术已经发展到了深水区.现在业界已经有很多公司都迁移到容器上了.我们的开发写出来的代码大概率是要运行在容器上的.因此深刻理解容器网络的工作原理非常的重要.只有这样将 ...
- docker容器网络及其配置
docker容器网络及其配置 文章目录 docker容器网络及其配置 虚拟化网络 单主机与多主机的Docker网络 单节点容器间通信 不同节点容器间通信 Docker网络驱动 选择Docker网络驱动 ...
- Docker容器网络实例管理
Docker容器网络实例管理 Linux内核实现名称空间的创建 ip netns命令 可以借助ip netns命令来完成对 Network Namespace 的各种操作.ip netns命令来自于i ...
- 解锁TrueNAS SCALE 三方docker容器网络访问限制,默认是关闭的;并添加Portainer-CE容器webGUI管理器
解锁TrueNAS SCALE 三方docker容器网络访问限制,默认是关闭的:并添加Portainer-CE容器webGUI管理器 本教程环境版本:TrueNAS-SCALE-21.06-BETA. ...
- Docker容器网络解析
Docker 容器网络的发展历史 在 Dokcer 发布之初,Docker 是将网络.管理.安全等集成在一起的,其中网络模块可以为容器提供桥接网络.主机网络等简单的网络功能. 从 1.7 版本开始,D ...
- Swift网络开发之NSURLSession学习笔记
为什么80%的码农都做不了架构师?>>> Swift网络开发之NSURLSession学习笔记 先上效果图: 功能: -单个任务下载 -暂停下载任务 -取消下载任 ...
- docker容器网络 - 同一个host下的容器间通信
2019独角兽企业重金招聘Python工程师标准>>> 对于复杂的应用,不可避免需要多个服务部署在多个容器中,并且服务间存在相互间通信的情况.比如服务A需要连接mysql的容器.本文 ...
- Kubernetes Docker 容器网络终极之战(十四)
与 Docker 默认的网络模型不同,Kubernetes 形成了一套自己的网络模型,该网络模型更加适应传统的网络模式,应用能够平滑的从非容器环境迁移到 Kubernetes 环境中. 自从 Dock ...
最新文章
- Android-如何开发一个功能强大的图片选择器
- 【转载】springboot:如何优雅的使用mybatis
- 数据蒋堂 | 从一道招聘考题谈起
- php学数据结构,PHP 程序员学数据结构与算法之《栈》
- CEF:给客户端内嵌一个Chrome吧
- 巴黎市中心降下2019年第一场雪
- 成本预算的四个步骤_全网推广步骤有哪些?
- 作者:王学志(1979-),男,中国科学院计算机网络信息中心副研究员
- 面试官系统精讲Java源码及大厂真题 - 02 String、Long 源码解析和面试题
- mac电脑本地运行MapReduce, Permission denied
- JBox2D For Android - hello box2d
- 多线程的实现方式_一文搞懂Java多线程使用方式、实现原理以及常见面试题
- 【clickhouse】ClickHouse表引擎 MergeTree 索引与数据存储方式 一级索引 二级索引
- SAP License:IMG子菜单
- (转)mysql 无法设置外键的原因总结
- WPS2000中实现立体字效果(转)
- server2003 必要的系统优化和安全设置
- Android中自定义注解处理器
- kali系统破解WiFi密码(二)
- 全网唯一:surfacepro系列用户重启或解锁后蓝牙失灵终极解决方法【绝对有效】
热门文章
- mysql-python安装出错
- 从Spring Boot信息泄露到AWS控制台劫持(攻破aws亚马逊服务器)
- distribution was not found and is required by the application错误
- Linux下的用户、组和权限的详细解释
- wireshark怎么抓包、wireshark抓包详细图文教程,简单介绍(及wireshark与wireshark legacy差别 )
- 语法分析与中间代码生成
- 2018.11.08 NOIP模拟 景点(倍增+矩阵快速幂优化dp)
- requests模块(代理)篇
- VS-设置签出独占锁
- bzoj:1026: [SCOI2009]windy数(数位dp)