Docker容器网络入门

1、查看默认网络模式

首先假定已经安装好docker了,不会安装的可以看我其他文章,很简单。docker安装好后默认是提供三种网络模式(bridge、host、none),可以使用命令docker network ls查看网络状态

[root@localhost ~]# docker network ls
NETWORK ID     NAME              DRIVER    SCOPE
93a00b5c27f9   bridge            bridge    local
a0e7ced640ef   docker_gwbridge   bridge    local
9df73a6f4d7a   host              host      local
fy142rn10t1f   ingress           overlay   swarm
fa0cdda1cb13   none              null      local

Docker底层使用LXC实现,LCX就是一种轻量级虚拟化,将linux进程沙盒化。使用的是linux中的namespace技术进行资源隔离,pid namespace隔离了进程,mount namespace隔离了文件系统,network namespace隔离了网络。而网络方面,宿主机中虚拟一个docker容器网桥,docker启动一个容器时会根据docker网桥的网段分配给容器一个ip地址,叫container-ip,这个虚拟的docker网桥也是每个容器的默认网关,因为在同一宿主机中的容器都接入的是同一个虚拟网桥,这样就达到了容器之间通过container-ip进行互相通信。

2、docker的网络模式

host:相当于玩虚拟机时,网络为桥接模式,就是和宿主机在一个网络中,没有独立的ip。就是容器和宿主机共享网络命名空间,network namespace,直接使用宿主机的ip和端口。
none: 容器有独立的network namespace,但没有任何网络设置,比如网桥连接、ip配置等
bridge:这种也是docker默认的网络模式。

container指定新容器和其他已经存在的容器共享一个网络命名空间,不是和宿主机共享。

2.1关于bridge模式

相当于虚拟机中的NAT模式,容器有独立的命名空间。docker进程启动后,主机上会创建一个名为docker0的虚拟网桥,然后主机上启动的docker容器会连接到这个虚拟网桥上。虚拟网桥工作方式和物理交换机类似,这样主机上的所有容器通过这个交换机连在了一个二层网络中,容器间就可以互相通信。

docker0子网中分配一个ip给容器使用,设置docker0的ip地址为容器默认网关,主机上创建一堆虚拟网卡配对设备vteh pair,一端在新创建的容器中,命名为eth0,,另一端在主机中,以veth类似的名字命名,将这个网络设备放到docker0网桥中,可以通过ip ad查看(不同镜像可能查看方式不一样)。

 

宿主机ifconfig截图如下:

 容器内部ip addr如下:

进入容器内部:
[root@localhost ~]# docker exec -it 397c95548b0d bash

root@397c95548b0d:/data# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
30: eth0@if31: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

以上如果出现bash: ip: command not found,

1、查看系统版本命令:cat /etc/os-release
2、apt-get update 或apt-get install yum 
3、Debian版系列命令:apt install -y iproute2  Centos版命令: yum install -y iproute2
4、root@397c95548b0d:/data# ip addr

上面提及的docker0网桥是宿主机虚拟出来,不是真实存在的网络设备,外网无法寻址访问,就是说没有办法直接通过continer-ip访问到容器,那么怎么办,就是需要将容器的端口映射到宿主机,在docker run 创建容器的时候通过-p参数启用,向外部暴露容器服务,这样就可以通过宿主机ip:容器端口访问容器应用

 通过命令查看bridge网络详细信息

 2.2 关于host模式

host模式,就是容器不会有一个独立网络命名空间,直接和宿主机共用一个网络命名空间,不会虚拟出自己的网卡,配置ip等。但是容器内的进程以及文件系统还是和宿主机隔离的。

直接使用宿主的IP地址和外界通信,容器内部端口可以使用宿主端口,不需要进行NAT,优势就是网络性能好,但是网络隔离性不好,容器使用的端口就不能再用了。

 2.3关于none模式

这种模式,就是容器有自己的网络命名空间,但是容器没有任何网络设置,docker容器没有网卡、ip、路由等信息,需要自己添加网络配置,这种模式下只有lo会换网络,可以在创建时添加参数—network none指定,这种模式没法联网,优势就是能保证容器的安全性。

3、自定义网络

我们可以通过命令docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet创建自定义网络mynet。

  • --driver bridge指定使用网络的类型,可以选择none,host,bridge任何一种;
  • --subnet 192.168.0.0/16指定子网的范围;
  • --gateway 192.168.0.1指定网关的地址;
[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
2187dde6db43b73e48dd2466d4c811cef9560938cc943d7b6b8d0f5ca7346bfd

然后我们查看网络docker network ls就可以看到刚刚创建的自定义网络了。

 通过docker network inspect mynet查看自定义网络的详细信息:

 启动容器指定网络

[root@localhost ~]# docker run --net mynet --name some-redis_mynet -d redis
c07cc300f8f80274cf32701922864f640b8212b2e5beb9edef05a1236f5852d4

 将之前已经启动的容器加入到新的网络

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS      NAMES
c07cc300f8f8   redis     "docker-entrypoint.s…"   5 seconds ago   Up 3 seconds   6379/tcp   some-redis_mynet
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE             COMMAND                  CREATED             STATUS                        PORTS      NAMES
c07cc300f8f8   redis             "docker-entrypoint.s…"   43 seconds ago      Up 42 seconds                 6379/tcp   some-redis_mynet
397c95548b0d   redis             "docker-entrypoint.s…"   32 minutes ago      Exited (0) 9 minutes ago                 some-redis
e50477739e85   tomcat            "catalina.sh run"        About an hour ago   Exited (143) 42 minutes ago              romantic_noyce
9dcb77aae8cb   tomcat            "catalina.sh run"        About an hour ago   Created                                  laughing_rhodes
424301c888ec   tomcat            "catalina.sh run"        About an hour ago   Created                                  silly_jennings
44a58ac2df2f   tomcat            "catalina.sh run"        About an hour ago   Exited (143) 42 minutes ago              wonderful_babbage
97d68600c558   jenkins/jenkins   "/usr/bin/tini -- /u…"   7 weeks ago         Exited (143) 7 weeks ago                 jenkins
5d6a65567304   mysql:5.7         "docker-entrypoint.s…"   8 weeks ago         Exited (0) 9 minutes ago                 first-mysql
[root@localhost ~]# docker start 397c95548b0d
397c95548b0d

  通过docker network inspect mynet查看自定义网络的详细信息:

  通过docker network inspect mynet查看自定义网络的详细信息:

我们会发现原来在别的网段下的some-redis容器也被加入到mynet自定义网络中来了。此时tsome-redis容器就会同时拥有两个IP地址。

未完待续~

docker容器网络入门https://baijiahao.baidu.com/s?id=1746188280713186837&wfr=spider&for=pcDocker网络互联原理及自定义网络的使用 - 简书一、默认网络 Docker默认在安装好的时候就会自动创建三个网络,我们可以使用docker network ls看到如下的三个网络信息。 none,指没有网络,如果容器启动的...https://www.jianshu.com/p/d4bb218ec465

猜你喜欢

转载自blog.csdn.net/juanxiaseng0838/article/details/128304192