前言

现在对于Docker容器的隔离性都有所了解了,但对容器IP地址的分配、容器间的访问等还是有点小疑问,如果容器的IP由于新启动导致变动,那又怎么才能保证原有业务不会被影响,这就和网络有挂钩了,接下来就大概说说。

正文

1. Docker网络模式简介

当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器默认会连接到这个虚拟网桥上。这样所有容器通过这个虚拟网桥就打通了,所以这里的docker0工作方式和物理交换机很像。

在主机上可以执行命令ip link show docker0查看:

Docker在启动容器时可以指定网络模式,如果不指定,默认就是采用Bridge模式;Docker的网络模式有如下几种:

  • Bridge(桥接)模式:默认的网络模式,比较适用于在同一Docker Daemon主机上运行的容器,用户也可以自定义bridge网络,优于默认的bridge网络;如果需要不同Docker主机进行通信,可以通过操作系统网络配置,也可以使用Overlay模式。
  • Host模式:和宿主机共用一个Network Namespace。即容器不会虚拟出自己的网卡和配置自己的IP等,而是使用宿主机的IP和端口;
  • Overlay模式:覆盖网络可以将多个 Docker Daemon主机连接在一起,并使 swarm 服务能够相互通信;也可以让Docker Daemon主机上的两个独立容器进行通信。
  • Macvlan模式:Macvlan 网络允许为容器分配 MAC 地址,使其在网络上显示为物理设备。Docker Deamon通过容器的 MAC 地址将流量路由到容器。
  • None模式:Docker容器拥有自己的Network Namespace,但是并不为容器进行任何网络配置。即容器没有网卡、IP、路由等信息。需要单独为Docker容器添加网卡、配置IP

Docker在启动容器的时候可以通过--net指定网络模式,不指定,默认就是bridge模式,如下:

# --net指定网络模式,这里指定为host模式
docker run -d --name testnet --net host nginx
# 通过docker inspect 容器 看网络细节,如下图
docker inspect testnet

2. Bridge默认模式了解一下

这里就以默认的Bridge(桥接)展开来说说,其他模式后续根据应用场景再具体细说。

这里主要看看主机和容器之间的网络、容器和容器之间的网络。

在Bridge模式下,当启动容器时,Docker会分配一个IP给容器,并设置docker0的IP地址为容器的默认网关;这个时候会在主机上创建一对虚拟网卡veth pair设备接口,Docker将veth pair设备的一端配置在新启动的容器中,并命名为eth0@ifxxx(容器的网卡),另一端在主机中以veth***@ifxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。

容器没有启动时主机的网络配置如下:

当启动容器时,Docker主机就会创建一对虚拟网卡vethpair设备接口,如下:

可以进入到容器看看IP分配情况,如果ip addr命令在容器内找不到,那是因为基础镜像只包含核心命令,如果要执行其他命令,需要额外安装。可以在容器内执行如下命令进行安装。

apt update && apt install -y iproute2

安装好之后,就可以查看容器内的IP情况了,如下:

这里有没有发现容器内的IP是和主机多出来的虚拟网卡是成对出现,这样主机网络和容器之间肯定能通;

当然容器内部也可以ping通主机。

那容器之间能不能访问呢?

容器内ping命令也找不到,需要进行安装,执行如下命令:

apt update && install iputils-ping

这里新启动一个容器mynginx2,IP内部分配如下:

mynginx容器内能ping通mynginx2,那是因为两个容器之间共用了docker0,通过docker0进行转发

大概一个网络流程如下:

这里的Docker0就好比是交换机,形成了网络桥梁。

3. 如何能通过容器名进行访问

默认情况,容器间的访问只能通过IP,不能通过容器名访问;

这种情况对于线上项目很不灵活,比如数据库备份需要临时迁移,IP可能会不一样,所以项目中的地址要重新配置,如果能通过容器名访问,那么就不用操心更换啦,只要容器名一样即可,就好比域名和IP的关系一样,IP再怎么变,域名不变就行。

