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