1. Docker 基本网络模型

Docker 有 4 种基本的网络模型:

  1. bridge 桥接模式
  2. host 网络模式
  3. container 联盟模式
  4. none 模式

Docker daemon 在启动时会创建一个虚拟网桥 docker0 默认地址为 172.17.0.1/16 ,容器启动后会被桥接到 docker0 上,并自动分配到一个 IP 地址。

Docker 在启动容器时,默认采用的是 bridge 桥接模式,可以通过 -net 进行指定。

以下是 Docker 网络初始化过程:

1.1 bridge 桥接网络模型

Bridge 桥接模式的实现逻辑如下:

Bridge 桥接模式的实现步骤主要如下:

  1. Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备 假设为veth0 和 veth1,而 veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
  2. Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0 网桥上,保证宿主机的网络报文可以发往 veth0
  3. Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为 eth0

优势:

  保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker Container 网络的联通性,同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性。

劣势:

  该模式下 Docker Container 不具有一个公有 IP,即和宿主机的 eth0 不处于同一个网段。导致的结果是宿主机以外的世界不能直接和容器进行通信。虽然 NAT 模式经过中间处理实现了这一点,但是 NAT 模式仍然存在问题与不便,如:容器均需要在宿主机上竞争端口,容器内部服务的访问者需要使用服务发现获知服务的外部端口等。另外,NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率。

查看 docker0 网桥信息:

创建一个容器

再次查看 桥接设备

网络逻辑分析:

1.2 Host 网络模式

Host 网络模型实现逻辑如下:

优势:

  host 模式是 bridge 桥接模式很好的补充。采用 host 模式的 docker container,可以直接使用宿主机的 IP 地址和外界通信,若宿主机的 eth0 是一个公网IP ,那么容器也拥有这个公网 IP
同时容器内服务的端口也可以使用宿主机的端口,无需额外进行 NAT 转换。

劣势:

  使用 host 模式的 docker container 虽然可以让容器内部的服务和传统情况无差别、无改造的使用,但是由于网络隔离性的弱化,该容器会与宿主机共享竞争网络栈的使用;
容器内部将不再拥有所有的端口资源,原因是部分端口资源已经被宿主机本身的服务占用,还有部分端口已经用以 bridge 网络模式容器的端口映射。

要创建 host 模式的容器,使用 --net host 指定:

可以看到,创建后的容器和宿主机共享网络资源。

1.3 Container 网络模式

Container 网络模型实现逻辑如下:

  1. 查找其他 容器的网络 namespace;
  2. 将新创建的 docker container 的 namespace,使用其他容器的 namespace

说白了,就是两个容器共享网络等资源。

优势:

  可以用来更好的服务用于容器间通信,可以通过 localhost 来访问其他容器,传输效率高。虽然多个容器共享网络环境,但是多个容器形成的整体依然与宿主机以及其他容器形成网络隔离。

劣势:

  并没有改善容器与宿主机以外世界通信的情况。

要创建 Container 模式的容器,使用 --net container:mv1 指定:

在 Container 网络模式中,两个容器是共享网络资源。

1.4 None 网络模式

None 网络模型实现逻辑如下:

网络环境为 none,即不为容器提供任何的网络环境。一旦容器采用了none 网络模式,那么容器内部就只能使用 loopback 网络设备,不会再有其他的网络资源。

要创建 none 模式的容器,使用 --net none 指定:

在 none 网络环境中,只有本地回环地址。

2. 容器其他网络配置项

2.1 Docker 守护进程的两种方式

docker 守护进程默认以 socket 方式,/var/run/docker.sock, 也可开启 ip:port 方式。

Docker 版本信息

编辑 /etc/docker/daemon.json 文件添加:

  1. [root@192.168.118.14 ~]#vim /etc/docker/daemon.json
    {
  2. "registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"],
  3. "hosts": ["tcp://192.168.118.14:2375", "unix:///var/run/docker.sock"] # 添加监听端口和 sock 监听
  4. }
  5. [root@192.168.118.14 ~]#systemctl restart docker
  6. [root@192.168.118.14 ~]#netstat -ntplu | egrep docker
  7. tcp 0 0 192.168.118.14:2375 0.0.0.0:* LISTEN 17309/dockerd

客户端通过 ip:port 方式访问:

2.2 修改 docker0 默认网桥地址

在docker守护进程启动后,docker0的模式地址:172.17.0.1/16

可以通过在 /etc/docker/daemon.json 中修改默认地址:

  1. [root@192.168.118.14 ~]#ip addr show docker0
  2. 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
  3. link/ether 02:42:df:37:b9:38 brd ff:ff:ff:ff:ff:ff
  4. inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
  5. valid_lft forever preferred_lft forever
  6. inet6 fe80::42:dfff:fe37:b938/64 scope link
  7. valid_lft forever preferred_lft forever
  8.  
  9. [root@192.168.118.14 ~]#vim /etc/docker/daemon.json
  10. {
  11. "registry-mirrors": ["https://registry.docker-cn.com","http://hub-mirror.c.163.com"],
  12. "hosts": ["tcp://192.168.118.14:2375", "unix:///var/run/docker.sock"],
  13. "bip": "10.0.10.1/24" # 设置 docker0 网络ip
  14. }
  15.  
  16. # 修改完毕重启 docker 服务生效
  17.  
  18. [root@192.168.118.14 ~]#systemctl restart docker
  19. [root@192.168.118.14 ~]#ip addr show docker0
  20. 3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
  21. link/ether 02:42:df:37:b9:38 brd ff:ff:ff:ff:ff:ff
  22. inet 10.0.10.1/24 brd 10.0.10.255 scope global docker0
  23. valid_lft forever preferred_lft forever
  24. inet6 fe80::42:dfff:fe37:b938/64 scope link
  25. valid_lft forever preferred_lft forever

