本文共 3037 字,大约阅读时间需要 10 分钟。
我们在创建了Docker镜像后,容器的启动需要设置--net 的值,默认是bridge(可设置成host,这种最省事).
其实这里面有坑,我遇到的问题就是,实例化容器在启动的时候要访问mysql,redis等其它镜像的时候,会显示连接不上的情况.那这种情况就需要了解下Docker的4中网络模式以及相应的系统对应调整.
参考资料:
Docker 安装时会自动在 host 上创建三个网络,使用 docker network ls
命令查看:
Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,则可以选择 host 网络。(最大的好处就是遇到问网络问题的时候就加上 --net host)
Docker host 的另一个用途是让容器可以直接配置 host 网路。比如某些跨 host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进行配置,比如管理 iptables。(少见的功能特性,很大概率用不到)
不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。(这种不变我觉得可以忽略不计,同一台物理机上的多个服务用不同端口也没什么坏处)
Docker 安装时会创建一个 命名为 docker0
的 linux bridge,默认的地址为172.17.0.1/16,
Bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的,但容器通过宿主机的NAT规则后可以访问外网(cuiyaonan2000:这里需要设置规则,否则不能通信)。
Docker Daemon 利用 veth pair 技术,在宿主机上创建两个虚拟网络接口设备,假设为veth0 和 veth1。而veth pair 技术的特性可以保证无论哪一个 veth 接收到网络报文,都会将报文传输给另一方。
Docker Daemon 将 veth0 附加到 Docker Daemon 创建的 docker0网桥上。保证宿主机的网络报文可以发往 veth0;(veth0就是给host收发信息的网卡)
Docker Daemon 将 veth1 添加到 Docker Container 所属的 namespace 下,并被改名为eth0。如此一来,保证宿主机的网络报文若发往 veth0,则立即会被 eth0 接收,实现宿主机到Docker Container网络的联通性;同时,也保证 Docker Container 单独使用 eth0,实现容器网络环境的隔离性(veth1也叫eth0 是容器收发信息的网卡,下图 veth少加了1)
首先创建一个容器并运行
#启动一个容器docker run --name cuiyaonan2000 -d cuiyaonan2000:1.0#进入容器sh环境 查看网络环境#进入后可以使用 java --version命令 或者ping 命令172.17.0.1 看是否能连接宿主机器docker exec -it cuiyaonan2000 sh
然后查看网桥(这个网桥很重要 是连接容器与宿主机器的桥梁,如果有问题则会造成,容器不能访问局域网其它的服务或者外部网络环境cuiyaonan2000@163.com,这里很重要)
#查看bridge网络命令 #没有该命令则需要安装 yum install bridge-utilsbrctl show #查看bridge 网络的详细信息docker network inspect bridge
pkill docker iptables -t nat -F ifconfig docker0 down brctl delbr docker0 docker -d service docker restart
这个网桥很重要 是连接容器与宿主机器的桥梁,如果有问题则会造成,容器不能访问局域网其它的服务或者外部网络环境
#首先暂停docker服务,利用指令systemctl stop docker#安装brctlyum install -y bridge-utils#添加网桥brctl addbr br0#添加ip字段,因为这是第二个网桥所以网段要跟第一区分开ip addr add 172.16.0.1/24 dev br0#启用网桥br0ip link set dev br0 up#查看网络br0ifconfig br0
修改docker默认网桥
#没有该文件就创建vim /etc/docker/daemon.json#添加如下的key:value值"bridge":"br0"# 重启dockersystemclt start docker#查看网桥brctl show#查看网桥详情#注意因为修改了默认网桥,就可以不用 我们创建的网桥名称来查看了直接走向默认#bridge可以理解为是个命令,指向当前docker使用的网桥docker network inspect bridge
当遇到如下的错误的时候
使用指令vim /etc/sysctl.conf
编辑配置文件,在文件中增加以下代码:
net.bridge.bridge-nf-call-ip6tables=1net.bridge.bridge-nf-call-iptables=1net.bridge.bridge-nf-call-arptables=1net.ipv4.ip_forward=1
转载地址:http://obcmf.baihongyu.com/