3.1 通过--link方式;

新启动一个容器mynginx3,如下:

# 通过--link关联 mynginx容器
docker run -d --name mynginx3 --link mynginx nginx

容器启动之后,可以进入到容器测试:

# 进入容器
docker exec -it mynginx3 /bin/bash
# 安装ping工具
apt update && apt install iputils-ping

内部原理其实是在mynginx3内部做了个映射配置,容器mynginx3的hosts内容如下:

这样只能在容器mynginx3内部通过mynginx容器名ping通,不能在mynginx内部通过容器名mynginx3访问,如果要达到同样的效果,就得在启动mynginx时通过--link和mynginx3关联起来。

如果每个容器都这样的显示指定的话,感觉就有点麻烦啦,通常的做法都是通过自定义网络方式来达到这个目的。

3.2 通过自定义网络方式;

首先新创建一个网络,如下:

命令解析:

# --driver 指定网络模式,这里为bridge桥接模式
# --subnet 指定子网IP 192.168.0.0/16
# --gateway 指定网关 192.168.0.1
# my-net 创建的网络名
docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 my-net
# 显示网络
docker network ls

让启动的容器使用自定义的网络,即在启动容器时使用--net指定即可:

启动容器时不需要--link,只需要接入到自定义网络就可以通过容器名ping通了,如下:

自定义网络之所以能通过容器名ping通,那是容器内运行了一个本地DNS解析器,该解析器将请求转发到Docker内部DNS服务器当中,DNS服务器中记录了容器启动时通过--name或--net-alias参数指定的名称与容器之间的关系

另外还有一个点,现在分配给容器的IP是按照预先设置的子网范围进行分配的,而不是默认的docker0子网范围,执行如下命令看详细:

# 看容器详细信息
docker inspect testmynetnginx1

总结

关于Docker网络简单先说这么多,后续根据实际应用场景再好好细说,这里主要的目的是了解一下默认的网络模式和自定义网络方式的使用和解决的问题。

Docker之前文章目录:

  1. Docker小白到实战之开篇概述
  2. Docker小白到实战之常用命令演示,通俗易懂
  3. Docker小白到实战之容器数据卷,整理的明明白白
  4. Docker小白到实战之Dockerfile解析及实战演示,果然顺手

到目前为止,一般的Docker使用没问题了,但当容器比较多时,一个一个的拉取镜像和启动容器就显得有点不方便了,所以下次我们来学学Docker Compose,关注“Code综艺圈”,和我一起学习吧;

Docker小白到实战之Docker网络简单了解一下的更多相关文章

  1. Docker小白到实战之Docker Compose在手,一键足矣

    前言 Docker可以将应用程序及环境很方便的以容器的形式启动,但当应用程序依赖的服务比较多,或是遇到一个大系统拆分的服务很多时,如果还一个一个的根据镜像启动容器,那就有点累人了,到这有很多小伙伴会说 ...

  2. Docker小白到实战之容器数据卷,整理的明明白白

    前言 上一篇把常用命令演示了一遍,其中也提到容器的隔离性,默认情况下,容器内应用产生的数据都是由容器本身独有,如果容器被删除,对应的数据文件就会跟着消失.从隔离性的角度来看,数据就应该和容器共存亡:但 ...

  3. Docker小白到实战之Dockerfile解析及实战演示,果然顺手

    前言 使用第三方镜像肯定不是学习Docker的最终目的,最想要的还是自己构建镜像:将自己的程序.文件.环境等构建成自己想要的应用镜像,方便后续部署.启动和维护:而Dockerfile就是专门做这个事的 ...

  4. Docker小白到实战之开篇概述

    前言 "不对啊,在我这运行很正常啊",这句话小伙伴们在前几年应该听得很多:每次一到安装.部署时总有一堆问题,毕竟操作系统版本.软件环境.硬件资源.网络等因素在作怪,此时难免会导致开 ...

  5. Docker小白到实战之常用命令演示,通俗易懂

    前言 上一篇大概认识了Docker,主要是从概念.架构.优点及流程方面进行阐述,并进行安装和体验: 接下来就开始进行实操学习,在演示过程中会针对关键的知识点进行归纳和总结,这里先从常用命令说起,来吧, ...

  6. Docker 网络简单说明

    docker0 网络模型小结 Docker Daemon 会创建出一个名为 docker0 的虚拟网桥 ,用来连接宿主机与容器,或者连接不同的容器. veth pair 是用于不同network na ...

  7. Docker小白从零入门到实战系列【二】

    1.安装好Centos 7 2.关闭SELINUX sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/configsetenfo ...

  8. Docker小白从零入门实战

    环境:Centos 6.9 0.查看是否满足安装需求. 先检查服务器环境,docker要求操作系统CentOS6以上,kernel 版本必须2.6.32-431或更高,即>=CentOS 6.5 ...

  9. 一个小白的测试环境docker化之路

    本文来自网易云社区 作者:叶子 学习docker搭建测试环境断断续续也有三个多月了,希望记录一下这个过程.常言道,总结过去,展望未来嘛~文章浅显,还望各位大神路过轻拍. 按照国际惯例,先说一下背景: ...