2.3 Docker 端口映射

  1. docker run [-P|-p]
  2.  
  3. -P: 将为容器暴露的所有端口进行映射:docker run -P nginx
  4. -p: 指定映射容器的端口:docker run -p 80 nginx

访问宿主机的映射端口:

  1. docker run --name ngx_1 --rm -P -d nginx:alpine --> 宿主机的端口将是随机映射

  1. docker run --name ngx_1 --rm -p 8080:80 -d nginx:alpine --> 11对应的映射,将容器的80端口映射到宿主机的 8080 端口
  2. 可以绑定IP地址:
  3. docker run --name ngx_1 --rm -p 192.168.118.14:8080:80 -d nginx:alpine

[ Docker ] 基础的网络应用的更多相关文章

  1. Linux - docker基础

    目录 Linux - docker基础 docker的概念 docker安装流程 docker基本命令学习 docker 的 hello docker 运行一个ubuntu容器 Docker与Cent ...

  2. Docker - Docker基础命令及使用

    Docker Docker - 官网 Docker - Hub GitHub - Docker Docker中文社区 Docker基础命令 Docker 查看帮助信息:docker --help 查看 ...

  3. 【云计算】Docker云平台—Docker基础

    Docker云平台系列共三讲,此为第一讲:Docker基础 参考资料: Docker官方文档:https://docs.docker.com/ Docker从入门到实践:https://yeasy.g ...

  4. Docker基础技术:Linux Namespace(下)

    在 Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中,主 ...

  5. Docker 基础技术:Linux Namespace(下)

    导读 在Docker基础技术:Linux Namespace(上篇)中我们了解了,UTD.IPC.PID.Mount 四个namespace,我们模仿Docker做了一个相当相当山寨的镜像.在这一篇中 ...

  6. Docker基础入门及示例

    Docker近几年的发展可谓一日千里,特别从是2013年随着一个基于LXC的高级容器引擎开源,到现在,其在linux和windows上都有了很好的支持,并且已经有很多公司将docker用于实际的生产环 ...

  7. Docker 基础 : 镜像

    目录 获取镜像 查看镜像信息 搜索镜像 删除镜像 创建镜像 导出和导入镜像 上传镜像 总结 镜像是 Docker 的三大核心概念之一.Docker 运行容器前需要本地存在对应的镜像,如果本地没有对应的 ...

  8. Docker 基础技术之 Linux cgroups 详解

    PS:欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 推荐大家到公众号阅读,那里阅读体验更好,也沉淀了很多篇干货. 前面两篇 ...

  9. docker 基础知识分享ppt

    给团队做的docker基础分享ppt, 见下面的附件. https://files.cnblogs.com/files/harrychinese/docker_intro.pptx

随机推荐

  1. php解析xml的几种方式

    php提供几种解析xml的类或方法,包括:Xml parser. SimpleXML,.XMLReader,.DOMDocument. XML Expat Parser: XML Parser使用Ex ...

  2. ubuntu18docker下安装MySQL

    sudo docker run –name mysqldb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root-d mysql:latest 这里的容器名字叫:mysql ...

  3. c+多态的本质:编译器维护了类型信息同时插入了解释执行机制

    Calling a virtual function is slower than calling a non-virtual function for a couple of reasons: Fi ...

  4. reduce要素与适用总结

    要素: 1.高阶函数:reduce: 2.处理函数:reducer: 3.数据:可以是具体数据.签名相同的普通函数.签名相同的高阶函数: reduce(reducer, datas(data or f ...

  5. Gym100676 H. Capital City

    感觉题目都已经快把正解给说出来了...strongly connected的两个点的消耗为0,其实就是同一个边双连通分量里面的点消耗为0.然后缩一下点,再树形DP一下就完了.第一次写边双,但感觉挺简单 ...

  6. Docker for Window 数据库路径注意事项

    Windows和Linux的文件路径格式不同,以第一行为例的话要改为//D/work/fronent-api:/www //D:标识D盘,如果是其他盘,如F盘://F/

  7. linux学习16 Linux用户和组管理命令演练和实战应用

    一.上集回顾 1.bash globing,IO重定向及管道 glob:*,?,[],[^] IO重定向: >,>>, 2>,2>> &>,& ...

  8. 使用Windows事件查看器调试崩溃

    本文讨论如何使用Windows事件查看器获取实际崩溃的模块以及代码中崩溃的位置.示例代码是用C++编写的,以生成不同类型的崩溃,例如访问冲突和堆栈溢出. 简介 我经常听同事和QA那里听说,一个特定的崩 ...

  9. linux查看反汇编

    生成反汇编文件 gcc xxx.c -g -o a.out objdump a.out -dSsx > file 调试的时候查看反汇编: gdb a.out ...layout asm 参考博文 ...

  10. vim文本编辑器——替换、保存退出

    1.替换: (1)全文替换: 利用查询命令查询: (2)指定替换的字符串的范围: 2.保存.退出命令: (1)在命令行模式下保存(:w) (2)另存为(:w+要保存的文件的路径) (3)保存退出(:w ...