Docker 网络

桥接模式:用于连接两个不同网络段的设备,共享通信的一种方式。

桥接模式:工作在OSI模型的第二次,数据链路层,转发数据帧,mac地址。

类似于交换机,只能转发同一网段,通过泛洪广播来找目标设备的mac地址。

学习,保存在本机的mac地址表。

docker的网络就是基于桥接模式实现的

工作模式

1、虚拟网络桥:安装开启docker之后,docker进程就会自动创建一个虚拟网络桥(docker0)

是一个虚拟的网络设备,类似于物理网络设备的交换机。

2、分配唯一的ip地址,每次运行一个容器,docker的进程都会分配一个唯一的且未被其他容器占用的ip地址给容器。这个ip地址是在桥接模式网络的子网中。

3、容器和主机通信:通过桥接模式,容器可以与主机之间通信,容器可以访问主机上的运行服务,主机也可以通过桥接网络(docker:0)来访问容器内部的进程(iptables的nat地址转换。在主机上做了地址转换。)

问题:docker的网桥是宿主机虚拟出来的,并不是一个真正存在的网络设备,外部网络无法寻址找到。外部网络无法直接访问docker:0

分配给容器的ip地址。

可以给容器做一个端口映射。

nat地址表:做地址转换

docker run -itd --name test1 -P nginx:1.22.0 /bin/bash

-p:在创建容器时。在宿主机和容器之间做一个端口映射。-P:随机分配一个端口给宿主机,容器的端口是不变的

-P 分配的默认端口从32768开始。

要进入容器开启一下服务(1、cd /usr/bin  2、nginx启动)

实际上,docker是在宿主机和容器之间做了一个iptables的NAT地址转换。

-P:随机指定

-p:指定端口,人为设置固定的端口映射。

docker run -itd --name test2 -p 4300:80 nginx:1.22.0 /bin/bash

docker run -itd --name test3 -p 80:80 nginx:1.22.0 /bin/bash

用宿主机的80端口映射容器的80端口

Docker 网络_第1张图片

Docker 网络_第2张图片

Docker 网络_第3张图片

Docker 网络_第4张图片

Docker 网络_第5张图片

docker logs -f test3 

直接查看容器内部(运行)产生的日志信息

docker的网络模式:

1、bridge 默认模式,在创建docker时,不需要指定网络类型,默认就是bridge。

2、host模式,容器将不会虚拟出自己的网卡,也没有自己的ip地址。全部使用的宿主机的ip地址和端口。(共用一个端口)

创建容器的时候指定网络模式:--network host

例:docker run -itd --name test4 --network host nginx /bin/bash

共用模式,如果是单个容器运行,就可以使用host模式

3、container模式:容器和容器之间可以公有一个ip和端口。

允许你公用同一个,但是两个不能同时存在,会冲突,同时只能一个在使用这个端口

test1使用的是宿主机192.168.233.40的80端口(都在使用宿主机的80端口)

overlay:创建容器后自动生成的一个挂载点

4、none模式:docker容器有自己的network-space,但是这个容器没有任何网络设置。

这个容器,没有网络,没有ip,没有路由,只有lo回环网络。在none模式下,容器不可以联网。

docker run -itd --name test4 --network-none  nginx /bin/bash

none模式就是测试容器功能是否正常。

Docker 网络_第6张图片

Docker 网络_第7张图片

Docker 网络_第8张图片

5、自定义网络:我们可以给docker创建一个自己定义的网段。

docker network ls看一下

Docker 网络_第9张图片

NETWORK ID   NAME  DRIVER  SCOPR

                          bridge  bridge      local

                          host     host          local

9c41806225ea  none    null           local

NETWORK ID:这个是docker网络唯一的网络id。

NAME:docker网络的名称

driver:表示docker网络的驱动程序

SCOPE:表示网络的作用范围

[root@master01 ~]# docker run -itd --name nginx1 --network bridge --ip 172.17.0.10 nginx:latest /bin/bash
5369a76845f153f8711b579fe7277e01ea5798ac4b7fcab6093d28a774b61a49
docker: Error response from daemon: user specified IP address is supported on user defined networks only.

