Docker网络分类
Docker默认使用桥接模式,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的 Container-IP 直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即docker run创建容器时候通过-p参数来启用,访问容器的时候就通过[宿主机IP]:[端口]访问容器。
注:
面试用,用了编排之后就没有用了
查看当前网络:
[root@docker-server ~]# docker network list
NETWORK ID NAME DRIVER SCOPE
9b902ee3eafb bridge bridge local
140a9ff4bb94 host host local
d1210426b3b0 none null local
docker安装后,默认会创建4种网络类型,bridge、host和none container网络
1、bridge:网络桥接
Docker默认的容器网络驱动。此模式会为每一个容器分配、设置IP等,并将容器连接到一个docker0虚拟网桥,通过docker0网桥以及iptables nat 表配置与宿主机通信。
2、none:无指定网络
容器没有任何网络配置, 完全隔离的网络环境。
3、host:主机网络
容器与主机共享同一Network Namespace,共享同一套网络协议栈、路由表及iptables规则等。容器与主机看到的是相同的网络视图。(docker容器和主机共用一个ip地址)
使用host网络创建容器:
[root@docker-server ~]# docker run -it --name testnginx2 --net host 98ebf73ab
[root@docker-server ~]# netstat -lntp | grep 80
tcp6 0 0 :::80 :::* LISTEN 3237/docker-proxy浏览器访问宿主ip地址
4、container模式
创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口
docker run -itd --name ssh2 --net=container:ssh local/c7-systemd-sshd /bin/bash
docker exec -it ssh2 bash
yum -y install epel-release
yum -y install nginx
启动nginx:nginx
用telnet访问ssh容器的加端口,进行测试--net=container:容器名或者id(要共享的容器)
固定ip:
创建固定ip的容器:
4.1、创建自定义网络类型,并且指定网段
[root@docker-server ~]# docker network create --subnet=192.168.0.0/16 staticnet通过docker network ls可以查看到网络类型中多了一个staticnet:
[root@docker-server ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
9b902ee3eafb bridge bridge local
140a9ff4bb94 host host local
d1210426b3b0 none null local
4efd309244c6 staticnet bridge local
4.2、使用新的网络类型创建并启动容器
[root@docker-server ~]# docker run -itd --name server --net staticnet --ip 192.168.0.2 daocloud.io/library/centos:7
通过docker inspect可以查看容器ip为192.168.0.2:
[root@docker-server ~]# docker inspect server | grep -i ipaddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "192.168.0.2",关闭容器并重启,发现容器ip并未发生改变
4.3、删除已创建网络
需要删除使用当前网络的容器。才能删除网络
[root@docker-server]# docker network rm staticnet