Docker网络的基本功能操作示例
一、Docker常用的四种网络模型

1.第一种:使用网络名称空间,但不设置任何网络设备
这种模型中只有lo接口,是一个封闭式的容器,不能与外界进行通信。设置网络模型需要使用 --network 选项来设置,如果不指定类型,默认是第二种模型:
~]# docker container run -it --network none busybox:latest
/ # ifconfig -a
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (0.0 B) TX bytes: (0.0 B)
2.第二种:桥接式网络模型。
这种模型是将容器与宿主机上的docker0网络接口相连,可实现容器对外通信。
~]# docker container run -it --network bridge busybox:latest
/ # hostname
f9a1612f44bd
/ # ifconfig
eth0 Link encap:Ethernet HWaddr ::AC:::
inet addr:172.17.0.2 Bcast:172.17.255.255 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (648.0 B) TX bytes: (0.0 B) lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (0.0 B) TX bytes: (0.0 B)
此时的IP地址就多了宿主机上docker0的地址,有时可能我们会需要使用主机名来进行通信,所以还可以在启动容器时定义主机名(若不是先指定,默认主机名是容器id)。
~]# docker container run -it --network bridge -h box.docker.com busybox:latest
/ # hostname
box.docker.com
/ # cat /etc/hosts #查看本地解析规则
127.0.0.1 localhost
:: localhost ip6-localhost ip6-loopback
fe00:: ip6-localnet
ff00:: ip6-mcastprefix
ff02:: ip6-allnodes
ff02:: ip6-allrouters
172.17.0.2 box.docker.com box #已被加入到本地解析规则中
/ # cat /etc/resolv.conf #查看DNS服务器指向
# Generated by NetworkManager
search example.com
nameserver 192.168.29.2 #自动指向宿主机的DNS服务器
/ # nslookup -type=A www.baidu.com #查看是否能正常解析
Server: 192.168.29.2
Address: 192.168.29.2: Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com
Name: www.a.shifen.com
Address: 61.135.169.125
Name: www.a.shifen.com
Address: 61.135.169.121
这种模型中默认指向的DNS服务器是宿主机指向的DNS,当然也可以用 --dns 自定义指定DNS:
~]# docker container run -it --network bridge -h box.docker.com --dns 114.114.114.114 busybox:latest
/ # cat /etc/resolv.conf
search example.com
nameserver 114.114.114.114
使用 --add-hosts 可以注入host解析规则:
~]# docker container run -it --network bridge -h box.docker.com --add-host www.ready.com:1.1.1.1 --dns 114.114.114.114 busybox:latest
/ # cat /etc/hosts
127.0.0.1 localhost
:: localhost ip6-localhost ip6-loopback
fe00:: ip6-localnet
ff00:: ip6-mcastprefix
ff02:: ip6-allnodes
ff02:: ip6-allrouters
1.1.1.1 www.ready.com
172.17.0.2 box.docker.com box
使用 -p 选项将容器“暴露”到网络上去,使外部能够访问容器:
-p <containerPort> 将指定容器端口映射到宿主机所有地址的一个动态端口。
-p <hostPort>:<containerPort> 将指定的容器端口映射至指定的宿主机端口。
-p <ip>:<hostPort>:<containerPort> 将指定的容器端口映射至主机指定IP的指定端口。
"动态端口"指随机端口,具体可使用 docker port 命令查看。
~]# docker container run --name test1 --network bridge -p --rm ready/httpd:v0.
查看被映射到了哪个端口:
~]# docker port test1
/tcp -> 0.0.0.0:
在物理机上访问容器宿主机的地址+映射IP:

3.第三种模型:联盟容器模型。
所谓联盟容器模式就是指使两个容器使用共同的名称空间,比如在一般情况下,启动两个容器时,会被分别分配在不同的名称空间中使容器之间相互隔离,但在一些场景中可能会需要两个容器使用相同的名称空间,这时就可以使用 --network container:<容器名> 将两个容器划分为一个共享的名称空间。要注意的是这里共享的仅仅只是网口名称空间,文件系统等还是相互隔离的。
若要使容器共享宿主机的网络名称空间,则可以使用 --network host ,可以看到容器中的IP地址和宿主机上的IP一致了:
~]# docker container run --name box1 -it --network host --rm busybox:latest
/ # ifconfig
docker0 Link encap:Ethernet HWaddr ::::5A:6A
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
inet6 addr: fe80:::19ff:fe55:5a6a/ Scope:Link
UP BROADCAST MULTICAST MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (3.3 KiB) TX bytes: (5.3 KiB) ens33 Link encap:Ethernet HWaddr :0C::A7::CC
inet addr:192.168.29.101 Bcast:192.168.29.255 Mask:255.255.255.0
inet6 addr: fe80::7c47:ae3e:a9b4:fe7c/ Scope:Link
UP BROADCAST RUNNING MULTICAST MTU: Metric:
RX packets: errors: dropped: overruns: frame:
TX packets: errors: dropped: overruns: carrier:
collisions: txqueuelen:
RX bytes: (611.8 KiB) TX bytes: (380.0 KiB)
二、修改默认docker0的地址以及创建网络接口
可在docker的配置文件中修改,路径为: /etc/docker/daemon.json
{
"bip": "192.168.1.5/24", #核心选项为bip,即bridge ip之意,用于指定docker0桥自身的IP地址;其它选项可通过此地址计算得出。
"fixed-cidr": "10.20.0.0/16",
"fixed-cidr-v6": "2001:db8::/64",
"mtu": ,
"default-gateway": "10.20.1.1",
"default-gateway-v6": "2001:db8:abcd::89",
"dns": ["10.20.1.2","10.20.1.3"]
}
在容器中创建新的网络接口可使用 docker network create 命令。
Docker网络的基本功能操作示例的更多相关文章
- H3C 多路径网络中环路避免操作示例
- Docker网络解决方案 - Weave部署记录
		前面说到了Flannel的部署,今天这里说下Docker跨主机容器间网络通信的另一个工具Weave的使用.当容器分布在多个不同的主机上时,这些容器之间的相互通信变得复杂起来.容器在不同主机之间都使用的 ... 