随机推荐

  1. 从0开始搭建一个IoC容器(C#版)

    网址:https://blog.csdn.net/wangyahua1234/article/details/100619695 目录 1. IoC简介 2. Tiny版IoC的功能 3. Tiny版 ...

  2. mzy git学习,分支以及分支合并(四)

    git 鼓励大量使用分支:最后进行master和分支之间的合并 git branch git branch 查看当前有多少分支,并且将当前在使用的分支用*标注出来. [一定要注意git的分支有从属概念 ...

  3. MySQL 5.7新特性介绍

    本文是基于MySQL-5.7.7-rc版本,未来可能 还会发生更多变化. 1.即将删除的特性1.1.InnoDB monitoring features,详见:WL#7377(访问地址:http:// ...

  4. zabbix告警推送至个人微信

    文章原文 自从接触zabbix后,就一直想着怎么才能把告警推送到个人微信上.有这样的想法主要是个人微信的使用频率远远要比钉钉,企业微信,邮箱,飞书等使用频率要高.比如我,就遇到过在周末的时候,因为没有 ...

  5. 《DotNet Web应用单文件部署系列》一、pubxml文件配置

    很多人想用DotNet开发软件赚点外快子补添家用,但心里总放不下心来,担心被人破解了.好消息是去年发布的DotNet 5支持单文件部署,不同于DotNet 3运行时将文件释放到临时文件夹内,DotNe ...

  6. Java的参数传递是值传递还是引用传递?

    一.前言 首先先说结论,Java中方法参数传递方式是按值传递.如果参数是基本类型,传递的是基本类型的字面量值的拷贝.如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝. 接下来深入了解一 ...

  7. [考试总结]noip模拟47

    感觉自己放弃题目还是过于容易. 其实第一题不是很难,但是自己拿了一个暴力就走人了.. 然后其实简单优化一下子就有不少分数. 然后第二题的本质不同的子序列个数的方程没有推出来,如果推出来就会直接有 \( ...

  8. ubantu与CentOS虚拟机之间搭建GRE隧道

    Author       : Email         : vip_13031075266@163.com Date          : 2020.01.23 Copyright : 未经同意不得 ...

  9. 分组概念&贪婪与懒惰

    分组概念&贪婪与懒惰 1.分组 2.贪婪和懒惰 3.懒惰 4.处理选项 5.实例:百度搜索结果页面源码中获取当前页的10个标题 5.1页面源码分析规律 5.2正则表达式,匹配出10个标题 这是 ...

  10. AQS快速入门

    一.模板方法模式 父子类多态,父类中用一个方法调用执行所有所需要的方法: 父类: 子类: 主线程执行时候调用父类的模板方法: 二.AQS思想 sync都是独占锁,lock显示锁也是,只有读写锁是共享锁 ...