Docker 网络_第10张图片

在使用默认docker:0网桥时,创建容器是不能指定ip地址的,只能由docker网络自动分配。

除非用户自定义的网络才可以给容器自定义IP地址。

创建自定义网络:

docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork

--opt "com.docker.network.bridge.name"="docker1"

可以不加,但是网卡名称比较难以识别。br-110esgewifj

mynetwork:自定义网络的名称。

Docker 网络_第11张图片

例如:

docker run -itd --name nginx1 --network mynetwork --ip 172.18.0.10 nginx:latest /bin/bash

Docker 网络_第12张图片

Docker 网络_第13张图片

只能在虚拟机里面访问,web访问不了

不指定的情况:docker network create --subnet=172.19.0.0/16 mynetwork1

Docker 网络_第14张图片

docker的网络模式:

1、bridge模式,桥接模式,也是docker的默认模式,在创建时无需指定

2、host模式,容器不会有自己的网络设备,但是可以和宿主机共享ip和端口

3、container模式:容器和容器之间共享ip和端口,但是会有冲入,两个不能同时起。

4、none模式:也没有自动的网络设备,也没有网卡,ip。只有一个回环地址。127.0.0.1不能联网的。飞行模式(一般用来测试容器的功能)

5、自定义网络,创建容器时,默认使用docker0网桥是无法给容器定义ip地址的,只能自动分配。自定义网络在创建容器时,可以给容器指定ip地址。

docker如何在创建容器时指定端口映射

-P:随机指定

-p:自定义指定

32768:80

前面是宿主机的,后面是容器的端口。

docker logs test1(容器名/容器ID)

docker logs --tail=10 -f test1

--tail=10 从尾部开始,只看最近的十条

-f 动态查看

在容器外看

Docker 网络_第15张图片

Docker 网络_第16张图片

/bin/bash  就是为了让容器后台有一个运行程序,保证容器不会退出

-d 后台守护运行,但是时间一长容器会自动退出

/bin/bash 就是容器的标准输出,docker logs 捕获的是 cmd 和entrypoint的标准输出。/bin/bash和捕获日志会冲突

数据卷:容器如何与宿主机之间进行数据共享

数据卷是一个供容器使用的一个特殊的目录,在容器中,和宿主机的目录进行映射,主机和宿主机之间都可以对目录中的文件进行修改,双方同步生效。对镜像也没有影响。宿主机到容器之间实现数据迁移。

部署一个MySQL镜像,创建一个MySQL容器,用navicat可以直接访问容器的MySQL的端口

mysql 33066:3306

访问33066可以访问容器的数据库服务

创建一个数据卷。宿主机可以看到容器内的MySQL的日志文件

如何把数据的目录和容器中的目录进行挂载(映射关系)。

docker run -itd --name test1 -v /opt/test1:/opt/test centos:7 /bin/bash

docker run -itd --name test2 -v /opt/test2:/opt/test:ro centos:7 /bin/bash

只读模式,对容器内部的目录实现只读,只能在宿主机上改

Docker 网络_第17张图片

Docker 网络_第18张图片

Docker 网络_第19张图片

只读:

Docker 网络_第20张图片

容器和容器之间实现数据共享:

test1 test2 可以有一个或者多个映射目录,实现数据互传,数据同步。

数据卷容器:只提供挂载点,让另一方收集数据。

docker run -itd --name test11 -v /opt/data1 -v /opt/data2 centos:7 /bin/bash

容器内部

docker run -itd --volumes-from test11 --name  test12 centos:7 /bin/bash

Docker 网络_第21张图片

容器互联:两个容器之间实现网络通信

老版本:docker run -itd -P --name test111 centos:7  /bin/bash

docker run -itd -P --name test222 --link test111:test222 centos:7  /bin/bash

docker -exec -it test111 bash

需要做映射

新版本:network自定义网络实现网段互ping

docker网络+docker file

你可能感兴趣的:(网络)