千家信息网

初学Docker容器网络不得不看的学习笔记

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,【技术沙龙002期】数据中台:宜信敏捷数据中台建设实践|宜信技术沙龙 将于5月23日晚8点线上直播,点击报名一、关于DockerDocker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apac
千家信息网最后更新 2026年11月03日初学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

作者:网络安全-王志强

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

来源:宜信技术学院

容器 模式 镜像 网络 数据 主机 配置 宿主 文件 宿主机 系统 服务 地址 命令 方式 用户 目的 路由 仓库 子网 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技海报 河南云网互联网络科技有限公司 高科技互联网 互联网科技活动banner 美国互联网保险保险科技 华中科技大学互联网 远拓互联网科技 成都仁贤领冠互联网科技有限公司 汽车互联网创新科技园 河南猎农互联网科技有限公司 互联网科技大奖都有哪些公司 广西互联网科技孵化中心 雨阳互联网卡科技有限公司 21世纪互联网科技成就 富国互联网科技002692 绵阳真晨互联网科技有限公司 科技互联网专业务虚会材料 青岛互联网科技园 银川新华互联网科技学校招聘 山东亿川互联网科技有限责任公司 亿人帮互联网科技有限公司 互联网科技素材视频竖屏 海南科技产业互联网平台 移动互联网科技股 深圳艾果互联网通讯科技 济南有互联网科技公司吗 2021互联网科技公司排名 杭州披云加互联网科技有限公司 互联网科技创业计划的风险分析 广东猫王互联网科技有限公司电话
0