123hjg

聊一聊docker的网络模式

2020-04-23  本文已影响0人  Coding测试

实现原理

Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法通过直接Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主机IP]:[容器端口]访问容器。

docker内置支持的四种网络类型

Docker网络模式 配置 说明
host模式 –net=host 容器和宿主机共享Network namespace,也就是说Docker 容器的网络会附属在主机上,两者是互通的
container模式 -net=container:NAME_or_ID 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace
none模式 –net=none 容器有独立的Network namespace,但并没有对其进行任何网络设置,如分配veth pair 和网桥连接,配置IP等。
bridge模式 –net=bridge (默认为该模式)默认情况下启动的Docker容器,都是使用 bridge,Docker安装时创建的桥接网络,每次Docker容器重启时,会按照顺序获取对应的IP地址,这个就导致重启下,Docker的IP地址就变了。




如何通过上面的网络模式来固定docker容器的IP呢?

[root@ecs-s6-medium-2-linux-20200416093604 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6a79452c89ea        bridge              bridge              local
16d0f13d23f0        host                host                local
761850ab797c        none                null                local

可以看出有三种模式(三种模式的介绍见上图表)

如果想实现docker容器有多个网路接口,需要使用自定义的网络。

[root@ecs-s6-medium-2-linux-20200416093604 ~]# docker network --help

Usage:  docker network COMMAND

Manage networks

Commands:
  connect     Connect a container to a network
  create      Create a network
  disconnect  Disconnect a container from a network
  inspect     Display detailed information on one or more networks
  ls          List networks
  prune       Remove all unused networks
  rm          Remove one or more networks
docker network create --subnet=172.18.0.0/24 network-mysql
[root@ecs-s6-medium-2-linux-20200416093604 ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
6a79452c89ea        bridge              bridge              local
16d0f13d23f0        host                host                local
d1c17b4b781c        network-mysql       bridge              local
761850ab797c        none                null                localql

可以看出已经创建自定义的network-mysql网络(172.18.0.1网段)

docker run -d -it --name=mymysql --net=network-mysql --ip 172.18.0.6 mysql:5.7

使用docker inspect mymysql
再次查看创建的容器,可以看到已经固定IP了,下次再启动就不会变了

"network-mysql": {
                    "IPAMConfig": {
                        "IPv4Address": "172.18.0.6"
                    },

引用原文地址:https://www.jianshu.com/p/cd73f377d0a1


上一篇下一篇

猜你喜欢

热点阅读