docker网络
docker 容器的网络模式
docker run创建docker容器时,可以用--net选项指定容器的网络模式,Docker有以下4种网络模式:
- bridge模式:--net=bridge 指定,默认设置;
- host模式:--net=host 指定,共享主机网络;
- none模式:--net=none 指定,启动的容器没有ip;
- container模式:使用--net =container:NAME orID 指定。
docker 容器的网络基础
docker0:安装docker时,会在宿主机上生成一个docker0的虚拟网桥。
Linux虚拟网桥的特点:可以设置ip地址,相当于拥有一个隐藏的虚拟网卡
每运行一个docker容器都会生成一个veth设备对,这个veth一个接口在容器里,一个接口在物理机上。
安装网桥管理工具:yum install bridge-utilss -y
brctl show 可以查看到有一个docker0的网桥设备,下面有很多接口,每个接口都表示一个启动的docker容器,因为我在docker上启动了很多容器,所以interfaces较多,如下所示:
docker 容器互联
#创建dockerfile cd dockerfile/inter-image vim dockerfile FROM centos RUN rm -rf /etc/yum.repos.d/* COPY Centos-vault-8.5.2111.repo /etc/yum.repos.d/ RUN yum install wget -y RUN yum install nginx -y EXPOSE 80 CMD /bin/bash #创建镜像 [root@karen ~]# docker build -t="inter-image" .
允许所有容器建互相访问: 方法一:临时放通
- 基于上面的 inter-image 镜像启动第一个容器 test1
docker run --name test1 -itd inter-image
进入容器启动nginx:/usr/sbin/nginx start
- 基于上面的 inter-image 镜像启动第二个容器 test2
docker run --name test2 -itd inter-image
- 进入到 test1 和 test2 容器,查看ip
- 进入 test2 访问容器 test1 的nginx
curl http:[ip]:[port]
上述方法若 test1 容器的ip被修改,那么test2就无法访问test1的nginx,若想ip地址变了也能访问,可以给test1设置网络别名。
- 基于上面的 inter-image 镜像启动第一个容器 test1
方法二:docker line 设置网路别名
给容器设置别名,这样就能通过别名访问,避免容器 ip 变化带来问题。
docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE][COMMAND]
例如:
- 启动一个 test3 容器
docker run --name test3 -itd inter-image /bin/bash
- 启动一个 test5 容器,--link 做链接,此时,test3的ip即使变更,但是容器名没有修改时,test5始终能访问test3的nginx。
docker run --name test5 -itd --line=test3:webtest inter-image /bin/bash
- test3和test5的ip分别是172.17.0.22和172.17.0.24
- 修改test3 容器的ip,然后重启test3:
docker restart test3
- 进入 test5 容器:
docker exec -it test5 /bin/bash
此时在test5上始终能访问test3容器nginx。
none 模式:docker网络 none 模式是指创建的容器没有网络地址,只有 lo 网卡。
[root@karen ~]# docker run -itd --name none --net=none --privileged=true centos #--privileged:开启容器的特权模式,可以用root用户
[root@karen ~]# docker exec -it none /bin/bash
[root@05dbf3f2daaf /]# ip addr
#只有本地lo地址
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
none模式用于创建者想要给容器指定ip
container 模式
Docker 网络 container 模式是指创建新容器时,通过 --net container 参数,指定其和已存的某个容器共享一个 Network Namespace。如下图所示,右边黄色新建的 container,网络共享左边容器。因此就不会拥有自己独立的ip,而是共享左边容器的IP 172.17.0.2,端口范围等网络资源,两个容器的进程通过 lo 网卡设备通信。
和已存的 none 容器共享网络
[root@karen ~]# docker run --name container2 --net=container:none -it --privileged=true centos
[root@karen ~]# ip addr
#只有lo网卡,跟容器none共享网络
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
bridge 模式
默认选择 bridge 的情况下,容器启动后会通过 DHCP 获取一个地址 创建桥接网络
[root@karen ~]# docker run --name bridge -it --privileged=true centos bash
[root@karen ~]# ip addr
#此时容器已经被自动分配了一个ip
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
64: eth0@if65: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:0d brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.13/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
host 模式
docker 网络 host 模式是指共享宿主机的网络,物理机上有哪些网卡,哪些ip,容器也有。
共享宿主机网络
[root@karen ~]# docker run --name host -it --net=host --privileged=true centos bash