- Docker容器学习梳理 - 日常操作总结
		使用Docker已有一段时间了,今天正好有空梳理下自己平时操作Docker时的一些命令和注意细节: Docker 命令帮助 $ sudo docker Commands: attach Attach ... 
- [经验分享] Docker网络解决方案-Weave部署记录
		前面说到了Flannel的部署,今天这里说下Docker跨主机容器间网络通信的另一个工具Weave的使用.当容器分布在多个不同的主机上时,这些容器之间的相互通信变得复杂起来.容器在不同主机之间都使用的 ... 
- Docker网络讲解 及实验redis集群部署
		理解docker0 准备工作:清空所有的容器,清空所有的镜像 docker rm -f $(docker ps -a -q) # 删除所有容器 docker rmi -f $(docker image ... 
- 【转】Docker网络详解及pipework源码解读与实践
		好文必转 原文地址: http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-prac ... 
- docker网络解析
		Docker概念和默认网络 什么是Docker网络呢?总的来说,网络中的容器们可以相互通信,网络外的又访问不了这些容器.具体来说,在一个网络中,它是一个容器的集合,在这个概念里面的一个容器,它会通过容 ... 
- Docker 网络之理解 bridge 驱动
		笔者在前文<Docker 网络之进阶篇>中介绍了 CNM(Container Network Model),并演示了 bridge 驱动下的 CNM 使用方式.为了深入理解 CNM 及最常 ... 
- Docker 网络之进阶篇
		笔者在<Docker 基础 : 网络配置>一文中简单介绍了容器网络的基本用法,当时网络的基本使用方式还处于 --link 阶段.时过境迁,随着 docker 的快速发展,其网络架构也在不断 ... 
随机推荐
- Python成绩雷达图
			代码 import numpy as np import matplotlib import matplotlib.pyplot as plt matplotlib.rcParams['font.fa ... 
- 导入Dynamic Web Project后程序有红叉但是可以运行
			解决方法: 进入工程下的.setting文件夹,用记事本编辑org.eclipse.wst.common.project.facet.core.xml, 把<runtime name=" ... 
- 《HTTP权威指南》1-HTTP概要
			Http HyperText Transfer Protocol,超文本协议通过此协议,我们可以将遍布全世界的Web服务器上的信息块快速,便捷,可靠的搬移到我们自己桌面上的Web浏览器上.这些信息块指 ... 
- C语言向上、向下取整
			C语言有以下几种取整方法: 1.直接赋值给整数变量.如: int i = 2.5; 或 i = (int) 2.5; 这种方法采用的是舍去小数部分 2.C/C++中的整数除法运算符“/”本身就有取整功 ... 
- 《JavaScript 高级程序设计》读书笔记三 基本概念
			一 语法 区分大小写,驼峰式书写方式: 严格模式:“use strict”: 二 数据类型 a. 基本数据类型: undefined 声明变量未初始化 null 空指针,可以释放内存 Boole ... 
- UnityTips:使用反射调用内部方法拓展编辑器
			大家都知道Unity是一个C/C++的游戏引擎,C#只是Unity提供的脚本层.因此大部分功能都是通过C#来调用底层的C++代码的.而一些朋友可能不知道的是,其实Unity的C#代码中也有很多方法是我 ... 
- Android WebView 打印 Console Log
			通常状况下,添加如下代码即可: mWebView.setWebViewClient(new WebChromeClient { /*android 低版本 Desperate*/ @ ... 
- HTTP 协议服务器相关概念
			1.HTTP/1.1规范允许一台HTTP服务器搭建多个Web站点,即物理层面只有一台服务器,使用虚拟主机功能,可就假想有多台服务器. 在相同IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的网站, ... 
- Python图像处理库PIL中图像格式转换
			o 在数字图像处理中,针对不同的图像格式有其特定的处理算法.所以,在做图像处理之前,我们需要考虑清楚自己要基于哪种格式的图像进行算法设计及其实现.本文基于这个需求,使用python中的图像处理库PIL ... 
- 一文了解Python中的循环(for while break continue 嵌套循环...)
			循环 目标 程序的三大流程 while 循环基本使用 break 和 continue while 循环嵌套 01. 程序的三大流程 在程序开发中,一共有三种流程方式: 顺序 —— 从上向下,顺序执行 ... 
