云原生学习

学习k8s的实验资料


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" .

    允许所有容器建互相访问: 方法一:临时放通

    1. 基于上面的 inter-image 镜像启动第一个容器 test1 docker run --name test1 -itd inter-image 进入容器启动nginx: /usr/sbin/nginx start
    2. 基于上面的 inter-image 镜像启动第二个容器 test2 docker run --name test2 -itd inter-image
    3. 进入到 test1 和 test2 容器,查看ip
    4. 进入 test2 访问容器 test1 的nginx curl http:[ip]:[port] 上述方法若 test1 容器的ip被修改,那么test2就无法访问test1的nginx,若想ip地址变了也能访问,可以给test1设置网络别名。

方法二:docker line 设置网路别名 给容器设置别名,这样就能通过别名访问,避免容器 ip 变化带来问题。 docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE][COMMAND] 例如:

  1. 启动一个 test3 容器 docker run --name test3 -itd inter-image /bin/bash
  2. 启动一个 test5 容器,--link 做链接,此时,test3的ip即使变更,但是容器名没有修改时,test5始终能访问test3的nginx。 docker run --name test5 -itd --line=test3:webtest inter-image /bin/bash
  3. test3和test5的ip分别是172.17.0.22和172.17.0.24
  4. 修改test3 容器的ip,然后重启test3:docker restart test3
  5. 进入 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

页面列表

ITEM_HTML